2012-07-07 18 views
2

有人可以解釋爲什麼DefWindowProc一切正常,但如果我刪除它,字符串「你好窗口」出現在屏幕上沒有窗口和任何按鈕? 「UpdateWindow」發送到窗口過程WM_PAINT消息,爲什麼文本顯示,但窗口的創建被跳過?DefWindowProc的行爲WinApi

#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) ; 
} 

回答

9

如果省略DefWindowProc然後你說:「對於所有的消息我沒有處理上面,什麼都不做。」這意味着像「請畫按鈕」這樣的許多消息會被視爲「無所事事」。結果:沒有按鈕。 Pass all unhandled messages to DefWindowProc

+0

+1,很好放! – SuperSaiyan 2012-07-07 14:41:06

+0

感謝您的回答。現在我知道WM_PAINT只是繪製客戶區,在ShowWindow函數調用期間,客戶區不會在沒有DefWindowProc的情況下創建。 – lysergic 2012-07-07 15:11:01

6

並非所有窗口消息都需要處理。但是如果你刪除了DefWindowProc()調用,那麼應該處理的某些消息不會得到處理。像繪製窗口框架的WM_NCPAINT一樣。和WM_ERASEBKGND,它繪製窗口背景。哪些是DefWindowProc()知道要做的很好的事情,在您爲窗口創建的WNDCLASS以及您在CreateWindowEx()調用中傳遞的窗口樣式標誌的幫助下完成。

因此,請刪除呼叫,您將看不到框架和背景。還有許多其他很多窗口知道如何在沒有你幫助的情況下做的事情。 DefWindowProc()實現了窗口的默認行爲。您的窗口過程爲其提供了非默認行爲。

+0

解釋得非常清楚。最佳答案! – lysergic 2012-07-07 18:05:51