我的程序/环境...... VS2010,C ++,MFC100,CWinAppEx,CMDIFrameWndEx。 MFC功能包。
我正在创建和处理CPreviewView衍生产品。我的方法将此预览视图视为用户可以跟上并激活的普通视图。默认的PreviewView在当前视图上绘制并“接管”子框架。
我无法弄清楚的一件事是如何控制应该定向到所有CD文档的ON_UPDATE_COMMAND_UI消息映射。创建CPreviewView时,它会以某种方式禁用CDocuments的所有命令处理程序。 CView的命令处理程序仍在运行。
在我的MDI应用程序中打开的所有文档都不会收到它们的ON_UPDATE_COMMAND_UI消息。我可以将这些消息处理程序移到View或Frame中,但是有太多的东西可以有效地执行此操作。
有没有人知道CPreviewView类在哪里关闭文档处理程序?
答案 0 :(得分:2)
首先,MFC不是一个“锁定”的框架。它的完整源代码驻留在您自己的PC上的以下文件夹中:“您的Visual Studio文件夹”\ VC \ atlmfc \ src \ mfc \(在我的电脑上它是: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
方法:
在打印预览期间自定义控件栏和其他框架窗口部件的隐藏和显示。从重写版本中调用基类实现。
这应该不是问题。