鱼C论坛

 找回密码
 立即注册
查看: 1761|回复: 11

Win32汇编中这两个关闭有啥区别?

[复制链接]
发表于 2014-3-29 16:22:14 | 显示全部楼层 |阅读模式
1鱼币
在小甲鱼WIN32汇编视频第三十二讲中的 "FirstWindow.asm"有如下两个关闭窗口的地方都有什么区别如下:
第一处:
; 消息循环
;********************************************************************
                .while        TRUE
                        invoke        GetMessage,addr @stMsg,NULL,0,0
                        .break        .if eax        == 0 //这是第一处可以关闭窗口之处.
                        invoke        TranslateMessage,addr @stMsg
                        invoke        DispatchMessage,addr @stMsg
                .endw
                ret


第二处(在窗口过程当中):
; 建立一个按钮
;********************************************************************
                .elseif        eax ==        WM_CREATE
                        invoke        CreateWindowEx,NULL,\
                                offset szButton,offset szButtonText,\
                                WS_CHILD or WS_VISIBLE,\
                                10,10,88,22,\
                                hWnd,1,hInstance,NULL
;********************************************************************
                .elseif        eax ==        WM_CLOSE//这里是第二次关闭窗口请问有什么区别
                        invoke        DestroyWindow,hWinMain
                        invoke        PostQuitMessage,NULL

最佳答案

查看完整内容

恩!我测试了一下,如果把 .break .if eax == 0去掉的话,虽然窗口关闭了,可是在系统进程中还是可以看到这个程序的,如果加上的话,就看不到了,所以,由此,可以判断出它是在执行了WM_CLOSE这个消息以后才触发了这个消息的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-29 16:22:15 | 显示全部楼层

恩!我测试了一下,如果把 .break .if eax == 0去掉的话,虽然窗口关闭了,可是在系统进程中还是可以看到这个程序的,如果加上的话,就看不到了,所以,由此,可以判断出它是在执行了WM_CLOSE这个消息以后才触发了这个消息的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-29 21:32:04 | 显示全部楼层
其实第一个关闭时跳出消息循环的循环队列,否则的话程序就一直循环在哪儿了,第二个关闭是有循环队列接受消息当接受到WM_CLOSE这个消息的时候,它就会调用DestroyWindow与PostQuitMessage去毁掉窗口
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-30 07:40:47 | 显示全部楼层
青玄 发表于 2014-3-29 21:32
其实第一个关闭时跳出消息循环的循环队列,否则的话程序就一直循环在哪儿了,第二个关闭是有循环队列接受消 ...

哪么第一个关闭反应到实际操作当中可以看着是我们用鼠标点了一下右上角的关闭按钮。哪第二个关闭是由什么实际动作产生的消息呢?谢谢解答!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-30 10:40:01 | 显示全部楼层
嗯...,你说的用鼠标点了一下右上角的关闭按钮那是消息队列接收到了WM_CLOSE消息的时候,它关闭的是这个程序的窗口,而你说的 .break .if eax == 0那个的话,是系统接受到了WM_QUIT这个消息它的返回值是0,也就是eax == 0的时候,他关闭的是这个程序的整个进程,如果没有这个  .break .if eax == 0的话,那么虽然你按了关闭按钮,但程序的进程还没有被关闭,所以,只有退出消息循环程序的进程才可以退出!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-30 13:30:02 | 显示全部楼层
青玄 发表于 2014-3-30 10:40
嗯...,你说的用鼠标点了一下右上角的关闭按钮那是消息队列接收到了WM_CLOSE消息的时候,它关闭的是这个程序 ...

恩,再次感谢你的回答。哪什么情况才能触发WM_QUIT这个消息呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-30 15:30:53 | 显示全部楼层
青玄 发表于 2014-3-30 13:36
恩!我测试了一下,如果把 .break .if eax == 0去掉的话,虽然窗口关闭了,可是在系统进程中还是可以看到 ...

哦,哪我可以这样理解吧:如要我们点一下关闭按钮则触发了WM_CLOSE这个消息再然后通过某种方法使EAX的值为0进一步触发了WM_QUIT这个消息退出消息偱环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-30 15:32:41 | 显示全部楼层
恩!应该是这样的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-30 15:36:26 | 显示全部楼层
而且,我想这个应该与PostQuitMessage()这个函数有关,我想这个函数应该是把WM_QUIT的返回值给eax是的消息队列接收到以后就退出了消息循环!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-30 15:39:49 | 显示全部楼层
青玄 发表于 2014-3-30 15:36
而且,我想这个应该与PostQuitMessage()这个函数有关,我想这个函数应该是把WM_QUIT的返回值给eax是的消息队 ...

恩,有道理!朋友这么热情加个好友吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-30 15:41:20 | 显示全部楼层
隨鈊乄鎍慾 发表于 2014-3-30 15:39
恩,有道理!朋友这么热情加个好友吧?

好啊!你发个请求我加一下就行了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-30 15:44:09 | 显示全部楼层
青玄 发表于 2014-3-30 15:41
好啊!你发个请求我加一下就行了!

O了......................
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 01:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表