基于VC++的GDI常用坐标系统及应用Word文件下载.docx

上传人:b****7 文档编号:22063274 上传时间:2023-02-02 格式:DOCX 页数:31 大小:359.24KB
下载 相关 举报
基于VC++的GDI常用坐标系统及应用Word文件下载.docx_第1页
第1页 / 共31页
基于VC++的GDI常用坐标系统及应用Word文件下载.docx_第2页
第2页 / 共31页
基于VC++的GDI常用坐标系统及应用Word文件下载.docx_第3页
第3页 / 共31页
基于VC++的GDI常用坐标系统及应用Word文件下载.docx_第4页
第4页 / 共31页
基于VC++的GDI常用坐标系统及应用Word文件下载.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

基于VC++的GDI常用坐标系统及应用Word文件下载.docx

《基于VC++的GDI常用坐标系统及应用Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于VC++的GDI常用坐标系统及应用Word文件下载.docx(31页珍藏版)》请在冰豆网上搜索。

基于VC++的GDI常用坐标系统及应用Word文件下载.docx

  

(二)设备坐标。

图形输出时,Windows将GDI函数中指定的逻辑坐标映射为设备坐标,在所有的设备坐标系统中,单位以像素点为准,水平值从左到右增大(正方向向右),垂直值从上到下增大(正方向向下)。

Windows中包括以下3 种设备坐标,以满足各种不同需要:

  1、客户区域坐标,包括应用程序的客户区域,客户区域的左上角为(0, 0)。

  2、屏幕坐标,包括整个屏幕,屏幕的左上角为(0, 0)。

屏幕坐标用在WM_MOVE消息中(对于非子窗口)以及下面的Windows 函数中:

CreateWindow 和MoveWindow(都对于非子窗口)、GetMessage、GetCursorPos、GetWindowRect、WindowFromPoint 和SetBrushOrg 中。

 用函数ClientToScreen 和ScreenToClient可以将客户区域坐标转换成屏幕区域坐标,或反之。

  3、全窗口坐标,包括一个程序的整个窗口,包括标题条、菜单、滚动条和窗口框,窗口的左上角为(0,0)。

使用GetWindowDC得到的窗口设备环境,可以将逻辑单位转换成窗口”坐标。

  (三)映射。

映射方式定义了Windows如何将GDI函数中指定的逻辑坐标映射为设备坐标。

在下文中我们将介绍常用的映射方式。

  此外,习惯上,我们将逻辑坐标所在的坐标系称为“窗口”;

将设备坐标所在的坐标系称为“视口”。

“窗口”依赖于逻辑坐标,可以是像素点、毫米或其他尺度。

这一点请牢记,这对于下面的有关内容的理解至关重要。

  二、默认的坐标系统

  当在微软的窗口中进行绘图时,绘图的坐标原点在屏幕的左上角,任何物体在屏幕上定位都要参考这个坐标原点。

在笛卡尔坐标系统中这个点被定义为坐标原点(0,0),水平坐标轴的正方向是从该点出发向右延伸,垂直坐标轴的正方向是从该点出发向下延伸。

图一、笛卡尔坐标系

  这个坐标原点只是操作系统默认的坐标原点,所以如果你调用Ellipse(-100, -100, 100, 100)函数来绘制图形的话,你将得到一个圆,它的圆心位于屏幕的左上角,仅仅只有圆的四分之一部分(270度到360度的部分)显示在屏幕上。

代码及效果图如下 

void CExoDraw1View:

:

OnPaint() 

{

 CPaintDC dc(this);

 // 绘图的设备厂上下文

 CPen PenBlue;

 // 兰色画笔

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

 dc.SelectObject(&

pPen);

 dc.Ellipse(-100, -100, 100, 100);

}

  图二、代码效果图 

  按照同样的原理,你可以使用CpaintDC的方法或按照你的要求创建函数来绘制任何几何或非几何图形。

例如,下面的代码绘制了两条相互垂直的直线,垂点位与窗口的中心:

OnPaint()  

 // 绘图的设备上下文

 CRect Recto;

PenBlue);

 CPen PenBlack;

 PenBlack.CreatePen(PS_SOLID, 1, BLACK_PEN);

PenBlack);

 // 得到客户区域的尺寸;

 GetClientRect(&

Recto);

 dc.MoveTo(Recto.Width() / 2, 0);

 dc.LineTo(Recto.Width() / 2, Recto.Height());

 dc.MoveTo(0, Recto.Height() / 2);

 dc.LineTo(Recto.Width(), Recto.Height() / 2);

 图三、代码效果图

  三、更改坐标系统

  正如上面所看到的,默认的坐标系统坐标原点位于窗口的左上角,水平轴的正方向向右,垂直轴的正方向向下。

为了进一步说明这一点,让我们来绘制一个半径为50个单位,圆心位于(0,0)点,同时绘制一个连接(0,0)(100,100)两点的直线。

 // 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个单位,这时绘制函数如下:

 //绘图的设备上下文;

 dc.SetViewportOrg(200, 150);

 // 圆心位于坐标原点(0, 0)

 // 连接(0, 0) 和 (100, 100)点的直线;

 图五、代码效果图 

  需要注意的是,你也可以相对于客户区域来指定坐标原点

 //获取客户区尺寸;

 dc.SetViewportOrg(Recto.Width() / 2, Recto.Height() / 2);

  图六、代码效果图 

  现在你已了解了如何设置坐标原点,让我们来将(380,220)点作为坐标原点,并绘制出笛卡尔的坐标轴:

 dc.SetViewportOrg(380, 220);

 // Use a red pen

 CPen PenRed(PS_SOLID, 1, RGB(255, 0, 0));

 dc.SelectObject(PenRed);

 // 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度角的直线:

 // An orange pen

 CPen PenOrange(PS_SOLID, 1, RGB(255, 128, 0));

 dc.SelectObject(PenOrange);

 // A diagonal line at 45 degrees

 dc.LineTo(120, 120);

 图九、代码效果图 

  正如你所看到的,我们的直线没有在45度位置,而是位于坐标系统的第四象限,造成这种情况的原因是默认的坐标系统。

  三、固定映射模式

  为了控制设备上下文中的坐标轴的方向,可以使用CDC类的SetMapMode()函数,它的语法如下:

int SetMapMode(int nMapMode);

  这个函数将根据参数的设置的不同做两件事,一是控制坐标轴的方向;

二是坐标系统的单位长度。

  这个函数的参数是用来定义映射模式的整型常量。

它可能的值是:

MM_TEXT, MM_LOENGLISH、MM_HIENGLISH、MM_ANISOTROPIC、MM_HIMETRIC, MM_ISOTROPIC、 MM_LOMETRIC, MM_TWIPS。

  默认情况下使用MM_TEXT映射模式。

换句话说,如果你没有具体的规定某一映射模式,你的应用程序就将使用MM_TEXT映射模式。

在这种映射模式下,设备上下文中的度量尺寸将使用默认的像素单位,水平坐标轴正方向向右,垂直坐标轴正方向向下。

例如,上面的OnPaint事件可以用下面的代码重写,它将产生同样的效果,仿佛没有使用映射模式。

 dc.SetMapMode(MM_TEXT);

图十、代码效果图

  MM_LOENGLISH模式,与其他一些映射模式(不包括MM_TEXT模式)一样,执行两个动作,它改变坐标轴的方向,垂直坐标轴的正方向向上;

图十一、MM_LOENGLISH映射模式下的坐标系

  此外,度量单位改为0.01英寸,这意味着你提供的坐标将除以100,观察上述代码的MM_LOENGLISH映射效果

 dc.SetMapMode(MM_LOENGLISH);

 . . .

图十二、代码效果图

  正如你所看到的,直线现在位于坐标系的第一象限,同时,直线比以前缩短,圆也比以前的要小。

  与MM_LOENGLISH映射模式相似,MM_HIENGLISH映射模式也是垂直坐标轴正向向上,只是它以0.001英寸为坐标单位,下面是它的效果:

 dc.SetMapMode(MM_HIENGLISH);

 . . . Same as previous

图十三、代码效果图

  MM_LOMETRIC映射模式使用与上两种映射模式相同的坐标轴,不同的是MM_LOMETRIC使用0.1毫米为单位,下面是一个例子:

 // device context for painting 

 dc.SetMapMode(MM_LOMETRIC);

图十四、代码效果图

  MM_HIMETRIC使用与上述三种映射模式相同的坐标系,但它的坐标单位是0.01毫米,下面例子代码如下:

 dc.SetMapMode(MM_HIMETRIC);

图十五、代码效果图 

  MM_TWIPS映射模式将每个逻辑单位(像素)除以20,实际上一twip等于1/1440 英寸,坐标系统仍然与上面几种映射方式相同。

 dc.SetMapMode(MM_TWIPS);

图十六、代码效果图

  四、自定义坐标系统

  目前为止,我们使用的映射模式可以允许我们选择坐标轴的方向,但仅仅是Y轴的方向。

而且,我们不能更改坐标系统的单位,这是因为各种映射模式(MM_TEXT, MM_HIENGLISH, MM_LOENGLISH, MM_HIMETRIC, MM_LOMETRIC, and MM_TWIPS)有固定的属性集,例如坐标轴的方向和坐标单位等。

在CAD应用程序中,如果你需要灵活设置坐标轴方向及坐标单位的话,应该怎么做呢?

  仔细研究下面的OnPaint()事件代码,它绘制了一个200X200像素大小的红边、浅绿色背景的正方形,这个正方形的顶点在(-100,-100)处,右底端位于(100,100)处。

同时,从坐标原点处绘制一个45度的直线。

 CBrush BrushAqua(RGB(0, 255, 255));

 dc.SelectObject(BrushAqua);

 // Draw a square with a red border and an aqua background

 dc.Rectangle(-100, -100, 100, 100);

 CPen BluePen(PS_SOLID, 1, RGB(0, 0, 255));

 dc.SelectObject(BluePen);

 // Diagonal line at 45 degrees starting at the origin (0, 0)

 dc.LineTo(200, 200);

图十七、代码效果图

  正如你所看到的,我们只得到了正方形的右下部分,同时直线指向时钟的三点到六点之间的方向。

假定你想将坐标原点设置与窗口中央位置,或者是更精确一点,设置于点(340, 220)处,我们已经知道可以使用CDC:

SetViewportOrg()(记住,这个函数只用来更改坐标原点,它并不影响坐标轴的方向及坐标单位。

同时,需要注意的是,它使用的坐标单位是像素)函数,下面是一个例子(我们没有规定映射模式,所以程序使用的是默认的MM_TEXT映射模式)。

 dc.SetViewportOrg(340, 220);

图十八、代码效果图 

  为了控制你自己应用程序中的坐标系统单位,坐标轴的方向,可以使用MM_ISOTROPIC 或MM_ANISOTROPIC映射模式。

第一件事是调用CDC:

SetMapMode()函数,并在两个常量中选择一个(MM_ISOTROPIC或 MM_ANISOTROPIC)。

下面是例子代码:

 CPaintDC d

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

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1