在Visual Studio 6与Visual Studio 2013中打印预览

时间:2014-09-15 12:28:16

标签: c++ visual-studio mfc porting vc6

我正在将旧的MFC MDI(多文档界面)应用程序从Visual Studio 6迁移到Visual Studio 2013.这个过程非常简单,但现在我遇到了有关打印预览的问题。

当我使用Visual Studio 6编译程序时,打印预览如下所示:

enter image description here

预览窗口接管主框架窗口,删除菜单和工具栏。

但使用Visual Studio 2013编译的相同程序如下所示:

enter image description here

打印预览发生在视图的框架窗口中,由于各种原因,这种行为是不可接受的。 在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版本都会出现此行为。
  • 这只是MDI程序的一个问题,SDI程序的行为保持不变,BTW与SDI一样正常,视图的框架窗口实际上是主框架窗口。

有没有人知道如何使用Visual Studio 6获得与Visual Studio相同的beaviour而无需重新实现MFC的CViewCPreviewView类的一半?

1 个答案:

答案 0 :(得分:0)

我不确定它是否有效,但您可以尝试使用SetParent。

  • Saddly CView :: DoPrintPreview不是虚拟的。所以覆盖CView :: OnFilePrintPreview。实现很简单,只需调用DoPrintPreview。
  • 现在使用GetParent并保存视图的旧Parent。保存。
  • 使用SetParent并将视图附加到AfxGetMainWnd
  • 致电DoPrintPreview
  • DoPrintPreview返回后使用SetParent并再次设置旧保存的父句柄。

应该可以工作,因为Frame和view的结构与应用程序的SDI形式完全相同。