Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165727
  • 博文数量: 43
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 675
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-26 00:58
文章分类
文章存档

2014年(2)

2013年(41)

我的朋友

分类: WINDOWS

2013-03-11 19:30:47

这个问题困扰了我好几天,做个笔记
而且虽然动了,但是左左右右的好糊啊,谁让咱方向感不强呢,现在还分不清东南西北。
首先大概解释下设备坐标,分为“屏幕”,“窗口”,“工作区”。
这三种坐标的方向是一样的,X向右为正,Y向下为正。
设备坐标的具体操作都是像素进行的。
实际绘制是以像素进行的,但是人们不习惯,因为不同的机器分辨率,像素是不一样的。所以,人们习惯使用固定的,所见即所得的单位,于是有了逻辑坐标。
举例,在MM_LOMETRIC的映射模式下,0.1mm就是一个单位,画一条长度为10的线就是画了1mm,与设备无关,在哪里显示都是1mm。如果是像素的话,可能这个长度就不一定了。讲到这里可能有人对像素和分辨率不是很清楚,我会另开一篇文章。
这下大概知道逻辑坐标的作用了。
视口是以设备坐标的形式指定的,大多数情况下与客户区相同,原点在左上角,右为X正向,下为Y正向。
窗口时以逻辑坐标指定的。
总共有8种映射模式,因为只有MM_ISOTROPIC,和MM_ANISOTROPIC逻辑与设备比值不一定,所以只有这两种模式可以改变视口和窗口的范围。
但是所有模式都可以改变原点。原点改变其实真正改变的是偏移量。如果原点一样,只是比值不同。(0,-1)点对应设备坐标可能是(0,100)。如果是原点不同,就要将窗口的原点转化为设备坐标,然后做加减。
如果是视口的原点变化(xViewOrg,yViewOrg),那么逻辑原点就会映射到(xViewOrg,yViewOrg)。
如果将窗口的原点变化,那么变化后的逻辑点映射到设备点(0,0).
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
SetWindowOrgEx (hdc, 138, 36, NULL) ;
第一句执行完,逻辑点(0,0)在(cxClient/2,cyClient/2)。
第二句执行完,逻辑点(138,36)映射到(cxClient/2,cyClient/2)。
SetWindowOrgEx (hdc, 138, 36, NULL) ;
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
第一句执行完,逻辑点(138,,36)映射到(0,0)
第二句执行完,逻辑点(138,36)映射到(cxClient/2,cyClient/2)。
这两句的意思就是把视口的中点对应到窗口的中点。
这样可以认为,窗口的原点不一定(0,0)。决定于SetWindowOrgEx(x,y)
SetViewportOrgEx(x1,y1)的任务是将(x,y)进行对应到(x1,y1)。
 
 
SetMapMode (hdc, MM_ISOTROPIC) ;//设置映射模式
SetWindowExtEx (hdc, 276, 72, NULL) ;
SetViewportExtEx (hdc, cxClient, cyClient, NULL) ;
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
SetWindowOrgEx (hdc, 138, 36, NULL) ;
MoveToEx(hdc,138,36,NULL);
LineTo(hdc,238,-136);//位于中间的
这种模式,视口和窗口的原点默认都是左上角,范围指的是向右和向下变化的最大值。这样可以确定方向
第二句和第三句执行了,如果是ISOTROPIC,那么比例就会是cxClient/276和cyClient/72中选择小的,如果是MM_ANISOTROPIC就是各自有各自的比例。
OffsetWindowOrgEx (hdc, -42, 0, NULL) ;
这句话是说窗口原点左移,但是原点对应的视口坐标不变,而视口坐标是设备坐标,相当于在屏幕上整体右移。
为了方便可以看做是两层纸,上面一层是窗口,拿着窗口的标记的原点,往视口上对。如果操作了那一层,就变化后重新对。反正两个点得重合。
阅读(1659) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~