11

我目前有点困惑:WM_CLOSE::CloseWindow以任何方式“相关”还是完全不同的东西?

关闭窗口的文档根本没有提到 API 函数CloseWindow。应该CloseWindow真正称为“MinimizeWindow”还是我错过了什么?

4

3 回答 3

7

CloseWindow并且WM_CLOSE完全不相关。该CloseWindow函数命名错误。考虑到它恢复窗口,它的反函数OpenWindow也同样不好命名。

我怀疑这些名称确实可以追溯到很长一段时间,可能可以追溯到 Windows 版本 1 或 2。我推测我们现在所说的minimizerestore在当时被称为closeopen

最小化或恢复窗口的常用方法是调用ShowWindow传递SW_MINIMIZESW_RESTORE

我建议你忘记所有关于CloseWindowand的事情OpenWindow

于 2013-06-18T13:01:50.710 回答
7

CloseWindow是一个名称异常糟糕的 winapi 函数。它实际上并没有关闭窗口,它只是将其最小化。你的意思可能是DestroyWindow()

WM_CLOSE通常是默认窗口过程生成的消息,以响应用户按下Alt+F4或单击窗口的关闭按钮。基本信息是WM_SYSCOMMAND, SC_CLOSE。它可以在代码中生成,例如 Window + Close 菜单项。

WM_CLOSE您可以在您的窗口过程或 MFC 消息映射中侦听。用户将期望窗口关闭。所以你通常调用DestroyWindow(). 您不必这样做,例如,您可能会显示一个消息框并询问用户是否应该保存数据。如果他点击“否”,那么你就不会打电话DestroyWindow()

于 2013-06-18T14:03:36.177 回答
-1

我会说忽略 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 是窗口收到的最后一条消息。

于 2019-01-07T16:51:59.943 回答