2010-06-29 106 views
5

我正在创建一个绘图应用程序,它在获取WM_SCROLL或WM_MOUSEMOVE时呈现OpenGL。事情是,有很多鼠标移动,我只需要它每秒最多60帧。所以我在我的引擎类CanRender中创建了一个bool。所以在我的render()proc我做: if(!CanRender) { return; } CanRender = false;为什么我的计时器停止滴答滴答?

基本上它可以防止它呈现超过60 FPS。

我在WM_CREATE中创建了计时器。

当我得到一个WM_TIMER我设置CanRender为true。

我发出了蜂鸣声,所以我知道计时器正在运行。 只要我开始滚动或移动鼠标,蜂鸣声停止,我不再看到渲染。为什么会阻止我的计时器?另外,当我最小化定时器再次启动然后重新调整,它再次停止。

感谢

消息泵:

// Main message loop: 
while (GetMessage(&msg, NULL, 0, 0)) 
{ 
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

} 

return (int) msg.wParam; 

创作:

case WM_CREATE: 
    //Set Window Title 
    SetWindowText(hWnd,engineGL.current.caption.c_str()); 

    SetTimer(hWnd,    // handle to main window 
     120,     // timer identifier 
     17,      // 60 fps interval 
     (TIMERPROC) NULL);  // no timer callback 
+2

你的整个消息泵是什么样的,你也可以发布你用来创建定时器的代码吗? – 2010-06-29 01:05:24

+0

是的,我怀疑你的事件处理有些奇怪。 – stinky472 2010-06-29 01:06:14

+0

只有当我的渲染函数设置CanRender为false时,否则它的罚款 – jmasterx 2010-06-29 01:08:16

回答

3

为什么使它这么复杂?

在windows应用程序中绘图通常只在WM_PAINT消息中完成,并由RedrawWindow函数触发。你可以在WM_SCROLL和WM_MOUSEMOVE中调用RedrawWindow。如果您的应用程序无法跟上绘图,多次调用RedrawWindow(WM_PAINT消息)将会崩溃。

此外,如果您设置OpenGL与您的显示器垂直回扫同步您不会超过某些刷新率。


至于你的问题......我想有很多WM_SCROLL和WM_MOUSEMOVE消息。那些不能被折叠。所以,如果你在他们的内部做绘图(这需要时间),你会阻止你的消息队列,WM_TIMER消息不能被处理。因此,你不会听到哔哔声。