混淆了两个MFC GDI函数

祝大家好。这是我在这里的第一篇文章。我正在阅读“使用MFC编程Windows-J Prosise(MS Press)\” 在第二章中,我引用了两个确实让我感到困惑的GDI函数: 将SetViewportOrg和SetWindowOrg混淆很容易,但是它们之间的区别实际上很明显。使用SetViewportOrg将视口原点更改为(x,y)告诉Windows将逻辑点(0,0)映射到设备点(x,y)。使用SetWindowOrg将窗口原点更改为(x,y)的操作实质上是相反的,告诉Windows将逻辑点(x,y)映射到设备点(0,0)(显示表面的左上角)。在MM_TEXT映射模式下,两个函数之间唯一真正的区别是x和y的符号。在其他映射模式下,它具有更多的优势,因为SetViewportOrg处理设备坐标,而SetWindowOrg处理逻辑坐标 我真的对此感到困惑,就像如果我们将视点原点更改为(50,50)然后使用dc.ellipse(0,0,50,50),它将从设备点(50,50)开始,就像原点,但是如果我们将窗口原点更改为(50,50),则意味着现在将逻辑点(50,50)映射到(0,0),如果这样,则椭圆不会超出客户端的范围的区域在上部? MM_LOWENGLISH或其他映射方式是什么?那么情况将如何变化?如果有人能说明这件事,请多谢。     
已邀请:
这是一个相当复杂的问题,主要是因为您要处理两组完全独立的坐标,并且(为了使事情变得有趣)Windows使用的术语与世界其他地方的术语大致相反。 简短的答案是根本不使用
SetWindowOrg
。我很确定自己从未在实际代码中很好地使用过它。 ѭ1很有用,而且比描述听起来的简单,实际上很简单-您只是在选择想要的来源。例如,您可能希望图形从窗口的左下角开始。您可以使用以下方法做到这一点:
CRect rect;
GetClientRect(&rect);

pDC->SetViewportOrg(0, rect.Height());
OTOH,如果您想同时绘制负数和正数,则可能希望x = 0位于窗口的左侧,而y = 0位于窗口顶部和底部之间的中间位置。您将执行以下操作:
// get rect as above.
pDC->SetViewportOrg(0, rect.Height()/2);
如果您希望窗口的中心为(0,0),则可以使用:
// again, get rect like above
pDC->SetViewportOrg(rect.Width()/2, rect.Height()/2);
请注意,这两种方法的主要用途是将映射模式设置为MM_ISOTROPIC或MM_ANISOTROPIC,这是您可以完全自行设置坐标的地方。使用其他模式[MM_TEXT或MM_(LO | HI)(ENGLISH | METRIC)],它会自动为您设置一个原点。     

要回复问题请先登录注册