使用SetWindowExt和SetWindowExtEx的奇怪(负高度,颠倒)

时间:2012-03-16 14:30:07

标签: winapi mfc mapping device-context

我遇到了关于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. 为什么我的图元文件渲染需要负视口高度,以便最终不会颠倒?
  3. 我很好奇是否有人对此有答案,因为我的智慧在这里结束了。 : - )

1 个答案:

答案 0 :(得分:1)

你的问题给了我一个解决我使用增强型图元文件的问题的提示。我的应用程序也使用MM_ISOTROPIC模式输出,并在视图中心输出逻辑(0,0)。输出图像偏移并缩放不正确。

在花了相当多的时间之后,我终于意识到问题可能出在MFC的CDC拥有的2个版本的设备上下文中。第一个DC m_hDC用于实际输出,第二个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);
}

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

希望这有帮助。