zoukankan      html  css  js  c++  java
  • 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,除非你很清楚自己在做什么

  • 相关阅读:
    指向指针的指针
    判断是否遵守某个协议
    oc继承,实现,分类
    oc中没有空指针错误
    oc方法
    指针
    Array.diff
    ATM机允许4位或6位密码,而密码只能包含4位或6位数字。 如果函数传递了一个有效的PIN字符串,返回true,否则返回false。
    替换字符串中的字符为“(” 或“)”
    python 异常处理
  • 原文地址:https://www.cnblogs.com/timeObjserver/p/11334431.html
Copyright © 2011-2022 走看看