第4讲边框窗口、与视文本、字体、图形输出课件_第1页
第4讲边框窗口、与视文本、字体、图形输出课件_第2页
第4讲边框窗口、与视文本、字体、图形输出课件_第3页
第4讲边框窗口、与视文本、字体、图形输出课件_第4页
第4讲边框窗口、与视文本、字体、图形输出课件_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、4.1.1 基本的文本输出 基本的文本或图形的输出要通过DC设备环境进行。VC中CDC类是定义设备环境的基类,它封装了170多个成员函数,包括文本输出函数和绘图函数。另外CDC还派生了CClientDC、CWindowDC、CPaintDC、CMetaFileDC等类,以满足不同的用途需要。 4.1 文本输出4.1.1 基本的文本输出4.1 文本输出输出文本或绘图三个步骤CDC在一个定义的函数中输出文本或绘图三个步骤: 1、 调用文本输出或绘图函数之前,先获取设备环境对象;常用函数:CWnd:GetDC()格式:CDC *GetDC();功能:获取当前窗口的设备环境对象的指针。典型用法: CD

2、C *pDC=GetDC();/获取当前窗口的设备环境对象指针。注:OnDraw函数忽略此步,因为它已由AppWizard自动生成了这个部分,并把对象地址传递给了该函数的pDC对象指针形参。 输出文本或绘图三个步骤 2、 调用文本输出或绘图函数时,要正确地引用设备环境;如要在客户区的(100,100)位置输出字符串“马到成功!”的典型代码如下:pDC-TextOut(100,100,” 马到成功!”);常用的文本输出函数:CDC:TextOut格式:virtual BOOL TextOut(int x,int y,LPCTSTR lpszString,int nCount);BOOL Text

3、Out(int x,int y,const CString &str);功能:用所选字体在指定位置输出字符串,原点在字符单元左上角。返回:若函数调用成功,返回真,否则返回假。 2、 调用文本输出或绘图函数时,要正确地引用设备环 3、 释放设备环境常用函数:CWnd:ReleaseDC()格式:int ReleaseDC(CDC *pDC);功能:释放设备环境。返回:若调用成功,则返回非0,否则返回0。参数:pDC-指向要释放的设备环境对象 设备环境使用完毕立即释放是一个良好的编程习惯,首先因为CDC类对象占用庞大的内存;其次在同一时刻Windows中最多可以有5个显示设备环境可用,所有的应用程

4、序不得不共享这一宝贵资源。 在另一个函数中输出文本或绘图同样要遵循以上三步。 3、 释放设备环境4.1.2 设置文本颜色及背景颜色 1、 设置文本颜色文本颜色是指输出字体的颜色。VC定义了表示颜色的数据类型COLORREF。可以通过调用RGB宏命令,对其参数赋值来获得不同的颜色。CDC:SetTextColor成员函数用于设置文本本身的颜色,该函数说明如下:格式:virtual COLORREF SetTextColor(COLORREF crColor);功能:设置当前文本颜色。返回:先前文本的RGB颜色值。参数:crColor-指定当前文本的RGB颜色值4.1.2 设置文本颜色及背景颜色S

5、etTextColor使用举例:用MFC AppWizard(exe)工程创建一SDI MFC Windows应用程序。要求-当在客户区单击MOUSE时,用黄色在(100,100)处显示“马到成功!”字符串。程序片断如下: / CDC *pDC=GetDC();/获取当前窗口设备环境的指针 CString str= 马到成功!; COLORREF rColor,oColor; rColor=RGB(255,255,0);/黄色 oColor=pDC-SetTextColor(rColor);/保存原来的文本颜色,并当前文本设置为黄色 pDC-TextOut(100,100,str);/显示文本

6、 pDC-SetTextColor(oColor);/恢复原来的文本颜色 ReleaseDC(pDC);/释放设备环境 /本例完整程序见CH4D工程。SetTextColor使用举例: 2、 设置文本背景颜色文本在屏幕上输出要占据一定的区域,这个区域用包含文本的矩形区域来定义。在这个区域内除去文本本身的笔划占据的部分以外的其它空隙部分就是文本的背景。 文本背景颜色是指用来填充文本输出区域内空隙部分的颜色。文本背景模式是指文本背景颜色填充文本背景的方式。CDC:SetBkColor成员函数用于设置文本的背景颜色,该函数说明如下:格式:virtual COLORREF SetBkColor(COL

7、ORREF crColor);功能:设置当前文本背景颜色。返回:先前文本的背景颜色值。参数:crColor-指定当前文本背景颜色值 2、 设置文本背景颜色CDC:SetBkMode成员函数用于设置文本背景模式,该函数说明如下:格式:int SetBkMode (int nBkMode);功能:设置当前背景模式。返回:先前的背景模式。参数:nBkMode-指定当前的背景模式 它有两个取值:OPAQUE-不透明(缺省时为该值) 显示时,背景用当前背景色TRANSPARENT-透明 显示时,不改变背景色(调用SetBkColor函数无效)CDC:SetBkMode成员函数用于设置文本背景模式,该Se

8、tBkColor使用举例:用MFC AppWizard(exe)工程创建一SDI MFC Windows应用程序。要求-当在客户区单击MOUSE时,用黄色在(100,100)处显示“马到成功!”字符串,字符串背景用红色显示。程序片断如下:/CDC *pDC=GetDC();CString str= 马到成功!;int nBkMode;COLORREF rColor,oColor; rColor=RGB(255,255,0);/黄色oColor=pDC-SetTextColor(rColor); nBkMode=pDC-SetBkMode(OPAQUE);/保存原来的背景模式,并且当前背景设置为

9、不透明SetBkColor使用举例: pDC-SetBkColor(RGB(255,0,0);/设置当前背景颜色为红色 pDC-TextOut(100,100,str);/显示文本 pDC-SetTextColor(oColor);/恢复原来的文本颜色 pDC-SetBkMode(nBkMode);/恢复原来的背景模式 ReleaseDC(pDC);/释放设备环境 pDC-SetBkColor(RGB(255,0,0)4.2.1 字体的基本知识 一、关于字体的术语1、字模(typeface):指基本的字符设计,它由笔划宽度(stroke width)及衬线(serif)决定。注:衬线(印ser

10、if)指主笔划结尾时的细线,如字母“H”的上下四条短而细的横线。有些字体不带衬线(sans serif)。 sans-prep.无。2、字体(font):具有相同字模和尺寸的完整字符集。字体尺寸用来指定字符所占区域的大小,可以用mm、inch或“点”来衡量。点是印刷中采用的最小度量单位(1英寸=72dots=25.4mm)。4.2 字体4.2.1 字体的基本知识4.2 字体目前有四种基本类型的字体:光栅字体/点阵字体(raster font) 每个字符均以固定图形形式存储在字库中,它是与设备相关的字体。矢量字体/向量字体(Vector font) 是把字符分解为一系列直线段而存储起来。True

11、Type字体 字符的原型是一系列直线和曲线绘制命令的集合。它是一种所见即所得的字体。OpenType字体 它不但可以定义TrueType字体,还可以定义手写字体。 矢量字体、TrueType字体、OpenType字体是与设备无关的字体。目前有四种基本类型的字体:3、字体属性:有许多属性,主要有字样、风格和尺寸三种。字样是字符书写和显示时表现出的特定模式,如汉字有宋体、楷体、仿宋、黑体、隶书、幼圆等多种字样。字体风格主要表现字体的粗细和是否倾斜等特点。字体尺寸用来指定字符所占区域的大小,可以用mm、inch或“点”来衡量。对于汉字,还用“号”数表示字体的尺寸,字号越大,字体尺寸越小(如:五号字的

12、尺寸比四号字的尺寸要小)。二、TEXTMETRIC结构Windows很多字体的功能都是以TEXTMETRIC结构定义的,该结构定义中的成员可以较准确地描述字体的各种属性。 如果需要更精确地对字体高度和宽度进行计算就需要使用CDC:GetTextMetrics( LPTEXTMETRIC lpMetrics) 成员函数,该函数将会填充TEXTMETRIC结构。 3、字体属性:有许多属性,主要有字样、风格和尺寸三种。TEXTMETRIC结构定义:typedef struct tagTEXTMETRIC short int tmHeight;/高度 short int tmAscent;/上升高度

13、short int tmDescent;/下降高度 short int tmInternalLeading;/字符单元内部插入 short int tmExternalLeading;/字符单元外部插入 short int tmAveCharWidth;/平均字符宽度 short int tmMaxCharWidth;/最大字符宽度 short int tmWeight;/字体权重 short int tmOverhang;/延伸量 short int tmDigitizedAspectX;/设备水平特性 short int tmDigitizedAspectY;/设备垂直特性TEXTMETR

14、IC结构定义: BYTE tmFirstChar;/第一个字符 BYTE tmLastChar;/最后一个字符 BYTE tmDefaultChar;/缺省字符 BYTE tmBreakChar;/中断字符 BYTE tmItalic;/斜体 BYTE tmUnderlined;/下划线 BYTE tmStruckOut;/删除线 BYTE tmPitchAndFamily;/字体间距和字体类型 BYTE tmCharSet;/字符集TEXTMETRIC; 该结构常用成员有:tmHeight、tmAscent、tmDescent、tmInternalLeading、tmExternalLead

15、ing、tmAveCharWidth等。 BYTE tmFirstChar;/第一个字符第4讲边框窗口、与视文本、字体、图形输出课件4.2.2逻辑字体/自定义字体程序员可以的创建的字体有两种:库存字体(标准字体)和逻辑字体(自定义字体/非库存字体)。逻辑字体是对理想字体的一种描述方式。使用逻辑字体输出文字时,系统自动地将逻辑字体映射为最匹配的系统库存字体。用户可使用CFont:CreateFont或LOGFONT/CFont:CreateFontIndirect创建逻辑字体。CFont类继承关系如下:CObject CGdiObject CFont图:CFont类的继承关系CGdiObject

16、图形对象类是各种Windows GDI(图形设备接口类)的基类,Gdi对象类的派生类除了字体外,还包括画笔、画刷、区域、调色板等。CFont(字体类)封装了一组Windows GDI字体,同时提供了一组成员函数处理这些字体。4.2.2逻辑字体/自定义字体一、创建逻辑字体的结构和函数1、LOGFONT结构LOGFONT结构typedef struct tagLOGFONTLONG lfHeight; /字体高度,等于零为缺省高度LONG lfWidth; /字体平均宽度LONG lfEscapement; /出口矢量与X轴间的角度(0.1度)LONG lfOrientation;/ 字符基线与X

17、轴间的角度。LONG lfWeight;/字体粗细BYTE lfItalic;/ 是否为斜体。BYTE lfUnderline;/ 是否有下划线。BYTE lfStrikeOut;/ 是否带删除线。 BYTE lfCharSet;/ 指定字符集合BYTE lfOutPrecision;/ 字符输出精度。一、创建逻辑字体的结构和函数BYTE lfClipPrecision ;/裁剪精度BYTE lfQuality ;/输出质量BYTE lfPitchAndFamily ;/字体间距和字体类型BYTE lfFacename ;/指定字体的字样名LOGFONTBYTE lfClipPrecision

18、 ;/裁剪精度2、CFont:CreateFont-创建逻辑字体(法1)格式:BOOL CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename );功能:创建并初

19、始化一个CFont对象。返回:调用成功,返回非0值。该函的参数和LOGFONT中的各成员有一一对应的关系。本函数适合于字体有多个属性要进行设定的情况。2、CFont:CreateFont-创建逻辑字体(法1)3、CFont:CreateFontIndirect-创建逻辑字体(法2)使用时首先定义LOGFONT结构的有关成员创建所需的字体,然后调用CFont:CreateFontIndirect产生该字体。CFont:CreateFontIndirect函数说明如下:格式:BOOL CreateFontIndirect(const LOGFONT* lpLogFont);功能:以lpLogFon

20、t指向LOGFONT结构中给出的字体属性初始化一个CFont对象。返回:调用成功,返回非0值。参数:lpLogFont-指向LOGFONT结构的指针。3、CFont:CreateFontIndirect-创建二、使用逻辑字体1、逻辑字体创建步骤Step 1:用CFont类定义字体对象;Step 2:调用CFont:CreateFont函数(或LOGFONT/ CFont:CreateFontIndirect)建立自定义的逻辑字体;Step 3:调用CDC:SelectObject函数将上一步构造的GDI字体对象选入当前设备环境,并保存原来的GDI字体对象;CDC:SelectObject函数使

21、用格式:格式:virtual CFont* SelectObject(CFont* pFont);功能:将一个字体对象选入当前设备环境,新选字体对象将代替同一类型的先前对象。返回:被代替字体对象的指针。参数:pFont-指向要选择的CFont对象的指针。Step 4:字体使用结束后,恢复当前设备环境原来的GDI字体对象。二、使用逻辑字体2、逻辑字体使用举例使用CFont:CreateFont创建逻辑字体程序例:程序清单: /CFont MyFont,*OldFont;CString str=马到成功!;pDC-SetTextColor(RGB(0,0,255);MyFont.CreateFon

22、t(150, /字体高度,等于零为缺省高度30, /字体平均宽度200,/字符串倾斜20度 ,出口矢量与X轴间的角度(0.1度)0, / 字符基线与X轴间的角度。FW_HEAVY, /字体粗细TRUE,/是否为斜体。TRUE, / 是否有下划线。2、逻辑字体使用举例0, / 是否带删除线。 GB2312_CHARSET, / 指定字符集合OUT_DEFAULT_PRECIS,/字符输出精度。 CLIP_DEFAULT_PRECIS, /裁剪精度DRAFT_QUALITY, /输出质量FIXED_PITCH, /字体间距和字体类型MyFont“/指定字体的字样名);/创建逻辑字体OldFont=

23、pDC-SelectObject(&MyFont);/将创建的逻辑字体选入当前DC,保存原来的字体pDC-TextOut(0,150,str); pDC-SelectObject(OldFont);/恢复DC中原来的字体0, / 是否带删除线。 三、使用标准字体任何语种的Windows都支持六种库存字体/标准字体,它们分别是:SYSTEM_FONT(系统字体)、ANSI_FIXED_FONT(固定系统字体)、ANSI_VAR_FONT(可变系统统)、DEVICE_DEFAULT_FONT(与设备相关字体)、OEM_FIXED_FONT(与OEM相关字体)、SYSTEM_FIXED_FONT(固

24、定宽度的系统字体)。用户可直接选用这些标准字体。可以调用CDC:SelectStockObject成员函数选用标准字体对象,该函数使用说明如下:格式:virtual CGdiObject* SelectStockObject(int nIndex);功能:选择预定义的库存字体、画笔或画刷所对应的CGdiObject对象。 返回:调用成功则返回指向被替换的CGdiObject对象的指针,否则返回NULL。 三、使用标准字体参数:nIndex-指定预定义的对象。 nIndex取值可以是下列对象之一: SYSTEM_FONT(系统字体) ANSI_FIXED_FONT(固定系统字体) ANSI_VA

25、R_FONT(可变系统统) DEVICE_DEFAULT_FONT(与设备相关字体) OEM_FIXED_FONT(与OEM相关字体) SYSTEM_FIXED_FONT(固定宽度的系统字体) BLACK_PEN(黑色画笔) NULL_PEN(空画笔) WHITE_PEN(白色画笔)参数:nIndex-指定预定义的对象。 BLACK_BRUSH(黑色画刷) DKGRAY_BRUSH(深灰画刷) HOLLOW_BRUSH(中空画刷) LTGRAY_BRUSH(浅灰画刷) NULL_BRUSH(空画刷) WHITE_BRUSH(白色画刷) BLACK_BRUSH(黑色画刷)标准字体使用举例:依次调

26、用六种标准字体显示“The road of success!”。 程序片段如下:/int nFonts6=SYSTEM_FONT, ANSI_FIXED_FONT, ANSI_VAR_FONT, DEVICE_DEFAULT_FONT, OEM_FIXED_FONT, SYSTEM_FIXED_FONT;CString str=The road of success!;pDC-SetTextColor(RGB(0,0,255);标准字体使用举例:依次调用六种标准字体显示“The roadfor(int i=0;iSelectStockObject(nFontsi); pDC-TextOut(2

27、00,40*(i+2),str);for(int i=0;iSetPixel(50,50,RGB(0,0,255);则点(50,50)被画为兰色。4.3图形输出4.3.1基本图形显示4.3图形输出CDC:MoveTo/LineTo格式:CPoint MoveTo(int x,int y); CPoint MoveTo(POINT point);功能:将当前位置移到(x,y)或point参数指定的点。返回:将先前位置(x,y)坐标返回给Cpoint对象。格式:BOOL LineTo(int x,int y); BOOL LineTo(POINT point);功能:从当前位置向指定点绘制一条直线

28、,但不包括指定的点。返回:若调用成功,则返回非0。例:在OnDraw函数中,添加如下语句pDC-MoveTo(10,10);pDC-LineTo(500,200);则绘制一条从(10,10)到(500,200)的直线。CDC:MoveTo/LineToCDC:CDC:Arc格式:BOOL Arc(int x1,y1,int x2,int y2,int x3,int y3,int x4,int y4); BOOL Arc(LPCRECT lpRect,POINT ptStart,POINT ptEnd);功能:绘制一个椭圆弧。所画弧是由指定的限定矩形所定义的椭圆的一部分。返回:若调用成功,则返回

29、非0。参数:x1-限定矩形左上角的逻辑x坐标。 y1-限定矩形左上角的逻辑y坐标。 x2-限定矩形右下角的逻辑x坐标。 y2-限定矩形右下角的逻辑y坐标。 x3-弧起点的逻辑x坐标(不一定在弧上)。 y3-弧起点的逻辑y坐标(不一定在弧上)。 x4-弧终点的逻辑x坐标(不一定在弧上)。 y4-弧终点的逻辑y坐标(不一定在弧上)。CDC:CDC:ArclpRect-指定限定矩形(以逻辑单位计),可以是一个CRect对象或指向RECT结构的指针。ptStart-指定弧起点的逻辑(x,y)坐标,可以是一个POINT结构或一个CPoint对象。ptEnd-指定弧终点的逻辑(x,y)坐标,可以是一个PO

30、INT结构或一个CPoint对象。 例:在OnDraw函数中,添加如下语句pDC-Arc(40,100,80,120,10,110,60,105);则绘制一条椭圆弧。其中,(10,110)为椭圆弧起点的逻辑坐标,(60,105)为椭圆弧终点的逻辑坐标。lpRect-指定限定矩形(以逻辑单位计),可以是一个CReCDC:Ellipse格式:BOOL Ellipse(int x1,y1,int x2,int y2); BOOL Ellipse(LPCRECT lpRect);功能:绘制一个椭圆。返回:若调用成功,则返回非0。例:在OnDraw函数中,添加如下语句pDC-Ellipse(100,20

31、0,400,300);pDC-Ellipse(100,300,300,500);则在矩形区(100,200,400,300)绘制一个椭圆,在正方形区(100,300,300,500)绘制一个圆。CDC:EllipseCDC:Rectangle格式:BOOL Rectangle(int x1,int y1,int x2,int y2); BOOL Rectangle(LPCRECT lpRect);功能:使用当前画刷绘制一个矩形。返回:若调用成功,则返回非0。例:在OnDraw函数中,添加如下语句 pDC-Rectangle(200,20,300,60);则绘制一个矩形(200,20,300,6

32、0)。 CDC:RectangleCDC:Polygon格式:BOOL Polygon(LPPOINT lpPoints,int nCount);功能:绘制一个多边形。返回:若调用成功,则返回非0。 参数:lpPoints-指向POINT结构或CPoint对象数组。每个数组元素定义一个多边形的顶点。nCounts-指定数组的顶点数。例:在OnDraw函数中,添加如下语句 POINT point3=400,160,490,220,350,210; pDC-Polygon(point,3);则绘制一个三角形。CDC:PolygonCDC:Chord格式:BOOL Chord(int x1,y1,i

33、nt x2,int y2,int x3,int y3,int x4,int y4); BOOL Chord LPCRECT lpRect,POINT ptStart,POINT ptEnd);功能:绘制一个带弦的椭圆弧,即由椭圆弧和线段构成的封闭图形。返回:若调用成功,则返回非0。参数:X1,y1-弦的限定矩形左上角的逻辑x,y坐标。X2,y2-弦的限定矩形右下角的逻辑x,y坐标。X3,y3-弦起点的逻辑x,y坐标。X4,y4-弦终点的逻辑x,y坐标。lpRect-指定限定矩形,可以是一个CRect对象或指向RECT结构的指针。ptStart-指定弧起点,可以是一个CPoint对象或指向POI

34、NT结构。ptEnd-指定弧终点,可以是一个CPoint对象或指向POINT结构。 (x3,y3)和(x4,y4)可以是矩形内的一点,也可以是矩形外的一点CDC:ChordExample:在OnDraw函数中,添加如下语句 pDC-Chord(100,20,300,300,130,100,250,250);则绘制一条带弦的椭圆弧。CDC:Pie格式:BOOL Pie(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4); BOOL Pie(LPRECT lpRect,POINT ptStart,PONT ptEnd);功能:绘制一个饼

35、图,即绘制椭圆弧并且弧的两个端点与圆心相连。返回:若函数调用成功,则返回非0。参数:x1-限定矩形左上角的逻辑x坐标。y1-限定矩形左上角的逻辑y坐标。x2-限定矩形右下角的逻辑x坐标。y2-限定矩形右下角的逻辑y坐标。Example:在OnDraw函数中,添加如下语句 x3-弧起点的逻辑x坐标。y3-弧起点的逻辑y坐标。x4-弧终点的逻辑x坐标。y4-弧终点的逻辑y坐标。lpRect-指定限定矩形,可以是一个CRect对象或指向RECT结构的指针。ptStart-指定弧起点,可以是一个CPoint对象或指向POINT结构。ptEnd-指定弧终点,可以是一个CPoint对象或指向POINT结构

36、。(x3,y3)和(x4,y4)可以是矩形内的一点,也可以是矩形外的一点。Example:在OnDraw函数中,添加如下语句 pDC-Pie(100,100,400,300,130,100,250,250);则绘制一条椭圆弧并且弧的两个端点与圆心相连。 x3-弧起点的逻辑x坐标。CDC:RoundRect格式:BOOL RoundRect(int x1,int y1,int x2,int y2,int x3,int y3); BOOL RoundRect(LPCRECT lpRect,POINT point);功能:绘制一个圆角的矩形。返回:若调用成功则返回非0。参数:x1-矩形左上角的逻辑x

37、坐标。y1-矩形左上角的逻辑y坐标。x2-矩形右下角的逻辑x坐标。y2-矩形右下角的逻辑y坐标。x3-椭圆逻辑宽度。y3-椭圆逻辑高度。lpRect-指定限定矩形的逻辑坐标。可以是一个CRect对象或指向RECT结构的指针。CDC:RoundRectpoint-x坐标指定椭圆的逻辑宽度,y坐标指定椭圆的逻辑高度。Example:在OnDraw函数中,添加如下语句 pDC-RoundRect(100,100,400,300,50,50);则绘制一个圆角矩形(100,100,400,300)。其中圆角用直径为50逻辑单位的圆与该矩形的四个角内切得到。CDC:PolyBezier(*)格式:BOOL

38、 PolyBezier(const POINT *lpPoint,int nCount);功能:绘制一段或多段Bezier样条(Spline)。返回:若调用成功则返回非0。参数:lpPoint-指向一个POINT结构的数组,其中包含样条的端点和控制点。nCount-指定lpPoints数组中的点数,必须比画的样条数大1。3次Bezier曲线需要2个控制点和一个终点,还要一个起点,即4个点决定一段Bezier曲线。point-x坐标指定椭圆的逻辑宽度,y坐标指定椭圆的逻辑高Example:在OnDraw函数中,添加如下语句 POINT pt7=40,30,160,60,270,100,300,2

39、20, 300,220,200,120,400,20; pDC-PolyBezier(pt,7); 则在7个点间绘制一段贝塞尔样条曲线。Example:在OnDraw函数中,添加如下语句 二、CDC的派生类 CDC有几个常用的派生类:CPaintDC、CClientDC、CwindowDC。它们的用法有比较细微的差别。1、CPaintDC类CPaintDC类(绘制设备环境类)适用于重画图形。即该类仅在OnPaint消息处理函数中使用。说明:这里OnPaint函数是由重画消息WM_PAINT(即窗口被重画时产生此消息)来响应的。CPaintDC类构造器:格式:CPaintDC(CWnd *pDC

40、);功能:构造一个CPaintDC对象。典型用法1: CPaintDC dc(this); 以上代码的含义是在当前窗口中创建CPaintDC对象(即获取当前窗口的设备环境)。当使用ClassWizard类向导增添WM_PAINT消息的OnPaint消息处理函数时,此代码将自动产生。 二、CDC的派生类典型用法2: CPaintDC *pDC=new CPaintDC(this); delete pDC;Example:用MFC AppWizard创建一SDI程序;选择ClassWizard-Messages-WM_PAINT-Add Function-Edit Code,在OnPaint函数中

41、,添加红色部分的语句 。CPaintDC dc(this); / device context for painting/ TODO: Add your message handler code here/ Do not call CView:OnPaint() for painting messagesCRect rc;GetClientRect(&rc);dc.Ellipse(&rc);典型用法2:则用CPaintDC对象绘制一个椭圆,该椭圆充满用户区窗口(内切于用户区边界)。说明:由于CPaintDC、CClientDC、CWindowDC类均有自动释放设备环境的能力(由相应类的销毁器完

42、成),所以释放设备环境这一步也省略不写了。但CDC类无此能力,所以必须要释放设备环境这一步。2、CClientDC类CClientDC类的使用比较随意,它可以在何时候使用(一般常用它来进行实时作图)。CClientDC类构造器:格式:CClientDC(CWnd *pDC);功能:构造一个CClientDC对象。典型用法:CClientDC dc(this);以上代码的含义是在当前窗口用户区中创建CClientDC对象。这里的代码要由程序员增添。则用CPaintDC对象绘制一个椭圆,该椭圆充满用户区窗口(Example:用MFC AppWizard创建一SDI程序;选择ClassWizard-

43、Messages-WM_LBUTTONDOWN-Add Function-Edit Code,在OnLButtonDown函数中添加下面语句 CClientDC dc(this);CRect myrc;GetClientRect(&myrc);dc.Ellipse(&myrc);则单击MOUSE时,将绘制一个椭圆,该椭圆充满用户区窗口(内切于用户区边界)。3、CWindowDC类CWindowDC类的使用与CClientDC类很相似,也可以在任何时候使用。但CWindowDC类所不同的是:它可以在整个应用程序的窗口上画图,该类也许适用于一些游戏程序和其它特殊的一些应用程序。Example:用M

44、FC AppWizard创建一SDICWindowDC类构造器:格式:CWindowDC(CWnd *pDC);功能:构造一个CWindowtDC对象。典型用法:CWindowDC dc(this);以上代码一般要由程序员增添。dc对象可用于存取CWnd对象的全部屏幕区域,包括用户区和非用户区。程序例:用Win32 Application创建一SDI程序。单击MOUSE时,绘制一个椭圆,该椭圆充满应用程序窗口。程序见CH4GA工程的EXGA.CPP文件。 程序清单:/exga.cpp#includeCWindowDC类构造器:class CMinApp:public CWinApppublic

45、:virtual BOOL InitInstance();class CMainFrame:public CFrameWndprotected:afx_msg void OnLButtonDown(UINT nFlags,CPoint point);DECLARE_MESSAGE_MAP();BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)ON_WM_LBUTTONDOWN()END_MESSAGE_MAP()class CMinApp:public CWinAppvoid CMainFrame:OnLButtonDown(UINT nFlags,CPoint p

46、oint)CWindowDC dc(this);CRect myrc;GetWindowRect(&myrc); /获取应用程序窗口坐标赋给myrcdc.Ellipse(myrc);CFrameWnd:OnLButtonDown(nFlags,point);BOOL CMinApp:InitInstance()CMainFrame *pFrame=new CMainFrame;pFrame-Create(0,_T(Another Minimal MFC Program);pFrame-ShowWindow(SW_SHOWMAXIMIZED);pFrame-UpdateWindow();this

47、-m_pMainWnd=pFrame;return TRUE; CMinApp MyApp;void CMainFrame:OnLButtonDown程序例:用MFC AppWizard创建一SDI程序。单击MOUSE时,在客户区绘制一些图形。void CCH4GBView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCClientDC dc(this);dc.SetPixel(5,5,RGB(0,0,0);dc.MoveTo(10,

48、10);dc.LineTo(300,200);dc.Arc(40,100,80,120,10,110,60,105);dc.Ellipse(100,200,400,300); dc.Ellipse(100,300,300,500);dc.Rectangle(200,10,300,50);程序例:用MFC AppWizard创建一SDI程序。单POINT pt3=400,160,490,220,350,210;dc.Polygon(pt,3);CView:OnLButtonDown(nFlags, point);4.3.2 GDI对象 MFC中的CDC类提供了在显示器、打印机上绘图的方法。MFC

49、还提供用于绘图的工具GDI对象类(又称图形对象类)。CGdiObject类是图形对象类的基类,它派生了CPen(画笔类)、CBrush(画刷类)、CFont(字体类)、CBitmap(位图类)等具体的绘图工具。GDI对象分自定义的GDI对象和库存的GDI对象两种(后者使用CDC:SelectStockObject将库存的GDI选入当前DC:)。POINT pt3=400,160,490,2使用GDI对象绘图(或输出文本:见创建逻辑字体一节)一般步骤:Step 1:定义GDI对象(如CPen对象、CBrush对象等);Step 2:用相应GDI对象的函数创建GDI对象(如CPen:CreateP

50、en、CBrush:CreateSolidBrush等);Step 3:调用CDC:SelectObject函数将上一步构造的GDI对象选入当前设备环境,并保存原来的GDI对象;Step 4:绘图结束后,恢复当前设备环境原来的GDI对象。 一、CPen类(画笔)CPen类是MFC绘图的笔,它有风格、宽度、颜色等属性。程序员可以通过调用CPen类成员函数生成画笔的方法来决定图形线条的宽度、颜色和显示风格,如虚线,实线,点划线等。CPen类常用成员函数介绍:1、CPen:CPen格式:CPen(int nPenStyle,int nWidth,COLORREF crColor);功能:构造并初始化

51、一个CPen对象。使用GDI对象绘图(或输出文本:见创建逻辑字体一节)一般步骤参数:nPenStyle-指定画笔风格,可取如下值: PS_SOLID 实线Creates a solid pen.( _)PS_DASH 虚线,宽度必须为一Creates a dashed pen. Valid only when the pen width is 1 or less, in device units.( -)PS_DOT 点线,宽度必须为一Creates a dotted pen. Valid only when the pen width is 1 or less, in device unit

52、s.( .)PS_DASHDOT 点划线,宽度必须为一Creates a pen with alternating dashes and dots. Valid only when the pen width is 1 or less, in device units. .( _._._._)PS_DASHDOTDOT 双点划线,宽度必须为一Creates a pen with alternating dashes and double dots. Valid only when the pen width is 1 or less, in device units.( _._._._)PS_

53、NULL 空线,使用时什么也不会产生Creates a null pen.PS_INSIDEFRAME内框线( _)参数: nWidth-指定画笔宽度。 crColor-画笔的颜色。2、CPen:CreatePen格式:BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);功能:用指定风格、宽度和颜色属性创建一个(逻辑)画笔。返回:若调用成功,则返回非0。参数:同1。3、CPen:CreatePenIndirect格式:BOOL CreatePenIndirect(LPLOGPEN lpLogPen);功能:创建一个画笔,其风格、宽

54、度和颜色由lpLogPen参数指定。返回:若调用成功,则返回非0。参数:lpLogPen-指向LOGLEN结构的指针,该结构中包含有关画笔属性的信息。 nWidth-指定画笔宽度。 LOGPEN结构说明如下:typedef struct tagLOGPEN WORD lopnStyle;/ 笔的风格 POINT lopnWidth; / x表示笔的宽度(逻辑单位),若设为0,则宽度为一个象素宽 COLORREF lopnColor;/ 笔的颜色,为RGB颜色值 LOGPEN;程序例:CPen:CreatePen使用举例。 LOGPEN结构说明如下:程序例:LOGPEN/CPen:CreateP

55、enIndirect使用举例。在OnDraw函数中,添加如下语句CPen hPen;CPen *pPen;LOGPEN logPen;/定义逻辑笔结构变量POINT Width=20,0;logPen.lopnStyle=PS_SOLID;/实线logPen.lopnWidth=Width;/线宽为20logPen.lopnColor=RGB(0,255,0);/绿色hPen.CreatePenIndirect(&logPen);/ 创建画笔pPen=pDC-SelectObject(&hPen);pDC-Ellipse(110,70,300,260);/画圆pDC-SelectObject(

56、pPen);则绘制一条绿色圆环。程序例:LOGPEN/CPen:CreatePenIndi 在绘图中,不同的线段往往要求设置成不同的颜色,这时就需要创建多支画笔进行绘图。如,设置四支画笔的程序段可以写成如下形式:CClientDC *pdc=new CClientDC(this);CPen *pen1=new CPen(PS_SOLID,1,0XEE); CPen *pen2=new CPen(PS_SOLID,1,0X005E00);CPen *pen3=new CPen(PS_SOLID,1,0XEE0000); CPen *pen4=new CPen(PS_SOLID,1,0X00FF0

57、0);程序例:使用多支笔绘制层次线段图案。(*) 本例使用正弦函数和余弦函数。首先通过A=K(1+rsin(n)使A的值依正弦规律变换其大小,然后再利用X=Acos()和Y=Asin()计算各画线始点和终点坐标(Xi,Yi)并画线。该图案由线组成,且线的起点和终点坐标均按三角函数规律变化。 在绘图中,不同的线段往往要求设置成不同的颜色,这时就需 本例程序运行结果: 图:多支笔绘制层次线段图案效果图 二、CBrush类(画刷)画刷是在画封闭曲线时用来填充的颜色,画刷的作用是用于填充封闭图形。例如当你画圆形或方形时系统会用当前的画刷对内部进行填充。画刷有三个属性(画刷三要素):填充色、填充图案、和

58、填充风格。画刷可利用CBrush对象创建,CBrush类常见成员函数介绍: 1、CBrush:CreateSolidBrush格式:BOOL CreateSolidBrush(COLORREF crColor);功能:用指定的颜色创建一个固定颜色的画刷。返回:若调用成功,则返回非0。参数:crColor-指定画刷的颜色。 二、CBrush类(画刷)进2、CBrush: CreateHatchBrush 格式:BOOL CreateHatchBrush(int nIndex,COLORREF crColor);功能:创建指定颜色和和阴影线的画刷。返回:若调用成功,则返回非0。参数:nIndex-

59、指定画刷的阴影线风格,可取如下值:HS_BDIAGONALDownward hatch (left to right) at 45 degrees( :45度向下影线)HS_CROSSHorizontal and vertical crosshatch(+ + + +:水平和垂直交叉影线)HS_DIAGCROSSCrosshatch at 45 degrees (X X X X:45度交叉影线)HS_FDIAGONALUpward hatch (left to right) at 45 degrees(/ / / /:45度向上影线)进2、CBrush: CreateHatchBrush HS

60、_HORIZONTALHorizontal hatch(- - - -:水平影线)。HS_VERTICALVertical hatch(| | | |:垂直影线) crColor-指定画刷的颜色。 3 、CBrush:CBrush格式1:CBrush(COLORREF crColor);功能:用指定颜色构造并创建一个画刷。参数:crColor-指定画刷的颜色。格式2:CBrush(int nIndex,COLORREF crColor);功能:用指定风格和颜色构造并创建一个画刷。 HS_HORIZONTALHorizontal hat参数:nIndex-指定画刷的风格,取值同上。 crColo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论