我正在将旧的MFC MDI(多文档界面)应用程序从Visual Studio 6迁移到Visual Studio 2013.这个过程非常简单,但现在我遇到了有关打印预览的问题。
当我使用Visual Studio 6编译程序时,打印预览如下所示:
预览窗口接管主框架窗口,删除菜单和工具栏。
但使用Visual Studio 2013编译的相同程序如下所示:
打印预览发生在视图的框架窗口中,由于各种原因,这种行为是不可接受的。
在VS6和VS2013上单步执行MFC源代码时,我发现差异归结为MFC的CView::DoPrintPreview
方法如何获得打印预览的框架窗口。
CView::DoPrintPreview
(在viewprev.cpp中)的相关部分位于:
Visual Studio 6
BOOL CView::DoPrintPreview(UINT nIDResource, CView* pPrintView,
CRuntimeClass* pPreviewViewClass, CPrintPreviewState* pState)
{
ASSERT_VALID_IDR(nIDResource);
ASSERT_VALID(pPrintView);
ASSERT(pPreviewViewClass != NULL);
ASSERT(pPreviewViewClass->IsDerivedFrom(RUNTIME_CLASS(CPreviewView)));
ASSERT(pState != NULL);
CFrameWnd* pParent = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
...
此处pParent
将只包含主框架窗口。
Visual Studio 2013
BOOL CView::DoPrintPreview(UINT nIDResource, CView* pPrintView,
CRuntimeClass* pPreviewViewClass, CPrintPreviewState* pState)
{
ASSERT_VALID_IDR(nIDResource);
ASSERT_VALID(pPrintView);
ASSERT(pPreviewViewClass != NULL);
ASSERT(pPreviewViewClass->IsDerivedFrom(RUNTIME_CLASS(CPreviewView)));
ASSERT(pState != NULL);
CWnd* pMainWnd = GetParentFrame();
if (DYNAMIC_DOWNCAST(CFrameWnd, pMainWnd) == NULL)
{
// if it's not a frame, we'll try the main window
pMainWnd = AfxGetMainWnd();
}
CFrameWnd* pParent = STATIC_DOWNCAST(CFrameWnd, pMainWnd);
...
此处pParent
将包含视图的框架窗口(通过GetParentFrame()
获取)而不是主框架窗口。
备注
有没有人知道如何使用Visual Studio 6获得与Visual Studio相同的beaviour而无需重新实现MFC的CView
和CPreviewView
类的一半?
答案 0 :(得分:0)
我不确定它是否有效,但您可以尝试使用SetParent。
应该可以工作,因为Frame和view的结构与应用程序的SDI形式完全相同。