CPreviewView和命令处理程序

CPreviewView and command handlers

本文关键字:命令处理程序 CPreviewView      更新时间:2023-10-16

我的程序/环境…VS2010, c++, MFC100, CWinAppEx, CMDIFrameWndEx。MFC功能包。

我正在创建和处理一个CPreviewView的衍生物。我的方法将此预览视图视为用户可以保持和活动的普通视图。而默认的PreviewView绘制在当前视图上,并"接管"子框架。

我不能弄清楚的一件事是如何获得对ON_UPDATE_COMMAND_UI消息映射的控制,应该指向所有CDocuments。当创建CPreviewView时,它以某种方式禁用所有CDocuments的命令处理程序。CViews的命令处理程序仍然在工作。

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

有没有人知道在CPreviewView类关闭文档处理程序的地方?

首先,MFC不是一个"锁定"的框架。其完整的源代码驻留在您自己的PC中的以下文件夹:"您的Visual Studio文件夹"VCatlmfcsrcmfc(在我的PC上它是:c:Program Files (x86)Microsoft Visual Studio 11.0VCatlmfcsrcmfc) CPreviewView的源代码是在viewprev.cpp文件。我刚打开文件在DoPrintPreview中他们调用这个:

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

根据MSDN这个方法:

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

我已经打开了名为winfrm.cpp的文件,并检查了该方法正在执行,并且它确实禁用了所有菜单。显然,当预览模式开启时,不会向文档发送更新消息。

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

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