一个简单的问题,什么是设备坐标,逻辑坐标系

扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
什么是逻辑坐标
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
设备坐标和逻辑坐标才是对应,设备坐标是指在屏幕中的实际坐标,而逻辑坐标是虚拟的,我们假想的.设备坐标又可以分为屏幕坐标系、窗口坐标系、客户区坐标系,默认分别以屏幕左上角、窗口左上角、客户区左上角为坐标.默认情况下,设备坐标和逻辑坐标的范围和原点是一样的可以通过API函数来设置.SetWindowOrgEx
SetWindowExtEx
设置逻辑坐标的原点和范围SetViewportOrgEx SetViewportExtEx 设置设备坐标的原点和范围不管如何设置,逻辑坐标和设备坐标系的原点一定相映射.例如用SetWindowOrgEx设置坐标(20,30),即逻辑坐标的20,30与设备坐标的原点对应如果逻辑坐标和设备坐标的范围相同的话,那么逻辑坐标(40,50)与设备坐标(40-20,50-30)对应
为您推荐:
其他类似问题
扫描下载二维码查看:3080|回复:1
复制内容到剪贴板代码:关于逻辑坐标(LP - Logical Point)和设备坐标(DP – Device Point)
& & 对于屏幕,逻辑坐标的原点在最左下角,让整个屏幕在坐标轴的第一象限。设备坐标是在输出设备上定点绘制图形对象是用的,它采用笛卡尔坐标系,原点在屏幕的最左上角,x轴的值自左向右增加,y轴自右向左增加,单位为像素(设备单位)。另外设备坐标是绝对的,逻辑坐标是相对的,可以根据窗口的位置变化来变化的,引用逻辑坐标,就是为了更加直观的来表示屏幕的坐标。还有一种物理坐标,实际上就是设备坐标。
关于逻辑坐标和设备坐标的转换
逻辑坐标转换成设备坐标的函数:
函数原型:
BOOL LptoDP(
LPPOINT lpPoints, 指向POINT结构数组的指针,每一个POINT结构中的X坐标和Y坐标将被转换
int nCount, //指定数组中点的数目,不写则为1
HDC hdc //指向设备环境的句柄。我在写程序的时候,似乎没有写哦,不过也通过了,会不会又是因为写在了CView类里面的原因呢?
& & 如果函数调用成功,返回值为非零值。否则为零。
CPoint pt(0, 0);
pDC-&LPtoDP(&pt);
逻辑坐标转换成设备坐标的函数:
函数原型:
BOOL DptoLP(
HDC hdc, //指向设备环境的句柄。还是没有写过……-_-!!!...
LPPOINT lpPoints, //指向POINT结构数组的指针,每个POINT结构中的X和Y坐标将被转换
int nCount, //规定数组中点的数目,不写则为1
& & 如果函数调用成功,返回值为非零值。否则为零。
CPoint pt(0, 0);
pDC-&DPtoLP(&pt);
注意,里面接的参数不是矩形,而是CPoint类。
GetClientRect的CRect是相对它的窗口的客户区的原点而言的,即它的左上角坐标总是(0,0),大小总是客户区的长宽。GetWindowRect得到的CRect则是相对于屏幕坐标而言的,它的左上角坐标就是窗口在屏幕上的左上角坐标,它的大小就是整个窗口的大小。
ClientToScreen,可以把一个CPoint对象或CRect对象的坐标从客户区坐标系(以客户区左上角为原点)变换为屏幕坐标系(以屏幕左上角为原点)。
// 把对话框的大小变成客户区的大小
void CAboutDlg::OnButton1()
GetClientRect(&myRect);//取得客户区的大小
ClientToScreen(myRect);//转换为屏幕坐标
MoveWindow(myRect.left, myRect.top,
myRect.Width(), myRect.Height());//MoveWindow使用的是屏幕坐标
ScreenToClient,则可以把一个CPoint对象或CRect对象的坐标从屏幕坐标系变换为客户区坐标系。
CPoint pos( ::GetMessagePos() ); //::GetMessagePos() 得到发生事件时鼠标的屏幕坐标
ScreenToClient(&pos);//把它转换为客户区坐标以便随后在绘图时使用
使用以下代码,可以把对话框移到刚好覆盖的地方:
CRect rcT // 整个Tab
CRect rcI // Tab上方的按钮
// 取得并计算要移动的矩形框
m_tab1.GetWindowRect(&rcTab); // 屏幕坐标
ScreenToClient(rcTab); // 化成父窗口的客户区坐标
m_tab1.GetItemRect(0, &rcItem); // 取得Tab上方按钮的大小
rcTab.DeflateRect(0,rcItem.bottom+1,0,0); // 缩小Tab的矩形
// 把对话框移动到这个矩形框上
m_Page1-&MoveWindow(rcTab); // 相对于父窗口的客户区移动
关于这些函数的最权威、最详细的描述,请参看MSDN。
GetClientRect(),GetWindowRect()这两个函数都是CWnd类的成员函数,或称为方法(Method)。所以调用它们得到的矩形都是属于调用它们的那个CWnd对象的窗口的,如m_tab1.GetWindowRect(&rcTab); 得到的矩形rcTab就是Tab控件的窗口大小和位置(屏幕坐标系)。&它的大小就是整个窗口的大小&这句话中说的窗口就是发出GetWindowRect()调用的这个CWnd窗口。GetClientRect(&rect);&
pDC-& SetMapMode(MM_ANISOTROPIC);&
pDC-& SetWindowExt(100,-100);&
pDC-& SetViewportExt(100,100);&
pDC-& SetViewportOrg(rect.left,rect.bottom);&
CPoint&& pointOrg(0,0);&
CPoint&& pointEnd(100,100);&
pDC-& MoveTo(pointOrg);&
pDC-& LineTo(pointEnd);&
但是希望知道在Setwindowext和setviewportext函数中的参数是什么意思?&
发现把里面的100都改写成1000的话效果是一样的。。。&
已经知道了这两个函数可以起到放大缩小的类似效果了
首先,windows程序在画图时,window有一个设备描述表,比如画一个宽为20,高为10单位长度的矩形,注意这个单位长度是对于设备描述表来说的,默认情况下,一个设备描述表单位长度(即逻辑单位)对应一个像素大小,如果需要将逻辑单位与物理单位这个对应改变,就需要使用SetMapMode函数来设置新的映射模式了.比如SetMapMode(LOENGLISH)表示一个逻辑单位映射到视频窗口或者打印机等物理设备时,对于0.01英寸.而SetMapMode(ANIOSTROPIC)表示x,y轴单独缩放.这是既然要单独缩放,比如支持x,y轴的缩放比例.后面的SetWindowExt(a1,b1)和SetViewportExt(a2,b2)正是表示这个缩放比例的.这里表示,x轴缩放比例是a1逻辑长度缩放为物理长度a2,同理,b1缩放为b2.后面的SetViewportOrg(x,y)表示将物理设备的坐标原点移到(x,y)位置.比如显示器默认坐标原点是屏幕的左上角(0,0)位置,而现在移到(x,y)位置,这是平面坐标平移,这个不用详细说了.假设要话一个矩形(0,0,100,100),物理设备原点移到到(x,y)后,本来要在左上角话的矩形,此时实际话在(x,y,100x,100y)的位置上(这里假设显示器左上角为(0,0)坐标).实际上还有一个函数SetWindowOrg(x,y)这个是设置逻辑设备的原点.如果需要知道比较详细,请参考&&mfcwindow编程&&一书
建立以左上角为原点,X轴和Y轴为1000的坐标&
我们可以用以下代码:
void CTtView::OnDraw(CDC* pDC)&
CTtDoc* pDoc = GetDocument();&
ASSERT_VALID(pDoc);&
GetClientRect(&rect);
pDC-&SetMapMode(MM_ANISOTROPIC);&
pDC-&SetViewportOrg(0,0);&
pDC-&SetViewportExt(rect.right,rect.bottom);
pDC-&SetWindowOrg(0,0);&
pDC-&SetWindowExt();
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();来确定逻辑坐标下和设备坐标下的尺寸对应关系
5. 在MM_ANISOTROPIC模式下,X轴单位和Y轴单位可以不相同
6. 坐标方向的确定方法是如果逻辑窗范围和视口范围符号相同,则逻辑坐标的方向和视口的方向相同,即X轴向右为正,Y轴向下为正。
7. 如果将显示模式改为MM_ISOTROPIC,那么X轴单位和Y轴单位一定相同,感兴趣的读者可以自己使一下。
(二) 建立以视窗中心为原点的坐标&
用如下代码:
void CTtView::OnDraw(CDC* pDC)&
CTtDoc* pDoc = GetDocument();&
ASSERT_VALID(pDoc);&
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();
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();来确定设备坐标和逻辑坐标的单位对应关系。
3. 因为逻辑窗范围和视口范围的符号不一致,纵坐标取反,所以Y轴向上为正。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:280次
排名:千里之外

我要回帖

更多关于 消防设备联动逻辑关系 的文章

 

随机推荐