2

誰かが 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) ;
}
4

2 に答える 2

10

省略DefWindowProcした場合は、「上記で処理しなかったすべてのメッセージについて、何もしないでください」と言っていることになります。つまり、「ボタンを描いてください」などの多くのメッセージは、「何もしない」として処理されます。結果: ボタンなし。未処理のメッセージをすべて DefWindowProc に渡します。

于 2012-07-07T14:32:03.977 に答える
6

すべてのウィンドウ メッセージに処理が必要なわけではありません。ただし、DefWindowProc() 呼び出しを削除すると、処理する必要がある特定のメッセージ処理されません。ウィンドウ フレームを描画する WM_NCPAINT と同様です。そして、ウィンドウの背景を描画する WM_ERASEBKGND。これは、ウィンドウ用に作成した WNDCLASS と、CreateWindowEx() 呼び出しで渡したウィンドウ スタイル フラグの助けを借りて、DefWindowProc() が適切に行うことがわかっていることです。

確かに、呼び出しを削除すると、フレームも背景も表示されなくなります。そして、ウィンドウがあなたの助けなしで行う方法を知っている他の多くのこと。DefWindowProc() は、ウィンドウのデフォルトの動作を実装します。ウィンドウ プロシージャによって、既定以外の動作が行われます。

于 2012-07-07T15:46:51.657 に答える