Win32 - 无法使用RedrawWindow()触发WM_PAINT消息

Cri*_*sti -1 c++ winapi win32gui

我试图从WM_TIMER触发WM_PAINT消息; 计时器工作,但RedrawWindow()函数似乎没有做任何事情.我究竟做错了什么?

这是我的回调函数:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    PAINTSTRUCT Ps;
    COLORREF    clrBlue = RGB(25, 55, 200);
    RECT        Recto = { 20, 28, 188, 128 };
    COLORREF    clrAqua = RGB(128, 255, 255);
    COLORREF clrRed  = RGB(255, 25, 5);
    static bool x = true;
    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }

        break;
    case WM_TIMER:
        //InvalidateRect(hWnd ,NULL , FALSE);
        //RedrawWindow(hWnd , NULL , NULL , RDW_INVALIDATE);
        RedrawWindow(hWnd,NULL,NULL,RDW_INTERNALPAINT);
        break;
    case WM_PAINT:
        if(x)
        {
            hdc = BeginPaint(hWnd, &ps);
            SetTextColor(hdc, clrRed);
            TextOut(hdc, 50, 42, L"Some text", 13);
            EndPaint(hWnd, &ps);
            toggle(x);
        }
        else
        {
            hdc = BeginPaint(hWnd, &ps);
            SetTextColor(hdc, clrRed);
            TextOut(hdc, 50, 42, L"Another text", 13);
            EndPaint(hWnd, &ps);
            toggle(x);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);

        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

jla*_*ahd 5

由于x在函数中定义为局部变量,它总是在true调用函数时获取值.也就是说,代码WM_PAINT永远不会到达else分支if.

例如,尝试更改xto 的定义static bool x = true;以获得切换工作.

此外,您需要使窗口的内容无效以重新绘制它:

RedrawWindow(hWnd,NULL,NULL,RDW_INVALIDATE | RDW_INTERNALPAINT);
Run Code Online (Sandbox Code Playgroud)