【问题标题】:Prompt user to save changes when closing MFC view关闭 MFC 视图时提示用户保存更改
【发布时间】:2017-01-16 11:28:57
【问题描述】:

我有一个 MFC MDI 应用程序,其中文档可以有多个视图,并且用户可以自定义然后保存视图的布局数据。此数据与视图相关联,而不是与文档相关联。

如果用户选择关闭未保存布局更改的视图,并且遇到问题,我想提示用户保存,因为 MFC 似乎只针对文档中的更改。以下是我尝试过的一些方法:

  1. 覆盖 CDocument::SaveModified 函数,该函数在文档关闭时由框架调用。在这个函数中,我向所有文档视图发送消息,然后它们可以检查未保存的更改并提示用户。

  2. 在 View 的析构函数中执行检查。

  3. 在 View 的 OnClose 处理程序中执行检查

这些方法中的每一种都有问题。 (1) 是最好的,但它无法处理一个文档有多个视图,而用户关闭其中一个视图的情况。由于文档仍处于打开状态,因此不会调用 SaveModified。

(2) 的问题在于,在应用程序关闭时,应用程序在调用任何 CView 析构函数时已经消失。这可能会在桌面上打开一个孤立的对话框。如果我尝试在 OnDestroy 中执行检查,也会出现这种情况。

我无法让 (3) 工作 - 我无法让我的观点响应 WM_CLOSE。

目前,我最好的解决方案是同时执行 (1) 和 (2),但这需要一些臭逻辑来防止应用在应用关闭时提示用户两次保存视图更改。

有人知道这样做的更好方法吗?正确的挂机位置在哪里?

【问题讨论】:

  • 可能是错误的数据定义和/或建模。视图并不意味着保存任何数据 - 至少可以保存在文档文件中。如果您有此类数据,请将它们放在 CDocument 类中。视图可能会修改文档数据 (GetDocument())。视图中唯一可以包含的“数据”可能是显示选项 - 您可以将它们存储在注册表中并在再次加载应用程序时重新加载它们(有点“记住用户设置”)。而且SaveModified()函数很少需要被覆盖(默认就可以了),基本上只需要调用GetDocument()->SetModifiedFlag()即可。
  • 忘了提一下,如果你想在“关闭视图窗口”做一些事情,并且你的应用程序是 MDI,也许可以尝试捕获 MDI chlid 框架的 OnClose() (或什么)处理程序(通常是视图的父窗口)而不是?
  • 我希望保存的数据与视图布局有关,与正在查看的数据无关。将这些数据放入文档中是完全错误的。同一个文档可以有多个视图,每个视图都有不同的设置。
  • 遗憾的是,即使当子框架进入 PreCloseFrame 阶段时,也为时已晚 - 主应用程序窗口已经消失。
  • 为作为视图父级的框架类编写您自己的 WM_CLOSE 处理程序——您的类派生自 CMDIChildWnd。这将处理视图的单独关闭。您可能还需要为主框架编写一个。没那么难。

标签: c++ mfc document-view


【解决方案1】:

我不确定这是否是您的解决方案,但我有几个视图无法按条件关闭,我在DestroyWindow( ) 中处理它们。在应用程序关闭之前,确实会出现一个消息框。所以尝试使用DestroyWindow( ) 而不是析构函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多