win32内容已更改,但除非移动窗口,否则不会显示更新

时间:2014-03-09 02:43:19

标签: c++ winapi refresh win32gui

我的win32 GUI内容每秒都会更改,但除非手动移动窗口,否则它不显示更新。我试图每秒弹出一个消息框来触发窗口刷新并且它有效。因此,它证明我的内容确实发生了变化,但窗口没有更新。 我希望窗口刷新而不是每次都弹出一个消息框,是否有一个Windows功能呢?感谢

case WM_PAINT:


RECT fingerprintSection;
fingerprintSection.left=500;
fingerprintSection.top=300;
fingerprintSection.bottom=540;
fingerprintSection.right=660;

    wmId    = LOWORD(wParam);
    hdc = BeginPaint(hWnd, &ps);

    refresh=!refresh;
    if((start==true)&&(refresh==true)&&(stop!=true))
    {       

    windowName = MultiByteStringToWideString(name1, CP_ACP);
    LoadAndBlitBitmap(windowName.c_str(), hdc,500,0);//loading a picture that doesnt change
    fingerprint();
    LoadAndBlitBitmap(TEXT("outresized.bmp"), hdc,500,300);//loading a picture that constantly change
    refresh=!refresh;

//RedrawWindow(hWnd,&fingerprintSection,NULL,RDW_INTERNALPAINT|RDW_VALIDATE|RDW_UPDATENOW|RDW_NOCHILDREN);

InvalidateRect( hWnd, &fingerprintSection, TRUE );
    }
    EndPaint(hWnd, &ps);
    break;

1 个答案:

答案 0 :(得分:4)

如果你在WM_PAINT之外的窗口中绘图(我想在这种情况下,当你得到WM_TIMER消息时,你可能正在对定时器进行一些GDI绘图),那么你应该调用InvalidateRect(),例如。

InvalidateRect( hWnd, NULL, FALSE );   // invalidate whole window

这应该会导致Windows重绘整个窗口。如果您只写了一小块区域,请通过一个描述您所写区域的RECT。

如果你想在windows程序收到WM_PAINT消息 AND 时绘制,想要强制每秒发生一次,那么设置一个计时器......

#define SECOND_TIMER 1000

case WM_INITDIALOG:
   SetTimer( hWnd, SECOND_TIMER, SECOND_TIMER, NULL );
   //other initialisation stuff
   break;

case WM_TIMER:
   if( wParam == SECOND_TIMER )
   { 
       InvalidateRect( hWnd, NULL, FALSE );   // invalidate whole window
   }
   break;

在这种简单的情况下,整个窗口应该每秒重绘一次,因为Windows会因InvalidateRect而发送WM_PAINT消息。理想情况下,您应该只对要重绘的部分无效。