2014-04-07 57 views
-1

我试图触发一个WM_PAINT消息窗体WM_TIMER;定时器工作,但RedrawWindow()函数似乎没有做任何事情。我究竟做错了什么?Win32 - 无法用RedrawWindow触发WM_PAINT消息()

这里是我的回调函数:

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; 
} 
+0

如果你想立即重绘随后也尝试添加了'RDW_UPDATENOW'和/或'RDW_ERASENOW'标志旁边的' RDW_INVALIDATE'。顺便说一下,你的'WM_PAINT'处理程序是否因'RedrawWindow'调用而执行? – pasztorpisti

+1

13在您的TextOut调用中字符数不正确,这可能会导致未定义的行为。 – marcinj

+1

InvalidateRect就足够了。确保您的计时器实际上正在被解雇,并确保您的计时器时间间隔足够慢,以便实际进行重新绘制。 – tenfour

回答

5

由于x在你的函数定义为一个局部变量,它总是得到值true当函数被调用。也就是说,WM_PAINT中的代码永远不会到达ifelse分支。

尝试,例如,改变x的定义static bool x = true;拿到切换工作。

此外,你需要无效窗口的内容得到它重绘:

RedrawWindow(hWnd,NULL,NULL,RDW_INVALIDATE | RDW_INTERNALPAINT); 
+0

我做过,没有任何事发生 – Cristi

+0

您还需要使窗口无效 - 请参阅更新后的答案。 – jlahd

+0

它的作品,非常感谢你! – Cristi