祝大家好。这是我在这里的第一个帖子。我正在阅读"用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。椭圆(0,0,50,50),它将从设备点(50,50)作为原点开始,但如果我们将窗口原点更改为(50,50),这是否意味着现在逻辑点(50,50)将映射到(0,0),如果是这样,椭圆不会在上部区域的客户端区域之外吗?映射模式是什么MM_LOWENGLISH还是别的什么?那么情况会如何改变呢?如果有人能给我一些启示,我将非常感激
这是一个相当复杂的问题,主要是因为你有两个完全独立的坐标集要处理,而且(只是为了保持有趣)Windows使用的术语与世界上其他地方使用的术语大致相反。
简短的回答是根本不要使用SetWindowOrg
。我很确定我从来没有在实际代码中很好地使用过它。
SetViewportOrg
是有用的,它真的比描述听起来更简单——你只是选择你想要的原点在哪里。例如,您可能希望从窗口的左下角开始绘制。你可以这样做:
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)],它会自动为您设置一个原点。