VC++60入门第五章图形和文本输出.docx

上传人:b****1 文档编号:1784364 上传时间:2023-05-01 格式:DOCX 页数:52 大小:239.43KB
下载 相关 举报
VC++60入门第五章图形和文本输出.docx_第1页
第1页 / 共52页
VC++60入门第五章图形和文本输出.docx_第2页
第2页 / 共52页
VC++60入门第五章图形和文本输出.docx_第3页
第3页 / 共52页
VC++60入门第五章图形和文本输出.docx_第4页
第4页 / 共52页
VC++60入门第五章图形和文本输出.docx_第5页
第5页 / 共52页
VC++60入门第五章图形和文本输出.docx_第6页
第6页 / 共52页
VC++60入门第五章图形和文本输出.docx_第7页
第7页 / 共52页
VC++60入门第五章图形和文本输出.docx_第8页
第8页 / 共52页
VC++60入门第五章图形和文本输出.docx_第9页
第9页 / 共52页
VC++60入门第五章图形和文本输出.docx_第10页
第10页 / 共52页
VC++60入门第五章图形和文本输出.docx_第11页
第11页 / 共52页
VC++60入门第五章图形和文本输出.docx_第12页
第12页 / 共52页
VC++60入门第五章图形和文本输出.docx_第13页
第13页 / 共52页
VC++60入门第五章图形和文本输出.docx_第14页
第14页 / 共52页
VC++60入门第五章图形和文本输出.docx_第15页
第15页 / 共52页
VC++60入门第五章图形和文本输出.docx_第16页
第16页 / 共52页
VC++60入门第五章图形和文本输出.docx_第17页
第17页 / 共52页
VC++60入门第五章图形和文本输出.docx_第18页
第18页 / 共52页
VC++60入门第五章图形和文本输出.docx_第19页
第19页 / 共52页
VC++60入门第五章图形和文本输出.docx_第20页
第20页 / 共52页
亲,该文档总共52页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

VC++60入门第五章图形和文本输出.docx

《VC++60入门第五章图形和文本输出.docx》由会员分享,可在线阅读,更多相关《VC++60入门第五章图形和文本输出.docx(52页珍藏版)》请在冰点文库上搜索。

VC++60入门第五章图形和文本输出.docx

VC++60入门第五章图形和文本输出

第5章图形和文本输出

精讲

Windows使用图形设备接口(GDI)进行图形输出和文本输出,MFC封装了GDI对象,提供了CGdiObject类和CDC类支持图形输出和文本输出,本章你将学习使用CGdiObject类和CDC类在视图中输出各种图形和文本的方法和技巧。

5.1图形设备接口和CDC

5.1.1图形设备接口(GDI)

Windows操作系统通过图形设备接口,简称GDI(GraphicsDeviceInterface),管理Windows程序的所有图形输出,包括显示在屏幕上的窗口,屏幕保护程序的运行,文档的打印。

GDI处理与不同输出设备的连接,从而应用程序开发者不需要去考虑基础硬件设备之间的不同。

应用程序可以使用GDI创建3种类型的图形输出:

矢量图形、光栅图形和文本。

1.矢量图形

矢量图形输出是指创建线和填充图形,包括点、直线、曲线、多边形、扇形和矩形。

2.光栅图形

光栅图形输出是指光栅图形函数对以位图形式存储的数据进行操作,它包括各种位图和图标的输出。

在屏幕上表现为对若干行和列的像素操作,在打印机上则是若干行和列的点阵输出。

光栅图形是直接从内存到显存的拷贝操作,所以速度快,但是对内存要求高。

3.文本

文本输出是GDI的另一项任务。

输出文本时文本的输出位置的计算不是以行为单位,而是以逻辑坐标为单位计算。

用户可以设置文本的各种效果,如加粗、斜体、设置颜色等。

MFC处理图形输出是通过设备上下文CDC类和图形对象CGdiObject类来完成的。

5.1.2绘图工具GDI对象CGdiObject

CGdiObject是MFC提供绘图工具的类,它的派生类包括画笔(CPen)、画刷(CBrush)、字体(CFont)、位图(CBitmap)、调色板(CPalette)、区域(CRgn)等,它们的继承关系如图5-1所示。

图5-1CGdiObject类的构成

各个派生类的任务是:

1.画笔(CPen)

封装GDI画笔,用于绘制对象的边框以及直线和曲线。

默认画笔用于绘制与一个像素等宽的黑色实线。

2.画刷(CBrush)

封装GDI画刷。

画刷是用来填充一个封闭的图形对象(如矩形,圆形)的内部区域。

默认的画刷颜色是白色。

3.字体(CFont)

封装GDI字体对象,用户可以建立一种GDI字体,并使用CFont的成员函数来访问它。

主要影响文本输出的效果,包括文字的大小、是否加粗、是否斜体、是否加下划线等。

4.位图(CBitmap)

封装GDI位图,提供成员函数装载和位图操作,位图可以用于填充区域。

5.调色板(CPalette)

封装GDI调色板,保存系统可用的色彩信息,是应用程序和彩色输出设备上下文的接口。

6.区域(CRgn)

封装GDI区域。

区域是窗口内的一块多边形或椭圆形区域。

CRgn用于设备上下文(通常是窗口)内的区域操作。

CRgn通常与CDC类中与裁剪(clipping)有关的成员函数配合使用。

5.1.3设备描述表(DC)

设备上下文(DeviceContext),简称DC,是由GDI创建用来代表设备连接的数据结构。

DC的主要功能有:

(1)允许应用程序使用一个输出设备。

(2)提供窗口应用程序,设备驱动,和输出设备之间的连接。

(3)保存当前信息,例如在一个窗口内绘图使用的颜色,画笔的宽度、画刷的类型等等。

(4)保存窗口剪取区域(clippingregion),限制程序输出到输出设备中窗口覆盖的区域。

5.1.4设备上下文类(CDC)

MFC封装了DC,提供CDC类及它的子类访问GDI,如图5-2所示,各类作用介绍如下。

CObject

CDC

CClientDC

CMetaFileDC

CPanitDC

CWindowDC

 

图5-2CDC及子类

1.CDC类

封装了所有图形输出函数,包含了一个DC的创建和初始化,及通用GDI对象的操作,包括画简单图形(如线、矩形、椭圆)和复杂的功能(如区域、位图、剪切区域)的操作。

CDC类的适应范围最广,不仅能支持窗口,还能支持打印机。

2.ClientDC类

CClientDC又名客户区设备上下文,用于客户区的输出,一般在响应非窗口消息并对客户区绘图时要用到该类,例如在鼠标双击时要输出文本等。

3.CPaintDC

CPaintDC用于响应窗口重绘消息(WM_PAINT)的绘图输出,不仅可对客户区进行操作,还可以对非客户区进行操作。

4.CWindowDC

CWindowDC用于窗口客户区和非客户区(包括窗口边框、标题栏、控制按钮等)的绘制,除非要自己绘制窗口的边框和按钮,否则一般不用它。

5.CMetaFileDC

CMetaFileDC专门用于图元文件的绘制。

图元文件记录一组GDI操作命令,可以通过这一组GDI命令重建图形输出。

使用CMetaFileDC时,所有的图形输出命令会自动记录到一个与CMetaFileDC相关的图元文件中。

5.1.5OnDraw函数

当用AppWizard创建单文档或多文档应用程序时,视图类包含成员函数OnDraw()函数,CDC指针被传递给OnDraw()函数,下面的程序清单5-1显示了在视图窗口中输出一行文本的一个简单的OnDraw()函数。

程序清单5-1:

用于输出的OnDraw()函数

voidCExam5View:

:

OnDraw(CDC*pDC)

{

CExam5Doc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

//TODO:

adddrawcodefornativedatahere

pDC->TextOut(1,1,”helloworld!

”);

}

当视图窗口或窗口的一部分需要重绘时,系统会发给窗口一个WM_PAINT消息,MFC的窗口框架会将该消息映射到CWnd:

:

OnPaint()函数,OnPaint()函数创建一个DC,并调用视图的OnDraw()函数。

5.1.6WM_PAINT

WM_PAINT消息是最重要的绘图消息,它要求窗口重新绘制内容。

产生WM_PAINT消息的场合通常有:

(1)窗口移动后及最大化,最小化后的刷新。

(2)被覆盖区域的刷新,如下拉菜单覆盖的区域。

(3)无效区域产生后的刷新,如执行滚动条操作,将一区域移动至不可见。

有时数据发生变化时,需要人为生成一个绘制消息,重绘窗口,可以调用几个CWnd的函数。

表5-1产生绘制消息的函数

函数举例

说明

Invalidate(TRUE);

此函数声明整个客户区无效

CRectRect(1,1,300,300)

InvalidateRect(&Rect,TRUE)

此函数声明选定的区域无效,这样可以减少因重绘而产生的屏幕闪烁

5.1.7获取设备上下文(DC)

绘图前必须准备好设备上下文(DC),在一个MFC应用程序获得DC的常用方法有两种:

一种是接受一个参数为指向CDC对象的指针,另一种是构造CClientDC对象。

一些消息处理函数可以通过参数接受指向CDC对象的指针,如OnDraw()函数。

程序清单5-2:

用于输出一个黑点的OnDraw()函数

voidCExam5View:

:

OnDraw(CDC*pDC)

{

CExam5Doc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

//TODO:

adddrawcodefornativedatahere

//在坐标为10,10的位置上画一点,颜色为黑色

pDC->SetPixel(CPoint(10,10),RGB(0,0,0));

}

也可以使用CClientDC类创建一个局部DC对象,例如,在键盘响应消息处理函数和鼠标响应消息处理函数中要进行文本输出或图形绘制时,通常要创建一个这样的对象,并使用this指针为该对象赋值。

程序清单5-3:

在鼠标点击画一红点的鼠标左键单击消息处理函数

voidCExam5View:

:

OnLButtonDown(UNITnFlags,CPointpoint)

{

//TODO:

adddrawcodefornativedatahere

CClientDCdc(this);//this指针将CExam5View赋值给创建的dc对象

dc.SetPixel(point,RGB(255,0,0));

CView:

:

OnLButtonDown(nFlags,point);

}

5.1.8编程实例

【例5-1】编写一个单文档MFC(EXE)程序Exam5_1,在视图类增加成员变量,追踪鼠标左键双击的最新坐标,并输出坐标信息,运行效果如图5-3所示。

图5-3实例Exam5_1运行效果

1.使用AppWizard创建一个单文档MFC(EXE程序)

2.为视图类增加成员变量记录坐标并初始化

(1)选择WorkSpace的ClassView标签,右键单击CExam5_1View类。

在弹出的快捷菜单中选择AddMemberVariable菜单项,增加CPoint类的公有成员变量m_LPoint。

(2)在CExam5_1View类的构造函数CExam5_1View()中,初始化变量m_LPoint为[0,0]。

如程序清单5-4所示。

程序清单5-4:

CPoint类型对象引用

CExam5_1View:

:

CExam5_1View()

{

//TODO:

addconstructioncodehere

m_LPoint.x=0;

m_LPoint.y=0;

}

3.在OnDraw()函数中添加代码,在第一行输出成员变量的值。

如程序清单5-5粗体部分所示。

程序清单5-5:

在视图中输出整型数据的OnDraw()函数

voidCExam5_1View:

:

OnDraw(CDC*pDC)

{

CExam5_1Doc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

//TODO:

adddrawcodefornativedatahere

CStringstr;

str.Format(“鼠标左键双击的位置是[%d,%d]”,m_LPoint.x,m_LPoint.y);

pDC->TextOut(0,0,str);

}

4.在视图类增加鼠标左键双击的消息映射,修改成员变量,更新视图

(1)打开ClassWizard,选择MessageMap标签,ClassName列表中选择CExam5_1View,ObjectIDS列表中选择CExam5_1View,Messages列表中选择WM_LBUTTONDBLCLK,单击“AddFunction”按钮,添加鼠标左键双击消息映射。

(2)单击“EditCode”按钮,添加处理代码,用当前鼠标位置Point值替换m_LPoint的值,并设置无效区域,刷新视图。

程序清单5-6:

产生重绘消息的鼠标消息处理函数

voidCExam5_1View:

:

OnLButtonDblClk(UINTnFlags,CPointpoint)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

m_LPoint=point;

Invalidate(TRUE);

CView:

:

OnLButtonDblClk(nFlags,point);

}

5.编译、链接、执行,可得到如图5-3所示的结果

5.2处理文本

在窗口应用程序中经常使用GDI处理文本输出,文本的输出过程包括文本的属性设置、字体设置、文本格式化、调用文本输出函数输出文本等具体的过程,下面将分别讲述。

5.2.1设置文本颜色

在窗口操作系统中采用32位来表示颜色,MFC和SDK采用COLORREF数据结构表示颜色,COLORREF的结构如图5-4所示,采用8位(值域范围为0-255)分别表示红、蓝、绿三色。

定义颜色的最简单的方法是使用RGB()宏,它采用三个参数,用0-255的值来表示红色、蓝色、绿色。

同样使用宏GetRValue(),GetGValue(),GetBValue()可以从一个COLORREF类型的变量中分离三元色。

.

图5-4颜色的表示

常用设备颜色清单

//基本三元色

COLORREFcrRed=RGB(255,0,0);

COLORREFcrGreen=RGB(0,255,0);

COLORREFcrBlue=RGB(0,0,255)

//16-color设备支持颜色

constCOLORREFg_crBlack=RGB(0,0,0);

constCOLORREFg_crYellow=RGB(255,255,0);

constCOLORREFg_crDkYellow=RGB128,128,0);

constCOLORREFg_crRed=RGB(255,0,0);

constCOLORREFg_crDkRed=RGB(128,0,0);

constCOLORREFg_crMagenta=RGB(255,0,255);

constCOLORREFg_crDkMagenta=RGB128,0,128);

constCOLORREFg_crBlue=RGB(0,0,255);

constCOLORREFg_crDkBlue=RGB(0,0,128);

constCOLORREFg_crCyan=RGB(0,255,255);

constCOLORREFg_crDkCyan=RGB(0,128,128);

constCOLORREFg_crGreen=RGB(0,255,0);

constCOLORREFg_crDkGreen=RGB(0,128,0);

constCOLORREFg_crGray=RGB(192,192,192);

constCOLORREFg_crDkGray=RGB(128,128,128);

constCOLORREFg_crWhite=RGB(255,255,255);

//256色设备支持的颜色举例

constCOLORREFg_crLtYellow=RGB(255,251,240);

constCOLORREFg_crLtGreen=RGB(192,220,192);

constCOLORREFg_crLtBlue=RGB(166,202,240);

constCOLORREFg_crMedGreen=RGB(160,160,164);

设置颜色的场合有设置文本颜色、设置画笔和画刷的颜色。

设置画笔和画刷的颜色的方法我们将在介绍GDI对象时讲述,设置文本颜色包括设置前景色和背景色。

(1)为了设置在绘制文本的前景像素时使用的颜色,调用CDC:

:

SetTextColor(),函数定义如下:

COLORREFSetTextColor(COLORREFcrColor);

(2)为了设置在绘制文本的背景像素时使用的颜色,调用CDC:

:

SetBkColor(),函数定义如下:

COLORREFSetBkColor(COLORREFcrColor);

对Exam5_1程序增加实现产生黑色背景,红色文本的视图。

程序清单见下面粗体部分:

程序清单5-7:

在视图中设置颜色的OnDraw()函数

voidCExam5_1View:

:

OnDraw(CDC*pDC)

{

CExam5_1Doc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

//TODO:

adddrawcodefornativedatahere

pDC->SetTextColor(RGB(255,0,0));

pDC->SetBkColor(RGB(0,0,0));

CStringstr;

str.Format("鼠标左键双击的位置是[%d,%d]",m_LPoint.x,m_LPoint.y);

pDC->TextOut(0,0,str);

}

5.2.2设置文本显示属性

CDC还提供了设置文本显示属性的函数,下表5-2列出了三组控制文本的显示属性常用函数:

表5-2文本属性设置函数

函数

说明

SetBkMode和GetBkMode

设置和获得背景模式

SetTextAlign和GetTextAlign

设置和获得对齐方式

SetTextJusttificationSetTextCharaterExtra

调整文本

文本背景模式的默认设置是OPAQUE,它要求GDI用户要使用背景颜色,可替换设置为TRANSPARENT,要求GDI用户在绘制文本时,不要使用背景色,函数的格式:

intCDC:

:

SetBkMode(intnBkMode);

SetBkMode()函数返回先前的背景模式,nBkMode表示背景模式,只有两种:

OPAQUE和TRANSPARENT。

intCDC:

:

GetBkMode()const;

GetBkMode()函数返回当前使用的背景模式。

文本对齐描述了(x,y)文本坐标和文本框之间的关系。

默认设置将文本与文本坐标右下方对齐。

可使用SetTextAlign函数设置文本对齐,函数格式:

UINTSetTextAlign(UINTnFlags);

nFlag为表5-3中列出的标志的组合,各栏中的标志之间相互排斥,只能从一栏中取一种标志,第一行为系统的默认设置值,例如:

pDC->SetTextAlign(TA_RIGHT|TA_TOP);

表5-3文本对齐风格

X轴对齐

Y轴对齐

更新当前位置

TA_LEFT

TA_TOP

TA_NOUPSATECP

TA_CENTER

TA_BASELINE

TA_UPDATECP

TA_RIGHT

TA_BOTTOM

如果准备将不同字体,不同字号的文本混合在一行,使用y轴默认设置TA_TOP将产生奇怪的现象,这时应该更改y轴默认设置为TA_BOTTOM。

SetTextJusttification()和SetTextCharaterExtra()函数用于设置文本属性:

文本调整和文本额外间隔。

这两种属性能够帮助填补文本行。

填补文本行是为了生成WYSIWYG(所见即所得)输出。

在大多数情况下,它意味着显示屏幕输出变形,以模仿打印输出的效果。

SetTextJusttification()函数能够指定添加到各个间隔字符的像素数,如果需要更多地填充,则应调用SetTextCharaterExtra()函数,将额外的像素添加到各个字符(而不是间隔字符)。

5.2.3设置字体

字体是一组复杂的图形图像,大小和设计都是统一的,用于表示字符数据。

字体通常由磅值、名称和风格标识的,如8磅粗体Arial这样的风格。

处理字体的最简单的方法是使用GDI的常备字体,如要自己设置显示字体的风格需要创建一个CFont的对象,具体步骤如下:

1.定义CFont对象

2.调用CreateFont()函数创建字体

3.将创建的字体对象选入DC,并保存前一个被选入DC的字体对象

CreateFont()函数包括大量参数,具体解释如下:

(1)格式:

BOOLCreateFont(

intnHeight,//字体所需高度,为0使用默认值

intnWidth,//字符的宽度值,为0表示设备的纵横比匹配可用字体的纵横比

intnEscapement,//字体转义,指定转义矢量和x轴的夹角

intnOrientation,//字体方向,指定字符基线和x轴的夹角(以0.1度为单位)

intnWeight,//字体厚度

BYTEbItalic,//是否斜体,布尔值

BYTEbUnderline,//是否带有下划线,布尔值

BYTEcStrikeOut,//是否带有删除线,布尔值

BYTEnCharSet,//使用的字符集

BYTEnOutPrecision,//输出精度

BYTEnClipPrecision,//剪取精度

BYTEnQuality,//输出质量

BYTEnPitchAndFamily,//字符间距和字族

LPCTSTRlpszFacename//字体的字样名称

);

(2)返回值:

如果成功,返回非0值;失败,返回0值。

(3)参数:

nWeight字体厚度常用参数有:

FW_NORMAL、FW_REGULAR和FW_BOLD

nCharSet字符集常用参数有:

ANSI_SHARSET、DEFAULT_CHARSET、SYBOL_CHARSET、SHIFTJIS_CHARSET、OEM_CHARSET等

nOutPrecision输出精确度定义。

输出与请求使用的字体的高度、宽度、字符走向、转义和字间距的匹配程度,常用参数有:

OUT_CHARACTER_PRECIS、OUT_STRING_PRECIS、OUT_DEFAULT_PRECIS、OUT_DEVICE_PRECIS等等。

nClipPrecision剪取精度定义。

如何剪取部分位于剪取区域之外的字符,常用参数有:

CLIP_CHARACTER_PRECIS、CLIP_DEFAULT_PRECIS、CLIP_MASK。

nQuality字体的输出质量定义。

GDI怎样才能将逻辑字体属性与实际物理字体匹配起来,常用参数值:

DEFAULT_QUALITY、DRAFT_QUALITY和PROOF_QUALITY。

nPitchAndFamily通常是字符间距与字族的组合值,如:

DEFAULT_PITCH|FF_DONTCARE

下面通过实例显示字体对象的创建和使用。

运行效果如图5-5所示:

图5-5设置字体效果

程序清单5-8:

在视图中创建并使用字体对象的OnDraw()函数

voidCExam5View:

:

OnDraw(CDC*pDC)

{

CExam5Doc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

//TODO:

adddrawcodefornativedatahere

CFontNewFont;

NewFont.CreateFont(65,65,0,0,FW_DONTCARE,

true,false,false,DEFAULT_CHARSET,

OUT_CHARACTER_PRECIS,

CLIP_CHARACTER_PRECIS,

DEFAULT_QUALITY,

DEFAULT_PITCH|FF_DONTCARE,

"黑体");

CFont*pOldFont;

pOldFont=pDC->SelectObject(&NewFont);

pDC->TextOut(10,10,"倾斜的黑体字");

}

5.2.4格式化文本

Windows系统不参与窗口客户区的管理,这就意味着在客户区

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

当前位置:首页 > 农林牧渔 > 林学

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

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