您的位置:首页 > 其它

转//视口与窗口

2015-05-06 09:01 169 查看
转自:http://topic.csdn.net/t/20021013/14/1092563.html

窗口,指的是一个虚拟的屏幕,基于逻辑坐标系统

视口,视图客户区域,基于设备坐标系统

设备坐标系统以像素为单位

VC中绘制图形时,

先将图形以逻辑设备坐标绘制在窗口中,

再把内容映射到视口中(以设备坐标进行转换),

映射的基准就是 窗口原点、视口原点,两个原点重合,实现 “平移映射

此二原点是一一对应的,其他点根据到窗口(视口)原点的距离来绘制,当然也采取相应的坐标系统,窗口原点、视口原点的作用也就在此.

注意坐标系的原点和窗口(视口)原点的区分,两者是有区别的,提供窗口、视口其实也是为了实现设备无关性

example:

pDC-> SetMapMode(MM_TEXT);

pDC-> SetWindowOrg(CPoint(50, 50));

pDC-> Rectangle(CRect(0, 0, 150, 150));

// = pDC-> Rectangle(CRect(50, 50, 150, 150));

后两行的代码在视口中显示效果是一样的, 因为CRect(0, 0, 150, 150) 和

CRect(50, 50, 150, 150)中值都是基于逻辑坐标系统的原点,不要受到什么窗口原点、视口原点的影响.

呵呵,这两天我也被这个问题弄的头痛,书上说的语焉不详的,看了徒增迷惑,sigh!

刚才做了个试验,终于搞懂了。

.窗口原点是和视口的原点重合的。逻辑坐标系和设备坐标系是两个独立的坐标系(注意,他们的原点并没有联系,也不重合),为了显示,就必须确定他们的映射关系,很简单,把逻辑坐标系中的窗口原点和设备坐标系的视口原点重合。

例子:

pDC-> SetMapMode(MM_TEXT);

//SetMapMode只是设置逻辑坐标系的坐标轴方向,最小刻度

pDC-> SetWindowOrg(CPoint(50, 50));

//他并不改变绘图是的原点坐标,他表示从逻辑坐标系的(50,50)点开始显示下面那个矩形

pDC-> Rectangle(CRect(0, 0, 150, 150));

//他表示在逻辑坐标系中,从逻辑坐标的原点画一个长宽都是150的矩形,在逻辑坐标系中显示为右边和下边,长都是100,其他的不在显示区,都看不到了。对应到客户区,由于这里没有SetViewOrg,系统默认的是客户区的左上角(这也是设备坐标的原点),那么在屏幕上,就从你的客户区的左上角开始显示,也是矩形的右边和下边,长100

// = pDC-> Rectangle(CRect(50, 50, 150, 150));

//他表示在逻辑坐标系中,从逻辑坐标的(50,50)画一个长宽都是100的矩形,在逻辑坐标系中,由于都在显示区,所以显示为一长宽都是100的矩形,对应到客户区,开始从客户区的左上角显示一个长宽都是100的矩形

这两个矩形显示是一样大小的,但第一个是没有上边和左边的。

SetMapMode只是设置逻辑坐标系的坐标轴方向,最小刻度,他跟屏幕坐标是没有什么联系的,等于你在纸上随手画的一个坐标系。他们的只有在要显示图形的时候才有联系,把两个坐标系重叠起来,窗口原点和视口原点对齐就行了。

SetWindowExt和SetViewExt只有在MM_ANISOTROPIC 和MM_ISOTROPIC这两种模式中才有效。

不知道我理解的对不对,欢迎高手指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: