VC++60入门第五章图形和文本输出Word文档下载推荐.docx
《VC++60入门第五章图形和文本输出Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《VC++60入门第五章图形和文本输出Word文档下载推荐.docx(52页珍藏版)》请在冰点文库上搜索。
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()函数
//在坐标为10,10的位置上画一点,颜色为黑色
SetPixel(CPoint(10,10),RGB(0,0,0));
也可以使用CClientDC类创建一个局部DC对象,例如,在键盘响应消息处理函数和鼠标响应消息处理函数中要进行文本输出或图形绘制时,通常要创建一个这样的对象,并使用this指针为该对象赋值。
程序清单5-3:
在鼠标点击画一红点的鼠标左键单击消息处理函数
OnLButtonDown(UNITnFlags,CPointpoint)
//TODO:
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()
addconstructioncodehere
m_LPoint.x=0;
m_LPoint.y=0;
3.在OnDraw()函数中添加代码,在第一行输出成员变量的值。
如程序清单5-5粗体部分所示。
程序清单5-5:
在视图中输出整型数据的OnDraw()函数
voidCExam5_1View:
CExam5_1Doc*pDoc=GetDocument();
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:
产生重绘消息的鼠标消息处理函数
OnLButtonDblClk(UINTnFlags,CPointpoint)
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()函数
SetTextColor(RGB(255,0,0));
SetBkColor(RGB(0,0,0));
CStringstr;
str.Format("
鼠标左键双击的位置是[%d,%d]"
m_LPoint.x,m_LPoint.y);
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()函数
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);
TextOut(10,10,"
倾斜的黑体字"
5.2.4格式化文本
Windows系统不参与窗口客户区的管理,这就意味着在客户区