很多年没有写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, , , PM_REMOVE)) { //while2
TranslateMessage(&msg);
DispatchMessage(&msg);
}
     vulkan_render();
}

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

如果改一下代码:将

    case WM_PAINT:
break;

改为:

    case WM_PAINT:
return ;

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

原因如下 :

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

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

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

最新文章

  1. uboot的配置流程分析
  2. upload4j安全、高效、易用的java http文件上传框架
  3. 有关RAVE报表 - 大富翁论坛20050419
  4. mysql 4种启动方式
  5. 个人翻译的cedec2010基于物理的光照
  6. Android 应用按两下返回键退出应用程序
  7. bzoj4154
  8. XmlDocument类
  9. oracle中的function 、procedure、packages、package bodies比较
  10. 类string解析
  11. POJ-2184 Cow Exhibition---01背包变形(负数偏移)
  12. BZOJ2339[HNOI2011]卡农——递推+组合数
  13. 嵌入式C语言编译器
  14. PHP Tp5.0 PHPExcel 导出操作
  15. (转)Maven pom.xml 配置详解
  16. ArcGIS pro2.3中添加天地图底图
  17. 前端错误提示whitelabel error page
  18. 使用salt-ssh初始化系统安装salt-minion
  19. pomelo生命周期回调和组件加入
  20. 微软宣布在Azure上支持更多的开放技术和选择

热门文章

  1. 基于webstorm卡顿问题的2种解决方法
  2. 通过编写串口助手工具学习MFC过程——(八)遇到的一些问题
  3. Jpa/Hibernate ManyToOne 关联非主键列 延迟加载失效
  4. SpringAOP用到了什么代理,以及动态代理与静态代理的区别
  5. vue中项目如何引入sass (vue-cli项目)
  6. DRF之三大认证
  7. 安装sysbench,报错"Could not resolve 'ports.ubuntu.com'"
  8. vue简单插件
  9. java并发学习--第十章 java内存模型的内存语义
  10. bzoj4165 矩阵 堆维护多路归并