我目前有点困惑:WM_CLOSE和::CloseWindow
是否“相关”或完全不同?
Closing Windows的文档根本没有提及API函数CloseWindow
。 CloseWindow
应该被称为“MinimizeWindow”还是我错过了什么?
答案 0 :(得分:6)
CloseWindow
是一个名字不太好的winapi函数。它实际上并没有关闭窗口,它只是最小化它。你的意思是DestroyWindow()
。
WM_CLOSE
通常是默认窗口过程生成的消息,以响应用户按 Alt + F4 或单击窗口& #39;关闭按钮。基础消息是WM_SYSCOMMAND
,SC_CLOSE
。 可以在代码中生成,就像Window + Close菜单项一样。
您可以在窗口过程或MFC消息映射中侦听WM_CLOSE
。用户希望窗口关闭。所以你通常打电话给DestroyWindow()
。您不必这样做,您可能会显示一个消息框,并询问用户是否应保存数据。如果他点击否,那么您就不会拨打DestroyWindow()
。
答案 1 :(得分:5)
CloseWindow
和WM_CLOSE
完全无关。 CloseWindow
函数名称错误。它的反函数OpenWindow
同样严格命名,因为它恢复了窗口。
我怀疑这些名称确实可以追溯到很长一段时间,可能是Windows版本1或2.我猜测我们现在称之为最小化和恢复的是,那时,称为关闭和打开。
最小化或恢复窗口的常用方法是通过ShowWindow
或SW_MINIMIZE
致电SW_RESTORE
。
我建议您忘记CloseWindow
和OpenWindow
的全部内容。
答案 2 :(得分:0)
我会说由于上一个海报建议的原因而忽略CloseWindow和OpenWindow()。但是,尽管在技术上可行,但在WM_DESTROY期间处理保存还是实际销毁窗口(即提示用户)被认为是不好的形式。一旦调用DestroyWindow且OS发送WM_DESTROY消息,就可以为销毁窗口做准备。所以工作流程应该是这样的:
将WM_CLOSE发送到相关的窗口句柄。 CloseWindow应该做到这一点,就像DestroyWindow发送WM_DESTROY消息或ShowWindow发送WM_SHOWWINDOW消息一样。但是,由于没有,请再次发送WM_CLOSE到窗口。
接下来,在处理WM_CLOSE消息期间,您可以询问用户是否要保存任何内容,或者是否打算关闭窗口。如果他们取消关闭窗口,只需返回零即可告诉操作系统您已处理了该消息。如果用户指示他们希望继续,则可以调用DestroyWindow或简单地将消息传递给DefWindowProc,这将立即执行。在保存WM_CLOSE的过程中,应该保存任何文件。在处理WM_DESTROY时,应删除与该窗口关联的任何动态分配的内存和可用资源。最后,仅供参考,WM_NCDESTROY是窗口收到的最后一条消息。