2011-04-16 40 views
5

对你们来说都是美好的一天。这是我在这里的第一篇文章。 - 我在读“Windows编程与MFCĴProsise(MS出版社)”
在第二章我在2个GDI函数真糊涂我,我引用的文字来:两个MFC 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还是别的?情况如何改变呢?如果任何人都可以对此事进行阐述,我会很感激

回答

6

这是一个相当复杂的问题,主要是因为你有两个完全独立的坐标集来处理,并且(为了保持有趣的事情)Windows大致上与世界其他地方使用的术语相反。

简而言之就是根本不使用SetWindowOrg。我很确定我从来没有在真正的代码中使用它。

SetViewportOrg是有用的,它比描述使它听起来更简单 - 你只是挑选出你想要的原点。例如,您可能希望绘图从窗口的底部左侧开始。你会做的东西,如:

CRect rect; 
GetClientRect(&rect); 

pDC->SetViewportOrg(0, rect.Height()); 

OTOH,如果你想能够得出两个正数和负数,您可能希望X = 0是在窗口的左侧,但ÿ = 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)(英文|公制)],它会自动为您设置原点。

+0

感谢您的帮助。起初,我还认为坚持KISS原则,但一遍又一遍地阅读,完全把握它,只是困惑了我。 – Razort4x 2011-04-16 08:24:14