我遇到了关于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()
时,视口高度再次变为负值,这可能就是原因。SetViewportExt()
和SetViewportExtEx()
都会产生正视口高度。那么,有没有人对这两个问题有答案呢?
SetViewportExtEx()
将我的视口高度设置为图元文件和打印预览渲染中的负值,尽管我传递了一个正面值? 我很好奇是否有人对此有答案,因为我的智慧在这里结束了。 : - )
答案 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);
}
之后打印预览和图元文件输出工作正常。
希望这有帮助。