【问题标题】:Weirdness with SetWindowExt and SetWindowExtEx (negative height, upside down)SetWindowExt 和 SetWindowExtEx 的怪异(负高度,倒置)
【发布时间】:2012-04-02 02:32:20
【问题描述】:

我遇到了关于 SetViewportExt()SetViewportExtEx() 的奇怪行为。

我的 MFC 应用程序使用MM_ISOTROPIC 映射来设置查看设备上下文并按如下方式配置设备上下文:

m_dc.SetMapMode( MM_ISOTROPIC );

// Set the window extent (document space)
CSize docSizeLP = GetDocumentSizeLP();
m_dc.SetWindowExt(docSizeLP.cx, docSizeLP.cy);

// Next set the viewport extent
CSize docSizeDP = GetDocumentSizeDP();
m_dc.SetViewportExt((int) (docSizeDP.cx * fZoom), (int) (docSizeDP.cy * fZoom));

现在我遇到了三个奇怪的事情:

  • 将我的视图呈现到元文件 (CMetaFileDC) 时,我的 视图内容在元文件中颠倒了。但是,如果我将 SetViewportExt() 调用替换为 SetViewportExtEx() 调用,则元文件是正确的。不同之处似乎在于SetViewportExtEx() 设置了一个负视口高度,尽管我传递的值肯定是正的——而且我需要负视口高度才能使图元文件正确。
  • 另一方面,使用SetViewportExtEx() 作为默认值会导致打印预览不显示任何内容。再次调用 SetViewportExtEx() 时,视口高度变为负数,这可能是这个原因。
  • 在普通视图渲染(MFC 视图)中,SetViewportExt()SetViewportExtEx() 都会产生正视口高度。

那么,有人对这两个问题有答案吗?

  1. 为什么 SetViewportExtEx() 在图元文件和打印预览渲染中将我的视口高度设置为负值,尽管我通过了正值?
  2. 为什么我的图元文件渲染需要负视口高度才能最终不倒置?

我很好奇是否有人对此有答案,因为我的智慧到此为止。 :-)

【问题讨论】:

    标签: winapi mfc mapping gdi


    【解决方案1】:

    您的问题提示了我解决增强元文件时遇到的问题。我的应用程序还使用MM_ISOTROPIC 模式和视图中心的逻辑 (0,0) 输出。输出图像偏移和缩放不正确。

    在花了相当多的时间之后,我终于意识到问题可能出在 MFC 的 CDC 的 2 个版本的设备上下文上。第一个 DC m_hDC 用于实际输出,第二个 DC m_hAttribDC 用于查询 DPI 等设备指标。

    我最终做的是通过以下方式准备设备上下文:

    if (pDC->IsPrinting()){
      pDC->SetMapMode(MM_ISOTROPIC);
      pDC->SetViewportOrg(x0, y0);
      pDC->SetWindowExt(wind_extent, wind_extent);
      pDC->SetViewportExt(viewport_extent, -viewport_extent);
    }
    else{
      ::SetMapMode(pDC->m_hDC, MM_ISOTROPIC);
      ::SetViewportOrgEx(pDC->m_hDC, x0, y0, NULL);
      ::SetWindowExtEx(pDC->m_hDC, wind_extent, wind_extent, NULL);
      ::SetViewportExtEx(pDC->m_hDC, viewport_extent, -viewport_extent, NULL);
    }
    

    打印预览和元文件输出之后工作正常。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的建议。不幸的是,这对我不起作用。
    • 在调试更多元文件问题时,我发现了一些与您的这句话有关的东西:“输出图像偏移和缩放不正确。”元文件使用 HORZSIZE 设备上限来确定它的边界,并且这个大小在某些操作系统版本中被证明是错误的(在 Win7 中太大,在 Vista 中太小)。另外:在 MS Word 中插入元图像时,有趣的是,它在那里获得了默认比例(例如 75%)——我想是为了弥补上述错误。有了这个比例,它就有正确的尺寸。看起来 MS 搞砸了。
    猜你喜欢
    • 1970-01-01
    • 2022-10-02
    • 2018-06-10
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2016-09-01
    相关资源
    最近更新 更多