Windows DefWindowProc WinApi的行为

Windows DefWindowProc WinApi的行为,windows,winapi,wm-paint,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, HINS

有人能解释为什么使用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) ;
}
#包括
LRESULT回调proc1(HWND、UINT、WPARAM、LPARAM);
int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、PSTR szCmdLine、int iCmdShow)
{
静态TCHAR szAppName[]=文本(“程序”);
HWND-hwnd1;
msg1;
WNDCLASS WNDCLASS 1;
wndclass1.style=CS_HREDRAW | CS_VREDRAW;
wndclass1.lpfnWndProc=proc1;
wndclass1.cbClsExtra=0;
wndclass1.cbWndExtra=0;
wndclass1.hInstance=hInstance;
wndclass1.hIcon=LoadIcon(空,IDI_应用程序);
wndclass1.hCursor=LoadCursor(空,IDC_箭头);
wndclass1.hbrBackground=(HBRUSH)GetStockObject(白色画笔);
wndclass1.lpszMenuame=NULL;
wndclass1.lpszClassName=szAppName;
注册类(wndclass1);
hwnd1=CreateWindow(szAppName,
文本(“我的窗口”),
WS_重叠窗口,
CW_使用默认值,
CW_使用默认值,
CW_使用默认值,
CW_使用默认值,
无效的
无效的
hInstance,
无效);
显示窗口(hwnd1、iCmdShow);
更新窗口(hwnd1);
while(GetMessage(&msg1,NULL,0,0))
{
翻译消息(&msg1);
调度消息(&msg1);
};
返回msg1.wParam;
};
LRESULT回调过程1(HWND hwnd1,UINT消息,WPARAM WPARAM,LPARAM LPARAM)
{
HDC-HDC;
PAINTSTRUCT-ps;
RECT-RECT;
开关(信息)
{
案例WM_创建:
返回0;
案例WM_油漆:
hdc=开始修复(hwnd1和ps);
GetClientRect(hwnd1和rect);
DrawText(hdc、TEXT(“Hello windows”)、-1、&rect、DT|U单线| DT|U中心| DT|U VCENTER);
端漆(hwnd1和ps);
返回0;
案例WM_销毁:
PostQuitMessage(0);
返回0;
};
返回DefWindowProc(hwnd1,消息,wParam,lParam);
}

如果省略了
DefWindowProc
,则表示“对于上面未处理的所有消息,请不要执行任何操作”。这意味着许多消息(如“请绘制按钮”)将被处理为“不执行任何操作”。结果:没有按钮

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


因此,当然,删除呼叫,您将看不到帧或背景。还有很多很多其他的事情,一个窗口知道如何做没有你的帮助。DefWindowProc()实现窗口的默认行为。您的窗口过程提供了非默认行为。

谢谢您的回答。现在我知道WM_PAINT只绘制客户端区域,在ShowWindow函数调用期间,如果没有DefWindowProc,就无法创建客户端区域。