VC++中实现坐标系.docx

上传人:b****4 文档编号:6057803 上传时间:2023-05-09 格式:DOCX 页数:7 大小:142.79KB
下载 相关 举报
VC++中实现坐标系.docx_第1页
第1页 / 共7页
VC++中实现坐标系.docx_第2页
第2页 / 共7页
VC++中实现坐标系.docx_第3页
第3页 / 共7页
VC++中实现坐标系.docx_第4页
第4页 / 共7页
VC++中实现坐标系.docx_第5页
第5页 / 共7页
VC++中实现坐标系.docx_第6页
第6页 / 共7页
VC++中实现坐标系.docx_第7页
第7页 / 共7页
亲,该文档总共7页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

VC++中实现坐标系.docx

《VC++中实现坐标系.docx》由会员分享,可在线阅读,更多相关《VC++中实现坐标系.docx(7页珍藏版)》请在冰点文库上搜索。

VC++中实现坐标系.docx

VC++中实现坐标系

[hbl原创]VC自定义坐标系

2008-05-0321:

45

在用VC绘图的时候,需要自定义坐标系,即改变坐标的映射模式,在网上查找了很多相关的知识,也还是很糊涂,天极网上有一篇文章(有位Hier也转载了这篇文章,或者也许他就是作者),图文并貌,稍微详细一些,但也只是侧重讲解了固定比例映射模式,而可变比例模式只是一带而过了。

后来自己写了程序进行测试,终于明白了可变比例映射模式,与大家分享。

讲理论我不在行,一些迫切需要这方面知识的网友看起来也费劲,我们就来看一个例子吧:

假设我们进行如下图所示的坐标变换:

将默认坐标系(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);//首先设置模式为可变比例模式

   pDc->SetViewportExt(1,1);

   pDc->SetWindowExt(2,-4);

执行了上述语句后,坐标系就变成了这样,如下图所示:

我们来验证一下:

voidCDrawTest2Dlg:

:

OnButton1()

{

   CPenPenRed;

   PenRed.CreatePen(PS_SOLID,1,RGB(255,0,0));

   CPen*OldPen=pDc->SelectObject(&PenRed);

   pDc->MoveTo(0,120);

   pDc->LineTo(512,0);//从左下角到右上角的一条红色直线

   pDc->SetMapMode(MM_ANISOTROPIC);//可变比例模式

   pDc->SetViewportExt(1,1);

   pDc->SetWindowExt(2,-4);

   CPenPenGreen;

   PenGreen.CreatePen(PS_SOLID,1,RGB(0,255,0));

   pDc->SelectObject(&PenGreen);

   pDc->MoveTo(0,0);

   pDc->LineTo(1024,-480);//从左上角到右下角的一条绿色直线

}

运行后的结果:

接下来我们还要改变原点的位置。

使用SetViewportOrg(x,y),但此时的疑问是,这里的(x,y)坐标是以什么坐标系为参考的呢,如果以改变前的坐标系,即默认坐标系为参考,则(x,y)为(0,100),但如果以改变后的坐标系为参照的话,那么(x,y)为(0,-400)。

经过测试验证,(x,y)是以默认坐标系为参照的,即SetViewportOrg()函数完全不受坐标映射的影响。

(x,y)应该为(0,100)。

我们来验证一下:

voidCDrawTest2Dlg:

:

OnButton1()

{

   CPenPenRed;

   PenRed.CreatePen(PS_SOLID,1,RGB(255,0,0));

   CPen*OldPen=pDc->SelectObject(&PenRed);

   pDc->MoveTo(0,120);

   pDc->LineTo(512,0);//从左下角到右上角的一条红色直线

   pDc->SetMapMode(MM_ANISOTROPIC);//!

可变比例模式

   pDc->SetViewportExt(1,1);

   pDc->SetWindowExt(2,-4);

   CPenPenGreen;

   PenGreen.CreatePen(PS_SOLID,1,RGB(0,255,0));

   pDc->SelectObject(&PenGreen);

   pDc->MoveTo(0,0);

   pDc->LineTo(1024,-480);//从左上角到右下角的一条绿色直线

   pDc->SetViewportOrg(0,100);//改变原点

   CPenPenBlue;

   PenBlue.CreatePen(PS_SOLID,1,RGB(0,0,255));

   pDc->SelectObject(&PenBlue);

   pDc->MoveTo(0,0);

   pDc->LineTo(1024,400);//从原点到右上角的一条蓝色直线

   pDc->MoveTo(0,0);

   pDc->LineTo(1024,-80);//从原点到左下角的一条蓝色直线

}

运行后的结果:

基于可变比例映射模式完成的应用程序:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2