我已经使用QueryPerformanceCounter完成了一些测试并得到了奇怪的结果。 看起来我的简单程序在什么都不做的时候会慢慢刷新(大约40ms),但是当我把RedrawWindow放到RDW_INVALIDATE消息时它刷新并且工作得非常快(大约1ms)
请查看示例:
{...}
double PCFreq = 0.0;
__int64 now = 0, start = 0;
LARGE_INTEGER li;
PCFreq = double(li.QuadPart)/1000;
AllocConsole( );
freopen("CONOUT$", "wb", stdout);
double delay;
while (GetMessage (&messages, NULL, 0, 0))
{
QueryPerformanceCounter(&li);
now = li.QuadPart;
if ( double(now - start) / PCFreq >= 40)
{
**// painting !!!**
cout << double(now - start) / PCFreq << "\n";
start = now;
}
// !!!!!!
**RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE);**
TranslateMessage(&messages);
DispatchMessage(&messages);
}
FreeConsole( );
{...}
当RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE);
在主循环中时,我可以获得40ms甚至5ms,但没有RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE);
条件if(double(now - start)/ PCFreq&gt; = 40)输入no快于45-50毫秒......
我的问题是:
如何避免RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE);
功能但保持快速刷新。当Iam使用RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE);
我的界面(按钮,窗口)不显示时。
谢谢!
答案 0 :(得分:2)
除非消息队列中有消息,否则GetMessage不会返回。通过调用RedrawWindow,您将在循环的每次迭代中将Message放入队列中。使用PeekMessage而不是GetMessage:
while (true)
{
if (PeekMessage(&messages, NULL, 0, 0, PM_REMOVE))
{
if (messages.message == WM_QUIT)
break;
TranslateMessage(&messages);
DispatchMessage(&messages);
}
// Do your stuff here
}