Visual C++第07章 图形、文本和位图

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第7章绘图、字体和位图

Windows的GDI(设备图形接口),提供了绘图的基本工具,如:画点、线、多边形、位图以及文本输出等。MFC的设备环境类CDC封装了全部的绘图函数,使得绘制的图形即可以显示,又可以打印。

7.1概述

Visual C++的CDC(Device Context,设备环境)类是MFC中最重要的类之一,它封装了绘图所需要的操作,是用户编写图形和文字处理程序必不可少的。当然,绘制图形和文字时还必须指定相应的设备环境。设备环境是由Windows保存的一个数据结构,该结构包含应用程序向设备输出时所需要的信息。

1、设备环境类CDC

设备环境是由Windows保存的一个数据结构,该结构包含应用程序向设备输

出时所需要的信息,例如:图形是在屏幕上显示还是通过打印机输出。为了能让用户使用一些特殊的设备环境,基类CDC还派生了以下各类:

(1)CPaintDC类,此类比较特殊,它的构造函数和析构函数都是针对OnPaint进行的。用户一旦获得相关的CDC指针,就可以将它当做任何设备环境(包括屏幕、打印机)指针来使用,CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。

(2)CClientDC和CWindowDC

A、CClientDC只能在窗口的客户区(不包括边框、标题栏、选单栏以及状态栏)

进行绘图,点(0,0)通常指的是客户区的左上角。其构造函数调用GetDC,析构函数调用ReleaseDC函数

B、CWindowDC允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左

上角。其构造函数调用GetWindowDC,析构函数调用ReleaseDC函数。(3)CMetaFileDC封装了在一个Windows图元文件中绘图的方法。图元文件是一系列与设备无关的图片的集合,由于它对图像的保存比像素更精确,因而往往在要求较高的场合下使用,例如:AutoCAD的图像保存等。目前的Windows已使用增强格式(enhanced-format)的32位图元文件来进行操作。

7.1.2坐标映射

在讨论坐标之前,先看下列语句:

pDC->Rectangle(CRect(0,0,200,200));

这是在某个设备环境中绘制一个高为200个像素,宽也为200个像素的方块。由于默认的映射模式是MM_TEXT,其逻辑坐标(在各种映射模式下的坐标)和设备坐标(显示设备或打印设备坐标系下的坐标)相等。因此这个方块在1024*768的显示器上看起来要比在640*480的显示器上显得小一些,而且若将它打印在600dpi 精度的激光打印机上,这个方块就会显得更小了。为了能保证打印的结果不受设备的影响,Windows定义了一些映射模式(如下所示):这些映射决定了设备坐标和逻辑坐标之间的关系。

映射模式含义

MM_TEXT 每个逻辑单位等于一个设备像素,x向右为正,y向下为正MM_HIENGLISH 每个逻辑单位为0.001英寸,x向右为正,y向上为正MM_LOENGLISH 每个逻辑单位为0.01英寸,x向右为正,y向上为正

MM_HIMETRIC 每个逻辑单位为0.01mm,x向右为正,y向上为正

MM_LOMETRIC 每个逻辑单位为0.1mm,x向右为正,y向上为正

MM_TWIPS每个逻辑单位为一个点的1/20(一个点是1/72英寸),x向右为正,y向上为正MM_ANISOTRPIC x,y 可变比例

MM_ISOTROPIC x,y 等比例

这样,我们就可以通过调用CDC::SetMapMode(int nMapMode)来设置相应的映射模式。例如:若将映射模式设置为MM_LOMETRIC,那么不管在什么设备中调用上述语句,都将显示出20*20mm的方块。

而MM_ISOTROPIC映射模式下:纵横比总是1:1,也就是说,无论比例

因子如何变化,圆总是圆的。但,MM_ANISOTROPIC映射模式下,x和y的比例因子可以独立地变化,即圆可以被拉扁成椭圆形状。

在映射模式MM_ANISOTROPIC和MM_ISOTROPIC中,常常可以调用CDC::SetWindowExt(设置窗口大小)和CDC::SetViewportExt(设置视口大小)函数来设置所需要的比例因子。

“窗口”和“视口”的概念往往不易理解。所谓“窗口”,可以理解是一种逻辑坐标下的窗口,而“视口”是我们实际看到的那个窗口,也就是设备坐标下的窗口,根据“窗口”和“视口”的大小就可以确定x和y的比例因子,它们的关系如下:

x比例因子=视口x大小/窗口x大小

y比例因子=视口y大小/窗口y大小

例:将一个椭圆绘制在视窗中央,且当视图的大小发生改变时,椭圆的形状也会随之改变。(301页)(通过设置窗口和视口大小来改变显示的比例)

(1)建一个单文档应用程序,名为“椭圆的绘制”

(2)在View类的OnDraw函数里加如下代码:

void CMyView::OnDraw(CDC* pDC)

{

//CMyDoc* pDoc = GetDocument();

//ASSERT_V ALID(pDoc);

CRect rectClient;//定义矩形对象

GetClientRect(rectClient);//获得当前窗口的客户区大小

pDC->SetMapMode(MM_ANISOTROPIC);//设置MM_ANISOTROPIC映射模式pDC->SetWindowExt(1000,1000);//设置窗口范围

pDC->SetViewportExt(rectClient.right,-rectClient.bottom);//设置视口范围

pDC->SetViewportOrg(rectClient.right/2,rectClient.bottom/2);//设置视口原点

pDC->Ellipse(CRect(-500,-500,500,500));//椭圆的4个坐标点

// TODO: add draw code for native data here

}

(3)编译运行,当你改变窗口大小,椭圆也随之改变。

7.1.3 CPoint、CSize和CRect

在图形绘制操作中,常常需要使用MFC中的CPoint(点)、CSize(大小)和CRect(矩形)等简单数据类。它们是对Windows的POINT、SIZE和RECT结构的封装,因此它们可以直接使用各自结构的数据成员,如下所示:(302--305)typedef struct tagPOINT

{ LONG x; //点的x坐标

LONG y; //点的y坐标

}POINT;

Typedef struct tagSIZE

{ int cx; //水平大小(表示矩形的宽度)

int cy; //垂直大小(表示矩形的高度)

}SIZE;

相关文档
最新文档