windows编程,消息函数中拦截消息的问题

很多年没有写windows窗口程序了,今天自制基于vulkan的程序时遇到了一些问题,部分代码如下:

LRESULT CALLBACK XWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

    switch (uMsg) {
    case WM_CLOSE:
        //PostQuitMessage(0);
        shouldClose = true;
        break;
    case WM_PAINT:
        //run(info);//return 0;
        break;
    default:
        break;
    }
    return (DefWindowProc(hWnd, uMsg, wParam, lParam));
}

int main()
{
    while (true) {//while1

        MSG msg;
        while (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) { //while2
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
     vulkan_render();
    }

上面代码正常运行,当有消息时,windows处理消息,当没有消息时执行渲染函数vulkan_render()。

如果改一下代码:将

    case WM_PAINT:
        break;

改为:

    case WM_PAINT:
        return 0;

渲染函数 vulkan_render将永远不会被执行,循环陷入在while2中出不来了。

原因如下 :

WM_PAINT这个消息一般来说并不频繁,只有当窗口需要重绘时WINDOWS才发送此消息,比如窗口大小改变,窗口最小化再恢复时,窗口移出屏幕外再移回来,注意窗口被其它窗口盖住再重现时不会导致重绘。

如果我们将这个消息在处理函数中直接return,不给后面 DefWindowProc的处理机会,那么WINDOWS就不知道WM_PAINT被处理过了,于是下一帧仍会向程序发送WM_PAINT消息。这样一直循环下去。

因此,消息处理函数不要随便return,除非你很清楚自己在做什么

上一篇:两个方块的运动轨迹


下一篇:WM_PAINT 消息详细解析