windows中的坐标

1:
//这个函数用来设置坐标轴的朝向以及单位
int SetMapMode(
  HDC hdc,         // handle to device context
  int fnMapMode   // new mapping mode
);
MM_ANISOTROPIC:
MM_HIENGLISH:1逻辑单位是1/1000英寸,X是朝右,Y朝上
MM_HIMETRIC:1逻辑单位是1/100微米,X是朝右,Y朝上
MM_LOENGLISH:1逻辑单位是1/100英寸,X是朝右,Y朝上
MM_LOMETRIC:1逻辑单位是1/10微米,X是朝右,Y朝上
MM_TEXT:1逻辑单位是1设备像素,X是朝右,Y朝下(设备不同时,单位也不同)
MM_TWIPS:1逻辑单位是1打印点的1/20,即(1/1440英寸),X是朝右,Y朝上。

所谓的逻辑坐标就是指以具体的物理单位为实际的单位,从而大小跟具体的设备无关。所谓的设备坐标单位就是指像素了,windows对所有的消息,所有的GDI函数,甚至对一些GDI函数,永远使用设备坐标。

视端口是依据设备坐标,也就是像素
窗口时是依据逻辑坐标,可以使相似,毫米,英寸等。


逻辑点和设备点之间的相互转换
DPtoLP(hdc,pPoints,iNumber);//设备点转换为逻辑点
LPtoDP(hdc,pPoints,iNumber);//逻辑点转换为设备点

坐标原点的改变
SetViewportQrgEx(HDC hdc,int x,int y,LPPOINT lpPoint);//(x,y是设备单位,像素)
SetWindowOrgEx(HDC hdc,int x,int y,LPPOINT lpPoint);//(x,y是逻辑单位)
两个函数的lpPoint 参数是函数返回的原来坐标原点的值。

坐标原点获取
GetViewportOrgEx(HDC hdc,LPPOINT lpPoint);
GetWindowOrgEx(HDC hdc,LPPOINT lpPoint);

细节:
SetViewportOrgEx(hdc,cxClient/2,cyClient/2,&pt);
TextOut(hdc,0,10,TEXT("I Love You"),10);//显示在中间,pt为(0,0)
//SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);//还是显示在中间
SetViewportOrgEx(hdc,pt.x,pt.y,&pt);
TextOut(hdc,0,0,TEXT("What is it AB"),13);//显示在左上角

由以上程序的第3行可以看出,当第2次调用SetViewportOrgEx()时,里面的坐标点还是依据最初始的坐标原点,而不是相对于改变后的坐标原点。其实想想这样是非常合理的,如果要改变原点的次数很多的话,那么每次都要依靠前后两次的相对距离,这样会相当复杂的。(根据原书解释,不管视口和窗口怎么变换,设备点(0,0)始终为显示区域的左上角)



SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,&pt);
TextOut(hdc,0,0,TEXT("I Love You"),10);//此时显示在文本在中间
SetWindowOrgEx(hdc,pt.x,pt.y,NULL);
TextOut(hdc,0,0,TEXT("What is it AB"),13);//此时文本显示在左上角

由以上程序第1行可以看出对于做到相同的显示效果,视口坐标系和窗口坐标系所做的活动室完全相反的,这是因为当视口坐标系进行变换时,这个时候相当于移动的是内容,但是窗口不变。当窗口坐标系进行变换时,此时实际上是内容不动,但是窗口发生移动,从而造成内容产生对窗口的相对移动。此时还有一个问题就是在上面的TextOut(hdc,0,0,TEXT("I Love You"),10);中,坐标(0,0)到底指的什么坐标,它是相对于什么来讲的,如果说是窗口原点的话,这明显是不可能的,所以这种坐标应该是相对于视口原点来讲的。


所以说当移动视口时,设备点(0,0)是不会发生变化的,原因是窗口没有发生变化,但是当移动窗口时,设备点(0,0)发生了变化,不管怎样,设备点(0,0)都要保持和窗口左上端点重合。然后一些画图函数,文字函数等GDI函数,他们的坐标点都是相对于视口原点来说的,而不是相对于窗口。至于其单位当然可以使逻辑单位或者像素了。

再说说连续两次调用SetWindowOrgEx(……),我们再想想第二次调用SetWindowOrgEx(hdc,0,0,NULL)
时,这里的(0,0)坐标又是相对谁的,很明显,这样调用后显示的文字又是显示在左上顶端,说明了(0,0)就是之前的原点
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值