A. VC 图形编辑 求助!
用设备坐标捕捉点坐标后,将其转换为逻辑坐标
转换方法如下:
CClientDC dc(this);
然后和绘图之前所做的 SetViewMode,SetViewportOrg,SetWindowOrg 一致的方法对这个dc做变换
最后转换
dc.LPtoDP(&point);
可以创建一个函数,在绘图前和转换前调用:
MyPrepareDC(CDC * pdc)
{
SetViewMode(...
SetViewOrg...
SetWindowOrg.....
}
然后继承 OnPrepareDC 去调用这个函数
OnPrepareDC( CDC * pDC,...)
{
MyPrepareDC(pDC);
}
这样就可以在其他地方使用了
CClientDC dc(this);
MyPrepareDC(&dc);
dc.LPtoDP(&point);
B. 求教C++:MSDN上说DPtoLP函数能将设备坐标转化为逻辑坐标,请问转化后的逻辑坐标存在哪里
函数原型:BOOL DPtoLP(HDC hdc, LPPOINT lpPoints, int nCount);参数:hdc:指向设备环境的句柄。lpPoints:指向POINT结构数组的指针,每个POINT结构中的X和Y坐标将被转换。
lpPoints所指的指在调用完DPtoLP后会被修改
C. vc逻辑坐标和设备坐标的问题
如果我说的对,你加分给我呀!
你的概念好模糊呀!
1.绘图函数用的全是逻辑坐标。
2.显示器分辨率就是象素点!800*600,就是800个象素宽乘以600个象素高的矩阵。也就是说坐标最大值就是800和600,与显示器大小无关,只与显示器分辨率设置有关。这叫"设备无关性"
3.MM_HIMETRIC映射模式下,1逻辑单位等于0.001毫米(不是0.01mm)。假设你的显示器高150mm,那么逻辑坐标Y=150000;那么逻辑坐标与设备坐标的转换比是:150000:800=187.5
4.CPoint point(5, 6); 5,6全是逻辑值
5.dc.LPtoDP(&point); 5/18.75=0.266;6/18.75=0.32。而像素应是正整数。当然就是0了。
6.dc.DPtoLP(&point); //转换后:x=156, y = -187
将(0,0)程序计数都是从0数的,不是1.所以坐标是0,数值应是1,转换成逻辑坐标是187.5,坐标类型是整数就变成187了。同理:600象素点是X,转换后就变成了0,156了
怎么样,明白了就加分给我吧,我也是初学者,想清这个理花了我4天,近50个小时。没功劳也有苦劳呀!
D. 什么是逻辑坐标和设备坐标
对于屏幕,逻辑坐标是第一象限,设备坐标是第四象限,当然数值都是正值。
就是说屏幕的逻辑坐标是左下角是原点,整个屏幕都处于第一象限。
屏幕的设备坐标是左上角是原点。
E. VC中的坐标点如何确定
建立以左上角为原点,X轴和Y轴为1000的坐标
我们可以用以下代码:
void CTtView::OnDraw(CDC* pDC)
{
CTtDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(&rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetViewportOrg(0,0);
pDC->SetViewportExt(rect.right,rect.bottom);
pDC->SetWindowOrg(0,0);
pDC->SetWindowExt(1000,1000);
pDC->MoveTo(50,50);
pDC->LineTo(50,950);
pDC->LineTo(950,950);
pDC->LineTo(50,50);
}
代码分析:
1. GetClientRect(&rect); 取得客户区矩形区域,将其存放在rect中
2. 用pDC->SetMapMode(MM_ANISOTROPIC); 设置映射模式
3. 通过pDC->SetViewportOrg(0,0);设置逻辑坐标的原点
4. 通过pDC->SetViewportExt(rect.right,rect.bottom);和
pDC->SetWindowExt(1000,1000);来确定逻辑坐标下和设备坐标下的尺寸对应关系
5. 在MM_ANISOTROPIC模式下,X轴单位和Y轴单位可以不相同
6. 坐标方向的确定方法是如果逻辑窗范围和视口范围符号相同,则逻辑坐标的方向和视口的方向相同,即X轴向右为正,Y轴向下为正。
7. 如果将显示模式改为MM_ISOTROPIC,那么X轴单位和Y轴单位一定相同,感兴趣的读者可以自己使一下。
(二) 建立以视窗中心为原点的坐标
用如下代码:
void CTtView::OnDraw(CDC* pDC)
{
CTtDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(&rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetViewportOrg(rect.right/2,rect.bottom/2);
pDC->SetViewportExt(rect.right,rect.bottom);
pDC->SetWindowOrg(0,0);
pDC->SetWindowExt(1000,-1000);
pDC->MoveTo(150,150);
pDC->LineTo(-150,-200);
pDC->LineTo(150,-150);
pDC->LineTo(150,150);
}
代码分析:
1. 用 pDC->SetViewportOrg(rect.right/2,rect.bottom/2); 设置视口的原点。
2. 用pDC->SetViewportExt(rect.right,rect.bottom);和pDC->SetWindowExt(1000,-1000);来确定设备坐标和逻辑坐标的单位对应关系。
3. 因为逻辑窗范围和视口范围的符号不一致,纵坐标取反,所以Y轴向上为正。
F. 怎样用VC改变对话框的逻辑坐标急!!!!!!!!!!
试试 SetWindowPos()
G. 设备坐标到逻辑坐标的转换
如果逻辑坐标与设备坐标不同,在构造 ClientDC后,需要设置它的逻辑坐标系,否则它是按MM_TEXT方式工作,这会使得DPtoLP没啥变化。
我一般是在重载的OnPrepareDC中处理设置逻辑坐标,这样在鼠标消息的函数中,得到ClientDC后,再调一下这个函数。
H. 你好!想向您请教一些VC++中有管设备坐标和逻辑坐标的问题
设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标。通常将屏幕上的设备坐标称为屏幕坐标。设备坐标用对象距离窗口左上角的水平距离和垂直距离来指定对象的位置,是以像素为单位来表示的,设备坐标的X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。
逻辑坐标(Logical Coordinate)是系统用作记录的坐标。在缺省的模式(MM_TEXT)下,逻辑坐标的方向和单位与设备坐标的方向和单位相同,也是以像素为单位来表示的,X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。
更详细,更参考http://blog.csdn.net/pathuang68/archive/2009/05/27/4219657.aspx或者搜索孙鑫的VC++教程,里面讲的很清楚。
I. delphi如何实现设备坐标和逻辑坐标的转换
装备坐标,就是物理坐标,比如,你的显示装备1024×768,1个像素代表1个物理坐标点。逻辑坐标,可以说是虚拟坐标,1般情况下,逻辑和物理坐标是有映照关系的,要绘制逻辑坐标,必须要先映照成对应的物理坐标,才可以。