最近在看VC++技术内幕这本书,对于逻辑与设备坐标转换的部分不是很清楚。在处理对象时,有时用设备坐标,有时用逻辑坐标,请问哪些情况下用设备坐标,哪些情况下用逻辑坐标呢?请指点!
比如说书上P91页的例EX05C的程序中1.2.3.4.5.所示的地方为什麽需要这样转换呢?void CEx05cView::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect rectEllipse(m_pointTopLeft, m_sizeEllipse); // still logical
CRgn circle; CClientDC dc(this);
OnPrepareDC(&dc);
dc.LPtoDP(rectEllipse); ---------------------------------1.
circle.CreateEllipticRgnIndirect(rectEllipse);
if (circle.PtInRegion(point)) {
SetCapture();
m_bCaptured = TRUE;
CPoint pointTopLeft(m_pointTopLeft);
dc.LPtoDP(&pointTopLeft);----------------------------2.
m_sizeOffset = point - pointTopLeft;
::SetCursor(::LoadCursor(NULL, IDC_IBEAM ));
}
}void CEx05cView::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bCaptured) {
CClientDC dc(this);
OnPrepareDC(&dc);
CRect rectOld(m_pointTopLeft, m_sizeEllipse);
dc.LPtoDP(rectOld);------------------------------------3.
InvalidateRect(rectOld, TRUE);
m_pointTopLeft = point - m_sizeOffset;
dc.DPtoLP(&m_pointTopLeft);----------------------------4.
CRect rectNew(m_pointTopLeft, m_sizeEllipse);
dc.LPtoDP(rectNew);------------------------------------5.
InvalidateRect(rectNew, TRUE);
}
}
比如说书上P91页的例EX05C的程序中1.2.3.4.5.所示的地方为什麽需要这样转换呢?void CEx05cView::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect rectEllipse(m_pointTopLeft, m_sizeEllipse); // still logical
CRgn circle; CClientDC dc(this);
OnPrepareDC(&dc);
dc.LPtoDP(rectEllipse); ---------------------------------1.
circle.CreateEllipticRgnIndirect(rectEllipse);
if (circle.PtInRegion(point)) {
SetCapture();
m_bCaptured = TRUE;
CPoint pointTopLeft(m_pointTopLeft);
dc.LPtoDP(&pointTopLeft);----------------------------2.
m_sizeOffset = point - pointTopLeft;
::SetCursor(::LoadCursor(NULL, IDC_IBEAM ));
}
}void CEx05cView::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bCaptured) {
CClientDC dc(this);
OnPrepareDC(&dc);
CRect rectOld(m_pointTopLeft, m_sizeEllipse);
dc.LPtoDP(rectOld);------------------------------------3.
InvalidateRect(rectOld, TRUE);
m_pointTopLeft = point - m_sizeOffset;
dc.DPtoLP(&m_pointTopLeft);----------------------------4.
CRect rectNew(m_pointTopLeft, m_sizeEllipse);
dc.LPtoDP(rectNew);------------------------------------5.
InvalidateRect(rectNew, TRUE);
}
}
解决方案 »
- VS2008出现不合适的参数
- (MFC新手)怎么调用编译器
- 带有行列的东东及阴影,很Beautiful的,这是用什么实现的?是VC控件吗?付图片
- 如何将ToolBar中的按钮与类关联???
- vc运行问题
- 我正在做一个播放器,想把上面播放进度的滑动块改成其它形状,请问该如何做?谢谢!
- 怎样实现“TOOLBAR工具栏为灰色图片,当鼠标放在上面时鲜亮!”
- 如何使属性页在用Domodal建立时,不出现“确定”,"取消“按钮。急!
- 如何获取系统时间改变?
- 关于分割窗口中CListView的使用(我只能给36分,各位帮帮小妹吧)
- 用Navigate2浏览网页可以指定Referer地址吗?
- 请教关于点击系统托盘后弹出的菜单界面问题!
其次,想想哪些时候能用到设备坐标,比如对DC,只有附着于可见窗口的DC才和设备坐标能联系起来,所以一般来说都是逻辑坐标,而需要的时候再LPtoDP;再比如鼠标位置,因为是直接在显示器上反映的,所以常见的是设备坐标。一般来说,大致都可以判断的。有些函数的坐标系不是很好判断的时候,就需要用MSDN了。
设备坐标是描述在屏幕和打印机显示或打印的窗体的一种坐标体系。默认的坐标原点是在其客户区的左上角。X轴向右为正,Y轴向下为正。度量单位为象素。原点和坐标轴方向可以改变,但是度量单位不可以改变。逻辑坐标
逻辑坐标是在程序中控制显示,打印使用的坐标体系。该坐标系与定义的映射模式密切相关。默认的映射模式是MM_TEXT。我们可以通过设置不同的映射模式来改变该坐标体系的默认行为。
在默认映射模式MM_TEXT下,一个逻辑单位对应于设备坐标下的一个象素
http://dev.yesky.com/121/2018121.shtml
然后要把内容画在输出设施上的时候,就需要转成设备坐标,然后画在设备上