VC++中实现坐标系Word格式.docx
《VC++中实现坐标系Word格式.docx》由会员分享,可在线阅读,更多相关《VC++中实现坐标系Word格式.docx(7页珍藏版)》请在冰点文库上搜索。
将默认坐标系(MM_TEXT)下的矩形(0,0,512,120),变成可变比例映射模式下的(0,400,1024,-480)。
注意,前两位是左上角的坐标,后两位是该坐标系下长和宽的值,负号表示方向,而且,长和宽的实际长度并未改变,改变的只是坐标的比例。
首先,我们利用MFCAppWizard创建一个对话框类型的应用程序(我的工程名叫DrawTest2)。
在对话框主界面上删除不必要的控件,放置两个一样大小的图片框(取名分别为IDC_STATIC_PIC,IDC_STATIC_PIC2,第二个图片框是用来对比的),如图所示:
此时,我们无法控制图片框的大小,不像VB,可以在控件的属性中直接设置它的长宽。
我们需要在初始化函数中使用SetWindowPos函数来改变图片框的大小,SetWindowPos函数使用在一些Hier的博客上有很详细的讲解。
BOOLCDrawTest2Dlg:
:
OnInitDialog().
{
//...
//调整控件大小,pWnd,pDc已经是类的成员变量
pWnd=GetDlgItem(IDC_STATIC_PIC);
pWnd->
SetWindowPos(NULL,0,0,512,120,SWP_NOZORDER|SWP_NOMOVE);
//调整长宽为(512,120)
pDc=pWnd->
GetDC();
returnTRUE;
}
运行后的结果:
此时,图片框1的长和宽就变成(512,120),单位是像素。
(MM_TEXT坐标映射模式:
每一个逻辑单位对应一个像素)
接下来开始改变坐标系,使用SetViewPortExt(),SetWindowExt()函数。
坐标的比例关系是长512:
1024,宽120:
-480,即1:
2,1:
-4。
所以我们用下面的语句来完成坐标变换。
pDc->
SetMapMode(MM_ANISOTROPIC);
//首先设置模式为可变比例模式
SetViewportExt(1,1);
SetWindowExt(2,-4);
执行了上述语句后,坐标系就变成了这样,如下图所示:
我们来验证一下:
voidCDrawTest2Dlg:
OnButton1()
CPenPenRed;
PenRed.CreatePen(PS_SOLID,1,RGB(255,0,0));
CPen*OldPen=pDc->
SelectObject(&
PenRed);
MoveTo(0,120);
LineTo(512,0);
//从左下角到右上角的一条红色直线
//可变比例模式
CPenPenGreen;
PenGreen.CreatePen(PS_SOLID,1,RGB(0,255,0));
PenGreen);
MoveTo(0,0);
LineTo(1024,-480);
//从左上角到右下角的一条绿色直线
运行后的结果:
接下来我们还要改变原点的位置。
使用SetViewportOrg(x,y),但此时的疑问是,这里的(x,y)坐标是以什么坐标系为参考的呢,如果以改变前的坐标系,即默认坐标系为参考,则(x,y)为(0,100),但如果以改变后的坐标系为参照的话,那么(x,y)为(0,-400)。
经过测试验证,(x,y)是以默认坐标系为参照的,即SetViewportOrg()函数完全不受坐标映射的影响。
(x,y)应该为(0,100)。
//!
可变比例模式
SetViewportOrg(0,100);
//改变原点
CPenPenBlue;
PenBlue.CreatePen(PS_SOLID,1,RGB(0,0,255));
PenBlue);
LineTo(1024,400);
//从原点到右上角的一条蓝色直线
LineTo(1024,-80);
//从原点到左下角的一条蓝色直线
基于可变比例映射模式完成的应用程序: