windows编程,消息函数中拦截消息的问题
2024-08-21 19:59:05
很多年没有写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,除非你很清楚自己在做什么
最新文章
- uboot的配置流程分析
- upload4j安全、高效、易用的java http文件上传框架
- 有关RAVE报表 - 大富翁论坛20050419
- mysql 4种启动方式
- 个人翻译的cedec2010基于物理的光照
- Android 应用按两下返回键退出应用程序
- bzoj4154
- XmlDocument类
- oracle中的function 、procedure、packages、package bodies比较
- 类string解析
- POJ-2184 Cow Exhibition---01背包变形(负数偏移)
- BZOJ2339[HNOI2011]卡农——递推+组合数
- 嵌入式C语言编译器
- PHP Tp5.0 PHPExcel 导出操作
- (转)Maven pom.xml 配置详解
- ArcGIS pro2.3中添加天地图底图
- 前端错误提示whitelabel error page
- 使用salt-ssh初始化系统安装salt-minion
- pomelo生命周期回调和组件加入
- 微软宣布在Azure上支持更多的开放技术和选择
热门文章
- 基于webstorm卡顿问题的2种解决方法
- 通过编写串口助手工具学习MFC过程——(八)遇到的一些问题
- Jpa/Hibernate ManyToOne 关联非主键列 延迟加载失效
- SpringAOP用到了什么代理,以及动态代理与静态代理的区别
- vue中项目如何引入sass (vue-cli项目)
- DRF之三大认证
- 安装sysbench,报错";Could not resolve 'ports.ubuntu.com'";
- vue简单插件
- java并发学习--第十章 java内存模型的内存语义
- bzoj4165 矩阵 堆维护多路归并