lys*_*gic 2 windows winapi wm-paint
有人可以解释为什么使用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) ;
}
Run Code Online (Sandbox Code Playgroud)
Ray*_*hen 10
如果省略,DefWindowProc那么你说"对于我上面没有处理的所有消息,什么都不做." 这意味着许多消息如"请绘制按钮"被处理为"什么都不做".结果:没有按钮.将所有未处理的消息传递给DefWindowProc.
并非所有窗口消息都需要处理.但是,如果删除DefWindowProc()调用,则不会处理应处理的某些消息.像WM_NCPAINT一样,它绘制窗口框架.和WM_ERASEBKGND,绘制窗口背景.这是DefWindowProc()知道做得好的事情,在很小的部分是由你为窗口创建的WNDCLASS和你在CreateWindowEx()调用中传递的窗口样式标志协助的.
所以,确定,删除呼叫,你将看不到框架或背景.还有许多其他东西,窗户知道如何在没有你帮助的情况下做.DefWindowProc()实现窗口的默认行为.您的窗口过程为其提供了非默认行为.