招标代理机构选取办法:基于VC++的GDI常用坐标系统及应用 (2)
来源:百度文库 编辑:偶看新闻 时间:2024/05/04 09:58:47
三、更改坐标系统
正如上面所看到的,默认的坐标系统坐标原点位于窗口的左上角,水平轴的正方向向右,垂直轴的正方向向下。为了进一步说明这一点,让我们来绘制一个半径为50个单位,圆心位于(0,0)点,同时绘制一个连接(0,0)(100,100)两点的直线。
void CExoDraw1View::OnPaint() { CPaintDC dc(this); // device context for painting // A circle whose center is at the origin (0, 0) dc.Ellipse(-50, -50, 50, 50); // A line that starts at (0, 0) and ends at (100, 100) dc.MoveTo(0, 0); dc.LineTo(100, 100); }
图四、代码效果图 这种默认的坐标原点在大多数图形操作情况下是适用的,但并不是总适用,有时你需要控制坐标系统的原点,例如,很多CAD(图形辅助设计)应用程序就需要用户来定义坐标系统的原点。
MFC提供了各种函数来处理坐标定位及扩展绘制区域的问题,包括在屏幕上任意位置设置坐标原点的函数。因为你是在一个设备上下文上进行绘图操作,因此,你所需要做的就是调用CDC::SetViewportOrg()函数。这个函数重载了两个版本,这允许你使用X、Y坐标或是一个定义的Point点。这个函数的语法如下:
SetViewportOrg(int X, int Y); SetViewportOrg(CPoint Pt); 调用这个函数时只需要简单地说明哪儿是你想定义的坐标原点,如果使用函数的第二个版本,参数可以是一个POINT结构或是一个MFC提供的Tpoint类。为了演示这个函数的效果,让我们将上例的坐标原点沿X轴正方向移动200个单位,Y轴正方向移动150个单位,这时绘制函数如下: void CExoDraw1View::OnPaint() { CPaintDC dc(this); //绘图的设备上下文; dc.SetViewportOrg(200, 150); // 圆心位于坐标原点(0, 0) dc.Ellipse(-50, -50, 50, 50); // 连接(0, 0) 和 (100, 100)点的直线; dc.MoveTo(0, 0); dc.LineTo(100, 100); }
图五、代码效果图
需要注意的是,你也可以相对于客户区域来指定坐标原点
void CExoDraw1View::OnPaint() { CPaintDC dc(this); //绘图的设备上下文; CRect Recto; //获取客户区尺寸; GetClientRect(&Recto); dc.SetViewportOrg(Recto.Width() / 2, Recto.Height() / 2); // A circle whose center is at the origin (0, 0) dc.Ellipse(-50, -50, 50, 50); // A line that starts at (0, 0) and ends at (100, 100) dc.MoveTo(0, 0); dc.LineTo(100, 100); }
图六、代码效果图
现在你已了解了如何设置坐标原点,让我们来将(380,220)点作为坐标原点,并绘制出笛卡尔的坐标轴:
void CExoDraw1View::OnPaint() { CPaintDC dc(this); // device context for painting CRect Recto; dc.SetViewportOrg(380, 220); // Use a red pen CPen PenRed(PS_SOLID, 1, RGB(255, 0, 0)); dc.SelectObject(PenRed); // A circle whose center is at the origin (0, 0) dc.Ellipse(-100, -100, 100, 100); // Use a blue pen CPen PenBlue(PS_SOLID, 1, RGB(0, 0, 255)); dc.SelectObject(PenBlue); // Horizontal axis dc.MoveTo(-380, 0); dc.LineTo(380, 0); // Vertical axis dc.MoveTo(0, -220); dc.LineTo(0, 220); }
图七、代码效果图
正如已经看到的,SetViewportOrg()函数可以更改设备上下文的坐标原点,同时,它也用来规定坐标轴的正方向,即水平轴向右,垂直轴向下:
图八、坐标轴示意图
为了说明这一点,下面来绘制一条黄色的45度角的直线: void CExoDraw1View::OnPaint() { CPaintDC dc(this); // device context for painting dc.SetViewportOrg(380, 220); // Use a red pen CPen PenRed(PS_SOLID, 1, RGB(255, 0, 0)); dc.SelectObject(PenRed); // A circle whose center is at the origin (0, 0) dc.Ellipse(-100, -100, 100, 100); // Use a blue pen CPen PenBlue(PS_SOLID, 1, RGB(0, 0, 255)); dc.SelectObject(PenBlue); // Horizontal axis dc.MoveTo(-380, 0); dc.LineTo(380, 0); // Vertical axis dc.MoveTo(0, -220); dc.LineTo(0, 220); // An orange pen CPen PenOrange(PS_SOLID, 1, RGB(255, 128, 0)); dc.SelectObject(PenOrange); // A diagonal line at 45 degrees dc.MoveTo(0, 0); dc.LineTo(120, 120); }
图九、代码效果图
正如你所看到的,我们的直线没有在45度位置,而是位于坐标系统的第四象限,造成这种情况的原因是默认的坐标系统。
正如上面所看到的,默认的坐标系统坐标原点位于窗口的左上角,水平轴的正方向向右,垂直轴的正方向向下。为了进一步说明这一点,让我们来绘制一个半径为50个单位,圆心位于(0,0)点,同时绘制一个连接(0,0)(100,100)两点的直线。
void CExoDraw1View::OnPaint() { CPaintDC dc(this); // device context for painting // A circle whose center is at the origin (0, 0) dc.Ellipse(-50, -50, 50, 50); // A line that starts at (0, 0) and ends at (100, 100) dc.MoveTo(0, 0); dc.LineTo(100, 100); }
图四、代码效果图 这种默认的坐标原点在大多数图形操作情况下是适用的,但并不是总适用,有时你需要控制坐标系统的原点,例如,很多CAD(图形辅助设计)应用程序就需要用户来定义坐标系统的原点。
MFC提供了各种函数来处理坐标定位及扩展绘制区域的问题,包括在屏幕上任意位置设置坐标原点的函数。因为你是在一个设备上下文上进行绘图操作,因此,你所需要做的就是调用CDC::SetViewportOrg()函数。这个函数重载了两个版本,这允许你使用X、Y坐标或是一个定义的Point点。这个函数的语法如下:
SetViewportOrg(int X, int Y); SetViewportOrg(CPoint Pt); 调用这个函数时只需要简单地说明哪儿是你想定义的坐标原点,如果使用函数的第二个版本,参数可以是一个POINT结构或是一个MFC提供的Tpoint类。为了演示这个函数的效果,让我们将上例的坐标原点沿X轴正方向移动200个单位,Y轴正方向移动150个单位,这时绘制函数如下: void CExoDraw1View::OnPaint() { CPaintDC dc(this); //绘图的设备上下文; dc.SetViewportOrg(200, 150); // 圆心位于坐标原点(0, 0) dc.Ellipse(-50, -50, 50, 50); // 连接(0, 0) 和 (100, 100)点的直线; dc.MoveTo(0, 0); dc.LineTo(100, 100); }
图五、代码效果图
需要注意的是,你也可以相对于客户区域来指定坐标原点
void CExoDraw1View::OnPaint() { CPaintDC dc(this); //绘图的设备上下文; CRect Recto; //获取客户区尺寸; GetClientRect(&Recto); dc.SetViewportOrg(Recto.Width() / 2, Recto.Height() / 2); // A circle whose center is at the origin (0, 0) dc.Ellipse(-50, -50, 50, 50); // A line that starts at (0, 0) and ends at (100, 100) dc.MoveTo(0, 0); dc.LineTo(100, 100); }
图六、代码效果图
现在你已了解了如何设置坐标原点,让我们来将(380,220)点作为坐标原点,并绘制出笛卡尔的坐标轴:
void CExoDraw1View::OnPaint() { CPaintDC dc(this); // device context for painting CRect Recto; dc.SetViewportOrg(380, 220); // Use a red pen CPen PenRed(PS_SOLID, 1, RGB(255, 0, 0)); dc.SelectObject(PenRed); // A circle whose center is at the origin (0, 0) dc.Ellipse(-100, -100, 100, 100); // Use a blue pen CPen PenBlue(PS_SOLID, 1, RGB(0, 0, 255)); dc.SelectObject(PenBlue); // Horizontal axis dc.MoveTo(-380, 0); dc.LineTo(380, 0); // Vertical axis dc.MoveTo(0, -220); dc.LineTo(0, 220); }
图七、代码效果图
正如已经看到的,SetViewportOrg()函数可以更改设备上下文的坐标原点,同时,它也用来规定坐标轴的正方向,即水平轴向右,垂直轴向下:
图八、坐标轴示意图
为了说明这一点,下面来绘制一条黄色的45度角的直线: void CExoDraw1View::OnPaint() { CPaintDC dc(this); // device context for painting dc.SetViewportOrg(380, 220); // Use a red pen CPen PenRed(PS_SOLID, 1, RGB(255, 0, 0)); dc.SelectObject(PenRed); // A circle whose center is at the origin (0, 0) dc.Ellipse(-100, -100, 100, 100); // Use a blue pen CPen PenBlue(PS_SOLID, 1, RGB(0, 0, 255)); dc.SelectObject(PenBlue); // Horizontal axis dc.MoveTo(-380, 0); dc.LineTo(380, 0); // Vertical axis dc.MoveTo(0, -220); dc.LineTo(0, 220); // An orange pen CPen PenOrange(PS_SOLID, 1, RGB(255, 128, 0)); dc.SelectObject(PenOrange); // A diagonal line at 45 degrees dc.MoveTo(0, 0); dc.LineTo(120, 120); }
图九、代码效果图
正如你所看到的,我们的直线没有在45度位置,而是位于坐标系统的第四象限,造成这种情况的原因是默认的坐标系统。
3. 参照分布式和企业系统结构、及应用开发的重点明显地转向基于构件的应用开发
VC++开发应用系统的过程
参照分布式和企业系统结构、及应用开发的重点明显地转向基于构件的应用开发,讨论以下问题:
3种常用模具材料的名称,性能及应用
CDMA系统基于RAKE接收机的研究及设计
基于WEB数据库的应用
哪里有免费的毕业论文下载—基于vc的图像处理系统
VC的应用问题
门禁系统的原理及应用、破解
基于VC++的即时串口通信
VC++中基于对话框的编程。
vc中如何将BMP颜色的对比得到坐标系统??
单片机原理及应用中常用芯片的的型号及封装形式?
什么是基于客户机的网络电子地图应用系统?它有哪些主要实现技术?
4. 什么是基于客户机的网络电子地图应用系统?它有哪些主要实现技术
请问谁能够做一个基于uml的彩票销售及管理系统,急
基于delphi的试题库系统
开发商用的基于WEB的应用系统,比较大的.用什么语言开发比较好
在线等!用MFC设计一个基于单文档或对话框的应用系统,帮忙构思一下.
谁有数据库系统及应用的教学大纲啊??
有关“数据库系统及应用”的网页和网站
VC中基于对话框的编程如何改变按钮显示?
VC中基于对话框的编程如何改变按钮显示?
VC中基于对话框的编程如何获得按钮标题?