Behaviour of DefWindowProc WinApi



有人能解释为什么使用DefWindowProc一切正常,但如果我删除它,屏幕上会出现字符串"Hello windows",而没有窗口和任何按钮吗?"UpdateWindow"向窗口程序发送WM_PAINT消息,那么为什么显示文本而跳过窗口的创建呢?

#include <windows.h>
LRESULT CALLBACK proc1 (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("Program");
HWND hwnd1;
MSG msg1;
WNDCLASS wndclass1;
wndclass1.style = CS_HREDRAW | CS_VREDRAW;
wndclass1.lpfnWndProc = proc1;
wndclass1.cbClsExtra = 0;
wndclass1.cbWndExtra = 0;
wndclass1.hInstance = hInstance;
wndclass1.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass1.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass1.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclass1.lpszMenuName = NULL;
wndclass1.lpszClassName = szAppName;
RegisterClass (&wndclass1);
hwnd1 = CreateWindow (  szAppName,
                        TEXT ("My window"),
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        NULL,
                        NULL,
                        hInstance,
                        NULL );
ShowWindow (hwnd1, iCmdShow);
UpdateWindow (hwnd1);
while ( GetMessage(&msg1, NULL, 0, 0) )
{
    TranslateMessage(&msg1);
    DispatchMessage(&msg1);
};
return msg1.wParam;
};
LRESULT CALLBACK proc1 (HWND hwnd1, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
 switch (message)
 {
 case WM_CREATE:
    return 0 ;
 case WM_PAINT:
    hdc = BeginPaint (hwnd1, &ps) ;
    GetClientRect (hwnd1, &rect) ;
    DrawText (hdc, TEXT ("Hello windows"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    EndPaint (hwnd1, &ps) ;
    return 0 ;
 case WM_DESTROY:
    PostQuitMessage (0) ;
    return 0 ;
};
 return DefWindowProc (hwnd1, message, wParam, lParam) ;
}

如果省略DefWindowProc,则表示"对于我上面没有处理的所有消息,什么都不做。"这意味着很多像"Please draw the buttons"这样的消息都被处理为"什么都不干"。结果:没有按钮。将所有未处理的消息传递给DefWindowProc。

并非所有窗口消息都需要处理。但是,如果删除DefWindowProc()调用,则应该处理的某些消息将不会得到处理。类似于绘制窗口框架的WM_NCPAINT。以及绘制窗口背景的WM_ERASEBKGND。DefWindowProc()知道这些事情做得很好,这在很大程度上得益于您为窗口创建的WNDCLASS和您在CreateWindowEx()调用中传递的窗口样式标志。

所以可以肯定的是,去掉这个调用,你不会看到一个框架或背景。还有很多其他的事情,一个窗口知道在没有你的帮助的情况下该怎么做。DefWindowProc()实现了窗口的默认行为。您的窗口过程为其提供了非默认行为。

相关内容

  • 没有找到相关文章

最新更新