关于在消息响应函数中创建窗口的问题

yong_ss 2018-01-31 09:20:03
我这里做了一个在登陆界面的消息响应函数中创建一个新的主界面的窗口,在运行的时候发现主界面的窗口会一闪而过,调试了好久发现是登录界面响应函数中的问题
原本我在WM_DESTROY中PostQuitMessage导致退出循环
于是修改了下:
case WM_CLOSE:
PostQuitMessage(0);
case WM_DESTROY:
break;
return 0;


只有这样才能使得主界面的窗口正常显示

然后问题来了

我知道WM_CLOSE消息的处理只能使得窗口被销毁,所以通常都使用WM_DESTROY消息的响应来关闭程序,PostQuitMessage(0)则是发送了一个WM_QUIT消息(或者更确切来说并不是发送),那么为什么在WM_CLOSE中PostQuitMessage不会让GetMessage的循环中止呢?按理来说不是有了WM_QUIT消息后GetMessage就会返回null然后退出循环吗?

想问下WM_CLOSE调用PostQuitMessage和WM_DESTROY调用PostQuitMessage是有什么实质性的区别呢?

...全文
423 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
leetow2006 2018-02-03
  • 打赏
  • 举报
回复
会不会是同步、异步的区别
赵4老师 2018-02-03
  • 打赏
  • 举报
回复
《深入浅出MFC》
yong_ss 2018-02-03
  • 打赏
  • 举报
回复
引用 3 楼 leetow2006 的回复:
会不会是同步、异步的区别
能详细说下嘛?
yong_ss 2018-02-01
  • 打赏
  • 举报
回复
引用 1 楼 liugc2008 的回复:
你理解偏差了,有一种是虚函数,比如PostNcDestroy,这种是即时响应的。当然我说的是MFC,但是殊途同归。 而所有的消息响应机制中,消息的处理过程也是有队列的,你POST了WM_XXX,也要等到系统取到这个消息之后才响应。所以说,无论什么消息,只要消息队列不空,就没法即时响应,除非调用别的类似GetMessage或查看消息队列的函数,具体名称忘记了。
这点我之前查的时候有看到,PostQuitMessage在将WM_QUIT放入队列后不会等到它响应会直接退出来,但是还是不懂为什么WM_CLOSE中放入队列的WM_QUIT会一直得不到响应,但是WM_DESTROY中放入队列的WM_QUIT可以得到响应呢? 不好意思,新手有点转不过这个弯
烟袅许伊 2018-02-01
  • 打赏
  • 举报
回复
你理解偏差了,有一种是虚函数,比如PostNcDestroy,这种是即时响应的。当然我说的是MFC,但是殊途同归。 而所有的消息响应机制中,消息的处理过程也是有队列的,你POST了WM_XXX,也要等到系统取到这个消息之后才响应。所以说,无论什么消息,只要消息队列不空,就没法即时响应,除非调用别的类似GetMessage或查看消息队列的函数,具体名称忘记了。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧