我目前有点困惑:WM_CLOSE和::CloseWindow
以任何方式“相关”还是完全不同的东西?
关闭窗口的文档根本没有提到 API 函数CloseWindow
。应该CloseWindow
真正称为“MinimizeWindow”还是我错过了什么?
我目前有点困惑:WM_CLOSE和::CloseWindow
以任何方式“相关”还是完全不同的东西?
关闭窗口的文档根本没有提到 API 函数CloseWindow
。应该CloseWindow
真正称为“MinimizeWindow”还是我错过了什么?
CloseWindow
并且WM_CLOSE
完全不相关。该CloseWindow
函数命名错误。考虑到它恢复窗口,它的反函数OpenWindow
也同样不好命名。
我怀疑这些名称确实可以追溯到很长一段时间,可能可以追溯到 Windows 版本 1 或 2。我推测我们现在所说的minimize和restore在当时被称为close和open。
最小化或恢复窗口的常用方法是调用ShowWindow
传递SW_MINIMIZE
或SW_RESTORE
。
我建议你忘记所有关于CloseWindow
and的事情OpenWindow
。
CloseWindow
是一个名称异常糟糕的 winapi 函数。它实际上并没有关闭窗口,它只是将其最小化。你的意思可能是DestroyWindow()
。
WM_CLOSE
通常是默认窗口过程生成的消息,以响应用户按下Alt+F4或单击窗口的关闭按钮。基本信息是WM_SYSCOMMAND
, SC_CLOSE
。它也可以在代码中生成,例如 Window + Close 菜单项。
WM_CLOSE
您可以在您的窗口过程或 MFC 消息映射中侦听。用户将期望窗口关闭。所以你通常调用DestroyWindow()
. 您不必这样做,例如,您可能会显示一个消息框并询问用户是否应该保存数据。如果他点击“否”,那么你就不会打电话DestroyWindow()
。
我会说忽略 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 是窗口收到的最后一条消息。