招标代理机构选取办法:基于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度位置,而是位于坐标系统的第四象限,造成这种情况的原因是默认的坐标系统。