0

我的程序/环境...VS2010、C++、MFC100、CWinAppEx、CMD​​IFrameWndEx。MFC 功能包。

我正在创建和处理 CPreviewView 衍生产品。我的方法将此预览视图视为用户可以保持并处于活动状态的普通视图。默认 PreviewView 在当前视图上绘制并“接管”子框架。

我不知道的一件事是如何控制应该定向到所有 CDocuments 的 ON_UPDATE_COMMAND_UI 消息映射。创建 CPreviewView 时,它会以某种方式禁用 CDocuments 的所有命令处理程序。CViews 的命令处理程序仍然正常工作。

在我的 MDI 应用程序中打开的所有文档都不会收到其 ON_UPDATE_COMMAND_UI 消息。我可以将这些消息处理程序移到视图或框架中,但有太多无法有效地做到这一点。

有谁知道 CPreviewView 类在哪里关闭文档处理程序?

4

1 回答 1

2

首先,MFC 不是一个“锁定”的框架。它的完整源代码位于您自己的 PC 上的以下文件夹中:“您的 Visual Studio 文件夹”\VC\atlmfc\src\mfc\(在我的 PC 上是:c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC \atlmfc\src\mfc) CPreviewView 的源文件在viewprev.cpp文件中。我刚刚打开了文件,在 DoPrintPreview 中他们调用了这个:

pParent->OnSetPreviewMode(TRUE, pState);    // Take over Frame Window

根据MSDN这个方法:

默认实现禁用所有标准工具栏并隐藏主菜单和主客户端窗口。这会将 MDI 框架窗口转换为临时 SDI 框架窗口。

我打开了调用的文件winfrm.cpp并检查了这个方法是否正在执行,它确实禁用了所有菜单。显然,在预览模式打开时,不会向文档发送更新消息。

上面超链接中的 MSDN 文章说,您需要覆盖OnSetPreviewMode框架的方法以:

在打印预览期间自定义控制栏和其他框架窗口部分的隐藏和显示。从覆盖的版本中调用基类实现。

这应该不是问题。

于 2014-05-20T04:59:46.953 回答