关于SetWindowOrg和SetViewportOrg函数的说明!
来源:互联网 发布:淘宝怎么设置客服旺旺 编辑:程序博客网 时间:2024/06/07 00:06
关于这两个函数的解释,我就不详细叙述了,我的前两篇博客关于这两个函数的内容已经讲的比较清楚了,有需要的同学可以找一找!我只是记录一下我自己使用的心得!
先确定几点:
1.默认的时候,视口坐标原点在屏幕显示部分的左上角。
先来热一下身:
void CmfcAppView::OnDraw(CDC* pDC){CmfcAppDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;CRect rect; GetClientRect(&rect);CBrush brush(RGB(255, 0, 0));/*红色的画刷*/CPen pen(PS_SOLID, 3, RGB(0, 0, 255)); /*蓝色的笔*/pDC->SelectObject(&brush);pDC->SelectObject(&pen);/** 通常这个SetViewportOrg函数调用多次实际上就只有最后的一次起效果!如同下面的语句。* pDC->SetWindowOrg(100, 100),这句有或者没有都不影响结果!* 我是这样理解的,程序里记录着一张逻辑坐标表.第一次时,逻辑坐标系原点被移至(100, 100)这个点!*当然,这个点是相对于程序记录的那个逻辑坐标系为准的。第二次时,逻辑坐标系被移至原点(-100, -100)*这个点,这个点也是相对于程序记录的那个逻辑坐标系而言的。我们看到,第一次等于没做。* (每次调用SetWindowOrg都以这张逻辑坐标为准!)*/pDC->SetWindowOrg(100, 100);pDC->SetWindowOrg(-100, -100);pDC->Rectangle(0, 0, 150, 150);}结果是:
再来看一看这段:
void CmfcAppView::OnDraw(CDC* pDC){CmfcAppDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;CRect rect; GetClientRect(&rect);CBrush brush(RGB(255, 0, 0));/*红色的画刷*/CPen pen(PS_SOLID, 3, RGB(0, 0, 255));/*蓝色的笔*/pDC->SelectObject(&brush);pDC->SelectObject(&pen);pDC->Rectangle(0, 0, 150, 150);/*先画一个矩形*/pDC->SetWindowOrg(-100, -100); /*将逻辑坐标系原点移至(-100, -100),相对于原来的那个逻辑坐标系而言*/pDC->Rectangle(0, 0, 150, 150);/*再画一个矩形*//**看了结果,有人很疑惑,怎么上面那个矩形没有随着逻辑坐标一起移动?*整个程序的客户区你可以看做是一块画布啦!怎么会有已经画好的东西,还可以移动的道理,你说算是吧?**/}结果是:
好吧!接下来搞点有技术含量的:
void CmfcAppView::OnDraw(CDC* pDC){CmfcAppDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;CRect rect; GetClientRect(&rect);CBrush brush(RGB(255, 0, 0));/*红色的画刷*/CPen pen(PS_SOLID, 3, RGB(0, 0, 255));/*蓝色的笔*/pDC->SelectObject(&brush);pDC->SelectObject(&pen);pDC->SetWindowOrg(100, 100); /*将逻辑坐标系原点移至(-100, -100),相对于原来的那个逻辑坐标系而言*/pDC->Rectangle(0, 0, 150, 150);/*再画一个矩形*/}结果是:
有人奇怪上面的结果了,为什么矩形只剩下大约1/4的位置了?
看一下这段程序:
void CmfcAppView::OnDraw(CDC* pDC){CmfcAppDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;CRect rect; GetClientRect(&rect);CBrush brush(RGB(255, 0, 0));/*红色的画刷*/CPen pen(PS_SOLID, 3, RGB(0, 0, 255));/*蓝色的笔*/pDC->SelectObject(&brush);pDC->SelectObject(&pen);pDC->SetViewportOrg(100, 100); /*将视口坐标系原点移至(-100, -100),相对于原来的那个视口坐标系而言*/pDC->Rectangle(0, 0, 150, 150);/*画一个矩形*/}想一想结果,然后和真实的结果比对一下:
我的解释如下:
在看一下这段代码,然后猜一下结果?
void CmfcAppView::OnDraw(CDC* pDC){CmfcAppDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;CRect rect; GetClientRect(&rect);CBrush brush(RGB(255, 0, 0));/*红色的画刷*/CPen pen(PS_SOLID, 3, RGB(0, 0, 255));/*蓝色的笔*/pDC->SelectObject(&brush);pDC->SelectObject(&pen);pDC->SetViewportOrg(100, 100); /*将视口坐标系原点移至(100, 100),相对于原来的那个视口坐标系而言*/pDC->SetWindowOrg(-100, -100); /*将逻辑(窗口)坐标系原点移至(100, 100),相对于原来的那个逻辑坐标系而言*/pDC->Rectangle(0, 0, 150, 150);/*画一个矩形*/}让我们来核对一下:
是不是感到有些奇怪?看一下我的解释!
对于上面的第3步,有人感到很奇怪,为什么画矩形的时候是以变换前的逻辑坐标为准的?而不是以变换后的逻辑坐标为准的?
看一下结果的精确测量:
看见没有,测量的结果说明,我上面的原理图是正确的!
关于解释,我的解释是:SetWindowOrg函数并未实际上改变逻辑坐标,只是通知程序应该怎样映射,该把逻辑坐标的这个点映射到视口坐标的哪个点!应该比较清楚了吧?
最好,这两个函数别同时用,因为两个混在一起,很容易糊涂!
既然都讲了这么多了,顺带提一下SetViewportExt和SetWindowExt两个函数吧!这两个函数只在映射模式为MM_ISOTROPIC和MM_ANISOTROPIC下有效!两个函数里面参数的值并不重要,重要的只是他们的比值罢了!
看这段代码:
pDC->SetMapMode(MM_ANISOTROPIC);pDC->SetWindowExt(1024,768);pDC->SetViewportExt(10240,7680);//表示一个窗口单位,也就是在x轴上逻辑单位对应10个视口单位,当然屏幕上表示像素,在y轴上亦然pDC->Rectangle(0,0,100,100);和下面这段代码:
pDC->SetMapMode(MM_ANISOTROPIC);pDC->SetWindowExt(10240,7680);pDC->SetViewportExt(102400,76800); //表示一个窗口单位,也就是在x轴上逻辑单位对应10个视口单位,当然屏幕上表示像素,在y轴上亦然pDC->Rectangle(0,0,100,100);两者在效果上没有区别!
还有,两者的正负会影响坐标轴的方向!当然,这不是这篇文章的重点!
6 0
- 关于SetWindowOrg和SetViewportOrg函数的说明!
- 关于SetWindowOrg和SetViewportOrg函数的说明!
- SetWindowOrg与SetViewportOrg函数的用法浅见
- 对SetViewportOrg和SetWindowOrg的理解
- SetWindowExt,SetViewportExt,SetWindowOrg和SetViewportOrg的理解
- SetWindowOrg和SetViewportOrg
- SetWindowOrg和SetViewportOrg
- windows编程中关于设置映象模式的四个函数SetWindowOrg SetViewPortOrg SetMapMode SetWindowExtEx SetViewPortExtEx
- windows编程中关于设置映象模式的四个函数SetWindowOrg SetViewPortOrg SetMapMode SetWindowExtEx SetViewPortExtEx .
- SetWindowOrg和SetViewportOrg这两个函数到底应该如何理解
- SetViewportOrg与SetWindowOrg的区别
- SetViewportOrg与SetWindowOrg的理解
- SetWindowOrg SetViewportOrg DC 的坐标
- SetWindowOrg & SetViewportOrg
- SetWindowOrg SetViewportOrg DC 的坐标形象解释
- SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt
- SetViewportOrg与SetWindowOrg
- [转]mfc编程中SetViewportOrg与SetWindowOrg的理解
- LA 3644 X-Plosives / 并查集
- Java中的Calendar方法
- 实时开发框架Meteor API解读系列<二>Core
- 七款代码味道识别工具【简介】
- ZOJ-2529
- 关于SetWindowOrg和SetViewportOrg函数的说明!
- mysql数据库连接简单分析 dao的应用
- jquery实现当前页面按钮点击全屏,点击退出全屏
- 新浪微博小爬虫
- 配置ftp yum 源
- wubi使用amd64.tar.xz安装64位ubuntu
- apache for opensuse
- 序
- FusionCharts重写单系列图