📄 untitled-12.txt
字号:
第2章在窗口中绘图41
CClientDC dc(this);
dc.SetMapMode(MM-LOENGLISH);
dc.DPtoLP(&po。n亡);
当DPtoLP返回时,point中存储了以逻辑(即MM.LOENGLISH)坐标值表示的中心点坐
标。另一方面,如果想得到MM—LOENGLISH坐标值为(IO,100)的点的像素点坐标值,则可
调用LPODP。
CPo1nt Point(100, 100);
CClientDC dc(this);
dc.SetMapMode(M14-LOENGLISH);
dc.LPtoDP(&po。nt);
在响应鼠标单击的命中测试中,LP。DP和DPt。LP是必不可少的。通常鼠标单击后得到
的是设备坐标值,所以如果您已经用MM.LOENGLISH坐标值画了一个矩形,并且想知道鼠
标单击是否发生在这个矩形之内,则需将矩形的逻辑坐标值转换为设备坐标值,或将单击鼠
标得到的设备坐标值转换为逻辑坐标值。否则,您就是在比较不能相提并论的两个事物。
2.1.7移动原点
默认方式下,设备描述表的原点位于显示平面的左上角。即使改变映射模式,也不会改
变原点的位置。然而,同改变映射模式一样,您也可以移动原点。MFC的CDC类提供了两
个可移动原点的函数。 CDC:: Setwindoworg移动窗口的原点, CDC:: SetViewportorg移动视口
的原点。正常情况下,只能使用其中之一。同时使用两个会搞得一团糟。
假设您想将原点移到窗口中心点,以通过将输出中心调整到(O,0)点来使所画的图形处
于窗口中间。假设dC是一个设备描述表对象,可用下面的方法达到上述目的:
CRect rect;
GetCI。entRect(&rect);
dc.SetVieaportorg(rect.Width()/ 2, rect.Height()/ 2);
下面还有另一种方法可做到这一点。假设您是在MM.LOENGLISH映射模式下工作的:
CRect rect;
GetCI。entRect(&rect);
CPO。nt PO。nt(rect.W。dth()/2,rect.Height()/2);
dc.SetMapM。de(M14uLOENGLISH);
dc.DPtoLP(&po。nt);
dc.Setwindoworg(-point.x,-point.y);
虽然SetVeaportorg和Setwilldoworg很容易混淆,但实际上两者间的区别很明显。用
SetViewpoftorg将视口原点移至(X,y)等价于通知 willd0WS把逻辑点(0,0)映射成设备点
(x,y)。用Setwindoworg将窗口原点移至(x,y)则恰恰相反,它等价于告诉Windows将逻辑
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -