转//视口与窗口
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这两种模式中才有效。
不知道我理解的对不对,欢迎高手指正!
窗口,指的是一个虚拟的屏幕,基于逻辑坐标系统
视口,视图客户区域,基于设备坐标系统
设备坐标系统以像素为单位
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这两种模式中才有效。
不知道我理解的对不对,欢迎高手指正!
相关文章推荐
- 关于“视口”与“窗口”
- 窗口与视口深入理解
- Archie OSG Step By Step⑦MFC修改鼠标,制作半透明窗口,视口全屏以及添加背景音乐。
- VC++例说Windows窗口、视口以及GDI映射模式
- 窗口、视口、屏幕显示详解--计算机绘图基本功
- 从窗口到视口的映射
- BOM:窗口位置、页面视口大小、window.open
- 窗口、视口
- 窗口和视口的关系
- Qt窗口-视口机制分析
- 窗口和视口
- VC++例说Windows窗口、视口以及GDI映射模式
- 窗口和视口
- VC++例说Windows窗口、视口以及GDI映射模式
- 窗口、视口、屏幕显示详解--计算机绘图基本功
- 用 OpenGL 函数实现二维观察的窗口与视区的映射变换,修改视口定义函数,熟悉窗口与视区的概念
- 逻辑坐标,设备坐标,窗口,视口
- 视口和窗口的理解方法
- 【js学习笔记-087】----文档和元素的几何形状和滚动(视口与窗口)
- 窗口,视口图解