【问题标题】:What is the relationship of CloseWindow and WM_CLOSECloseWindow和WM_CLOSE是什么关系
【发布时间】:2013-06-14 16:16:49
【问题描述】:

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

Closing Windows 的文档根本没有提到 API 函数 CloseWindowCloseWindow 真的应该被称为“MinimizeWindow”还是我错过了什么?

【问题讨论】:

  • 当我在这里问“对话常量 DS_RECURSE 的值是什么?” (stackoverflow.com/questions/15024372/…)——我的话题被[关闭]。所以“CloseWindow和WM_CLOSE的关系是什么”也必须[关闭] :-)
  • @kero:您要求提供未记录的常量的值来执行任何操作。这不是一个实际的编程问题。与这个问题完全相反。这就是为什么你的被关闭了,而这个没有。

标签: windows winapi mfc window-messages


【解决方案1】:

CloseWindowWM_CLOSE 完全不相关。 CloseWindow 函数命名错误。它的反函数OpenWindow 的名字也很糟糕,因为它可以恢复窗口。

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

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

我建议你忘记CloseWindowOpenWindow

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-03-14
        • 2018-02-16
        • 2020-05-04
        • 2020-01-08
        • 2015-01-13
        • 2017-11-06
        • 2015-07-09
        • 2010-11-30
        相关资源
        最近更新 更多