我的 win32 GUI 内容每秒都会更改,但除非手动移动窗口,否则不会显示更新。我尝试每秒弹出一个消息框来触发窗口刷新,它成功了。因此,这证明我的内容确实发生了变化,但窗口没有更新。
我希望刷新窗口而不是每次都弹出消息框,有没有这样的窗口功能?谢谢
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;
如果您在 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 消息。理想情况下,您应该只使您正在重绘的部分无效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)