1

在为我的 windows 类完成包装后,我用一些文本进行了测试,以确保一切正常。但是,无论我删除或注释掉文本“这是一个测试!!!!”,在运行程序时,它在可执行文件运行期间仍然存在。

LRESULT CALLBACK WinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch (uMsg)
        {
        case WM_PAINT:
            PAINTSTRUCT ps;
            HDC hdc;

            //hdc = BeginPaint(hwnd, &ps); 

            //TextOut(hdc, 0, 0, L"This is a TEST!!!", 17);

            //EndPaint(hwnd, &ps);
            break;
        case WM_DESTROY:
            bWindowClosed = TRUE;
            break;
        case WM_CREATE:
            MessageBox(NULL, L"Create", L"test", MB_OK);
            break;
        default:
            return CBaseWindow::WinMsgHandler(hwnd, uMsg, wParam, lParam);
        }

        return 0;
    };

编辑:

这是winmain源文件。我觉得这与我将所有内容括起来的方式有关。CDerivedWindow 是一个封装类,用于封装大部分窗口初始化过程。

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{

    CDerivedWindow mainWnd(hInstance);

    WNDCLASSEX wcx; 

    // Fill in the window class structure with default parameters 
    wcx.cbSize = sizeof(WNDCLASSEX);                            // size of structure 
    wcx.style = CS_HREDRAW | CS_VREDRAW;                        // redraw if size changes 
    wcx.lpfnWndProc = CBaseWindow::stWinMsgHandler;             // points to window procedure 
    wcx.cbClsExtra = 0;                                         // no extra class memory 
    wcx.cbWndExtra = 0;                                         // no extra window memory 
    wcx.hInstance = hInstance;                                  // handle to instance 
    wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION);                // predefined app. icon 
    wcx.hCursor = LoadCursor(NULL, IDC_ARROW);                  // predefined arrow 
    wcx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    // white background brush 
    wcx.lpszMenuName = NULL;                                    // name of menu resource 
    wcx.lpszClassName = L"True Wild";                           // name of window class 
    wcx.hIconSm = LoadIcon(NULL, IDI_APPLICATION);              // small class icon 

    initSprites();

    // register the window
    if (mainWnd.RegisterWindow(&wcx))
    {
        DWORD dwError = 0;
        DWORD dwStyle = WS_OVERLAPPEDWINDOW | WS_VISIBLE;
        RECT rc;

        rc.top = 100;
        rc.left = 100;
        rc.right = SCREEN_WIDTH;
        rc.bottom = SCREEN_HEIGHT;

        // create the window and start the message loop
        // we will get kicked out of the message loop when the window closes
        if (mainWnd.Create(dwStyle, &rc))
        {
            // message loop
            MSG msg;


            //game Loop
            while (TRUE)
            {
                while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
                { 
                    // Translate the message and dispatch it to WindowProc()
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);

                    if (mainWnd.IsWindowClosed())
                        return 0;

                }


                //Run game code
                render();
            }
            return 0;
        }
        else
            return -1;
    }
    else
        return -2;

    return 0;
}

编辑答案1:

// the message handler for this window
LRESULT CALLBACK WinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        bWindowClosed = TRUE;
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam);
};
4

1 回答 1

0

如果您不处理 WM_PAINT,则应将其传递给以DefWindowProc()验证客户区并重新绘制窗口。

看起来您正在摆脱开关/外壳并返回 0。我将替换:

return 0;

return DefWindowProc(hwnd, uMsg, wParam, lParam);
于 2012-11-24T02:55:56.913 回答