语言入门教程课程软件7.gdi绘图与_第1页
语言入门教程课程软件7.gdi绘图与_第2页
语言入门教程课程软件7.gdi绘图与_第3页
语言入门教程课程软件7.gdi绘图与_第4页
语言入门教程课程软件7.gdi绘图与_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

GDI与绘图主要内容什么是图形设备接口(GDI)?什么是DC和CDC?CDC的分类及功能GDI对象与对象类绘制文本与图形什么是GDI?Windows中的输出

在windows应用程序中,图形和文本的输出都是通过GDI以图形的方式输出的。(调用各种GDI绘图函数,如TextOut输出文字)。

图形设备接口是windows的核心部分,是windows用来管理图形操作的一个与设备无关的函数库。GDI是一个可执行程序,接受windows应用程序的绘图请求,并将它们传给相应的设备驱动程序,完成特定硬件的输出。设备无关性

由于不同的硬件设备绘制的方式不同,为了适应不同的设备,操作系统屏蔽了硬件设备的差异,使用户编程时无需考虑硬件的具体实现,提供统一的“抽象层的设备”——即一个虚拟的设备。 对用户来说,仅仅需要做的工作是在该虚拟设备上绘图。windows通过DC来实现硬件的无关性。利用GDI,只要把相关的GDI对象选入设备环境,然后用设备环境对象提供的有关函数就可以绘制出各种图形,什么是DC和CDC?

DC(设备描述表)是应用程序,设备驱动程序,和输出设备之间的桥梁。它与一个特定的设备相 关联。描述了设备的各种属性信息,包括绘图工具,绘图模式等。DC提供了抽象层的设备,用户 在此DC上进行绘图。 因此,windows的输出常常被称为向设备环境(DC)进行写操作。看起来像屏幕输出。设备上下文(DeviceContext,简称DC)是一个Windows数据结构,该数据结构中包含了某个设备(如显示器或打印机)的绘制属性信息,可以把它想象为一个虚拟设备,用户不必知道自己操纵的是何种具体设备,只需调用设备上下文对象的各种输出函数执行数据的输出即可。它是一个画图的画布,提供绘图的场地和环境。画布一般是窗口的客户区,每个窗口CWnd对象都提供一个设备环境,在该环境中有一套默认的基本绘图工具。CDC是什么? 不同于windows编程,MFC总是通过类来封装。对于DC的访问,MFC提供了相应的CDC类对设备环境进行访问。该类是CObject的直接派生类,封装了WindowsAPI中的绝大多数与绘图相关的函数包含了有关绘图的方方面面。

如TextOut()、LineTo()、Ellipse()等。CDC的分类及功能说明:分类的目的:为了处理不同的绘图区域和方法。CClientDC:用于对窗口客户区绘制图形。CWindowDC:用于对整个窗口进行绘图,利用该类的对象,可以抹去窗口的客户区及标题栏、状态条、工具条等所有画面。CPaintDC:各种窗口通用。视图类中的OnDraw()函数实际上用的也是该类的对象。对于普通窗口,绘图时应该在WM_PAINT消息的响应函数OnPain()中进行,而绘图使用的设备对象就是CPaintDC类对象。CDC的功能:(1)对GDI绘图对象进行管理。

CDC使用函数selectobject()选进新的GDI对象或恢复旧的GDI对象。(2)映射方式: 对设备坐标和逻辑坐标的管理。(3)绘图状态管理和绘图操作绘图状态 包括背景色,前景色,线宽,线型,填充模式,裁剪区域,字体,字号等。绘图操作 有像素操作,画线操作,填充操作,画矩形,画椭圆(圆,弧,扇形),位图操作等,另外还有区域的位运算及操作,路径操作和字符显示灯。分类

用途

绘图工具函数

枚举在DC中可用的笔和刷子的函数

坐标函数

在物理设备和逻辑设备之间转换的函数

映像函数创建、获取和控制原点,扩展窗口和视及为DC获取和设置映像模式的函数设备描述表函数

获取有关DC及其属性信息的函数绘图属性函数

为DC获取和设置颜色及模式的函数

字体函数

获取字体属性的函数文本函数输出文本并获取DC当前选中的字体信息数线输出函数在DC上绘制线的函数椭圆和多边形函数绘制椭圆和多边形函数简单绘图函数提供简单矩形和图标的绘制特性函数

区域函数

填充区域和控制区域颜色的函数

位图函数

操作位图和像素的函数

剪裁函数

定义和操作剪裁设备边界的函数设备环境的建立1)MFC应用程序生成,如OnDraw,OnPaint函数中2)需要绘图输出时,申请设备环境 如CClientDCdc(this);

dc.textout(…)GDI对象与对象类MFC提供了CGdiObject类来对绘图工具进行封装,所有Windows的绘图对象都是CGdiObject的派生类。与绘图相关的CDI对象类主要有:CPen,CBrush,CBitmap,CFont,CRgn,CPalette等。CGdiObiect类的派生类CFont:该类用于管理字体,设置绘制文本的字体大小、字体式样等属性。CPen:用于管理线条绘制的类,通过CPen类对象,可以设置绘图时的线型、线条宽度、颜色等属性。

CBrush:定义了画刷,通过CBrush类对象,可以设置绘制封闭图形的填充颜色、填充样式等属性。CBitmap:用于管理、绘制位图资源的类。

CPalette:该类用于管理应用程序的调色板,使应用程序的调色板与其他应用程序不干扰。

CRgn:该类定义了区域,区域是由一个或多个封闭几何形体构成的一个范围,来进行填充、鼠标测试等工作。画图的规定一个设备上下文一次只能使用一个工具,如画笔、画刷或字体等。如果在程序运行中想换另外一支画笔,则需要 (1)创建新画笔,保存旧画笔 (2)使用新画笔取代旧画笔 (3)最后再恢复原来的旧画笔。1画笔的使用(CPen类)

所谓画笔,就象我们常用的笔一样,可以用来画各种线条,包括直线和曲线。CPen类中封装了绘图的画笔工具。我们可以利用CPen类来设置我们当前要使用的画笔的属性,包括线条的类型、颜色、宽度等。

使用画笔的示例程序代码使用画笔的程序代码如下:voidCDrawAppView::OnDraw(CDC*pDC){ CDrawAppDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //创建新画笔,并保存旧画笔

CPenpen(PS_SOLID,2,RGB(0,0,255)); CPen*pOldPen=pDC->SelectObject(&pen); pDC->MoveTo(20,30); pDC->LineTo(50,60); //恢复旧画笔

pDC->SelectObject(pOldPen); }使用画笔的主要步骤从上面的代码可以看出使用画笔的主要步骤如下:⑴创建新的画笔类对象,可以调用CPen类的构造函数CPen::CPen()来初始化新画笔;也可以调用CPen类的成员函数CreatePen()来实现。程序中的语句:CPenpen(PS_SOLID,2,RGB(0,0,255));可以用下面的两条语句代替:CPenpen;pen.CreatePen(PS_SOLID,2,RGB(0,0,255));23CreatePenCreatePen(intnPenStyle,intnWidth,COLORREFcrColor);其中,参数nPenStyle用于指定画笔的风格,其常用取值如下:PS_SOLID:创建实心画笔,用于画实线。PS_DASH:创建虚线画笔,用于画虚线。仅在画笔宽度不大于1时有效。PS_DOT:创建点画笔,用于画点线。仅在画笔宽度不大于1时有效。PS_DASHDOT:创建点画线画笔。仅在画笔宽度不大于1时有效。PS_DASHDOTDOT:创建双点画线的画笔。仅在画笔宽度不大于1时有效。PS_NULL:创建空画笔。各种线型参数nWidth用于指定画笔的宽度,crColor用于指定画笔的颜色。通常包含一个RGB值。

使用画笔的主要步骤(续)⑵保存原来的旧画笔,并将新创建的画笔对象选入设备对象中。 CPen*pOldPen=pDC->SelectObject(&pen); SelectObject()是CDC类中的一个重要成员函数,调用该函数可以选择其参数所指定的新对象,并返回旧对象的指针。⑶开始实际绘图工作,调用CDC类的各种绘图函数进行绘图。⑷

恢复原来的旧画笔,同样调用SelectObject()函数来实现。

2画刷的使用(CBrush类)

画刷主要用于将指定区域用颜色进行充填。使用画刷与使用画笔的方法相似。首先需要创建一个新的画刷对象,然后用它来取代原有的画刷,使用完后在恢复旧画刷。MFC的CBrush类封装了绘图的画刷工具。

使用画刷的示例程序使用画刷的程序代码如下:voidCDrawAppView::OnDraw(CDC*pDC){ CDrawAppDoc*pDoc=GetDocument();//返回视图的文档指针 ASSERT_VALID(pDoc); //创建新画刷,并保存旧画刷

CBrush*brush;//创建画刷brush=newCBrush(RGB(255,0,0));//选择新画刷,保存旧画刷

CBrush*pOldBrush=pDC->SelectObject(brush); //执行绘图操作

pDC->Rectangle(20,20,60,60); //恢复旧画笔

pDC->SelectObject(pOldBrush);}使用画刷的步骤采用两种方法来对其初始化。构造函数CBrush::CBrush();CreateSolidBrush()

程序中的代码CBrush*brush;Brush=newCBrush(RGB(255,0,0));可以用下面的语句代替:CBrushbrush;brush.CreateSolidBrush(RGB(255,0,0));建立各种画刷CreateSolidBrush()函数来创建实心画刷;CreateHatchBrush()函数来创建阴影画刷。 所谓阴影画刷,就是使用某种特定的阴影模式(如水平线、垂直线、斜线等)来填充图形的内部。

BOOL

CreateSolidBrush(COLORREFcrColor);

该函数只有一个参数crColor,用于指定新画刷的颜色。BOOLCreateHatchBrush(intnIndex,COLORREFcrColor);参数nIndex指定画刷的阴影模式,其取值如下:HS_BDIAGONAL:45度下斜线(从左至右)HS_CROSS:十字线HS_DIAGCROSS:45度斜十字线HS_FDIAGONAL:45度上斜线(从左至右)HS_HORIZONTAL:水平线HS_VERTICAL:垂直线画刷效果示意图使用画刷的主要步骤(续)⑵保存原来的旧画刷,并将新创建的画刷对象选入设备对象中。⑶开始实际绘图工作,调用CDC类的各种绘图函数进行绘图。⑷

恢复原来的画刷,同样调用SelectObject()函数来实现。

3字体的使用(CFont类)

⑴创建字体

通常使用以下两种方法来创建自定义字体:第一种是间接创建法,通过调用CFont类的函数CreateFontIndirect来实现。第二种是直接创建法,通过调用CFont类的函数CreateFont来实现。

34逻辑字体结构Windows中的字体用LOGFONT结构来描述,这是一种逻辑字体结构,描述了字体的各种属性。

TypedefstructtagLOGFONT { LONGlfHeight; LONGlfWidth; LONGlfEscapement; LONGlfOrientation; LONGlfWeight; BYTElfItalic; BYTElfUnderline; BYTElfStrikeOut; BYTElfCharSet; BYTElfOutPrecision; BYTElfClipPrecision; BYTElfQuality; BYTElfPitchAndFamily; CHARlfFaceName[LF_FACESIZE]; }LOGFONT;35各项参数含义如下:

lfHeight:指定字体的高度(逻辑单位)

lfWidth:指定字体的宽度(逻辑单位)

lfEscapement:指定字体的角度

LONGlfOrientation:指定字体的倾斜方向

LONGlfWeight:指定字体的重量

BYTElfItalic:指定字体是否为斜体字,若非0,则是斜体字

BYTElfUnderline:指定字体是否有下划线,若非0,则带有下划线

BYTElfStrikeOut:指定字体是否有删除线,若非0,则带有删除线

BYTElfCharSet:指定字体的字符集

BYTElfOutPrecision:指定字体的输出精度

BYTElfClipPrecision:指定字体的裁剪精度

BYTElfQuality:指定字体的打印质量

BYTElfPitchAndFamily:指定字体的家族

CHARlfFaceName[LF_FACESIZE]:指定字体的名称

36间接创建法在该方法中,首先需要创建一个LOGFONT结构的对象;然后将所需字体的各项属性依次填入LOGFONT结构中;最后调用CreateFontIndirect函数,通过LOGFONT结构来创建所需要的字体。voidCdrawAppView::OnDraw(CDC*pDC){LOGFONTLgFont;//填写字体结构

LgFont.lfHeight=8; LgFont.lfWidth=0; LgFont.lfEscapement=0; LgFont.lfOrientation=0; LgFontlfWeight=FW_NORMAL; LgFont.lfItalic=0; LgFont.lfUnderline=0; LgFont.lfStrikeOut=0; LgFont.lfCharSet=ANSI_CHARSET; LgFont.lfOutPrecision=OUT_CHARACTER_PRECIS; LgFont.lfClipPrecision=CLIP_CHARACTER_PRECIS; LgFont.lfQuality=DEFAULT_QUALITY; LgFont.lfPitchAndFamily=DEFAULT_PITCH; Strcpy(LgFont.lfFaceName,“TimesNewRoman”); CFontfont; font.CreateFontIndirect(&LgFont);//创建字体 }37直接创建法CreateFont函数用法如下:

BOOLCreateFont( intnWidth, intnEscapement, intnOrientation, intnWeight, BYTEbItalic, BYTEbUnderline, BYTEcStrikeOut, BYTEnCharSet, BYTEnOutPrecision, BYTEnClipPrecision, BYTEnQuality, BYTEnPitchAndFamily, LPCTSTRlpszFaceName );CreateFont()函数中的各参数与LOGFONG结构中的参数相同,只需将指定参数赋给该函数就能够创建各种字体。38使用字体的步骤使用字体的方法与使用画笔、画刷的方法类似。首先需要创建一个新的字体对象,然后用它来取代原有的字体,使用完毕之后再恢复旧字体。下面是一个使用字体的例子:39一个使用字体的示例voidCDrawAppView::OnDraw(CDC*pDC){charmyStr[100];CFontfont;//创建字体font.CreateFont(8,0,0,0,FW_NORMAL,1,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH|FF_ROMAN,“TimesNewRoman”); CFont*pOldFont=font.SelectObject(&font); //选择新字体,保存旧字体

//应用新字体执行文本输出

pDC->SetTextColor(RGB(0,0,255));//设置字体颜色

pDC->SetBkMode(TRANSPARENT);//设置背静模式

strcpy(myStr,“HelloWorld.”);

pDC->TextOut(20,30,myStr,strlen(myStr)); pDC->SelectObject(pOldFont); //恢复旧字体

}绘制文本与图形绘制文本 TextOut,DrawText函数绘制图形画点,画线,画圆,矩形等。41绘制文本CDC类中有两种文本输出函数:TextOut()函数DrawText()函数42TextOutTextOut()函数在指定坐标上,以当前字体、颜色等属性显示字符串,其用法有以下两种:语法一:★virtualBOOLTextOut(intx,inty,LPCTSTRlpszString,intnCount); 其中,x和y为输出文本起始点的横坐标和纵坐标;lpszString是指向输出文本的指针;nCount为输出文本的长度。语法二:★BOOLTextOut(intx,inty,constCString&str); 其中,x和y为输出文本起始点的横坐标和纵坐标;str为存储字符串的CString对象。

43DrawTextDrawText()函数在指定矩形区域内以当前字体、颜色等属性及指定的方式显示字符串,其用法也有两种:

语法一:★virtualintDrawText(LPCTSTRlpszString,intnCount,LPRECTlpRect,UINTnFormat);

语法二:★intDrawText(constCString&str,LPRECTlpRect,UINTnFormat);44DrawText参数意义其中参数的含义如下: lpszString:指向要显示的字符串的指针; nCount:指定字符串的长度; str:存储字符串的CString对象; lpRect:指定矩形区域的RECT结构或CRect对象指针; nFormat:指定显示字符串的格式,可以是下列值的组合:

45DT_BOTTOM:调整字符串使其对齐矩形区域底部,必须与DT_SINGLELINE配合使用;DT_TOP:调整字符串使其对齐矩形区域顶部,必须与DT_SINGLELINE配合使用;DT_CALCRECT:计算要显示字符串的高度和宽度,以便调整矩形的右下角坐标,选择该参数时,DrawText()函数并不实际绘出指定字符串。DT_CENTER:调整字符串使其对齐矩形区域水平中心;DT_VCENTER:调整字符串使其对齐矩形区域垂直中心,必须与DT_SINGLELINE配合使用;DT_EXPANDTABS:将定位字符(Tab)扩展为空白字符,一个定位符默认是8个空白字符;DT_EXTERNALLEADING:通常在计算字符高度时,并不包括字符外围留白部分,加上该参数后,在计算字符高度时,会将字符外围留白部分并入计算。DT_LEFT:调整字符串使其对齐矩形区域左侧;DT_RIGHT:调整字符串使其对齐矩形区域右侧;DT_NOCLIP:所要显示的字符串宽度超过指定矩形范围时,超出部分不切除,这会在一定程度上加快执行速度;DT_NOPREFIX:关闭前置字符辩识功能,默认情况下会将“&”前导字符解释为下划线字符,选择该参数后,则将“&”前导字符解释为一般字符;DT_SINGLELINE:将指定字符串视为单行,换行符被忽略;DT_TABSTOP:设定定位字符代表的空白字符个数,参数nFormat的高字节即定位字符代表的空白字符个数,默认值为8个;DT_WORDBREAK:所要显示的字符串宽度超过指定矩形范围时,自动换行;若字符串含有换行控制符时,也会造成换行。▲

注意:DT_CALCRECT、DT_EXTERNALLEADING、DT_INTERNAL、DT_NOCLIP和DT_NOPREFIX不能与DT_TABSTOP一起使用。

46DrawText实例使用DrawText()显示字符串的代码如下:voidCEx09View::OnDraw(CDC*pDC){…CRectrect(10,160,210,360);//定义顶初始化CRect对象PDC->Rectangle(rect);//绘矩形框CStringdata=“\nGoodNight”;pDC->DrawText(data,&rect,DT_CENTER);//显示data数据…}47绘制图形1画点画点函数SetPixel()是最基本的GDI绘图函数,它用指定的颜色在指定的坐标位置画一个点,其用法有两种:

语法一:★COLORREFCDC::SetPixel(intx,inty,COLORREFcrColor);

语法二:★COLORREFCDC::SetPixel(POINTp,COLORREFcrColor);

该函数返回原先此点的颜色。481画点实例下面的代码表示在(100,100)点处画一个红点。voidCEx09View::OnDraw(CDC*pDC){…pDC->SetPixel(100,100,RGB(255,0,0));…}492画直线

先用MoveTo()函数移动当前点,再用LineTo()函数从当前点到指定点之间画一条直线。 MoveTo()函数用于移动当前位置,有两种用法: 语法一:★CPointMoveTo(intx,inty); 语法二:★CPointMoveTo(POINTpoint);50LineTo()函数用于在当前点和指定点之间画一条直线,其用法也有两种: 语法一:★BOOLLineTo(intx,inty); 语法二:★BOOLLineTo(POINTpoint);513画矩形

Rectangle()函数用于画矩形,其用法有两种。 语法一:★BOOLRectangle(intx1,inty1,intx2,inty2); 语法二:★BOOLRectangle(LPCRECTlpRect);voidFrameRect(LPCRECTlpRect,CBrush*pBrush); 该函数和Rectangle()几乎一模一样,但是Rectangle()会用缺省的画笔描边,再用画刷填色;而FrameRect()则是用最后一个参数所指定的画刷来描边框,而且不会在矩形内部填色。524画椭圆

椭圆的画法是:指定一块矩形区域,Windows就会自动画出一个与矩形内切的椭圆。Ellipse()函数用于画椭圆,其用法有两种: 语法一:★BOOLEllipse(intx1,inty1,intx2,inty2); 语法二:★BOOLEllipse(LPCRECTlpRect);535画弧线

这里所说的弧线是指椭圆线上的任意一段,首先要指定一个矩形区域,椭圆内切于该矩形,然后指定画这个椭圆上的某一段。Arc()函数用于画一条椭圆弧线,有两种用法: 语法一:★BOOLArc(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4); 语法二:★BOOLArc(LPCRECTlpRect,POINTptStart,POINTptEnd)。

54画弧线:参数含义参数的含义如下:x1,y1:指定矩形左上角的坐标。x2,y2:指定矩形右下角的坐标。x3,y3:指定圆弧起始参考点坐标。x4,y4:指定圆弧结束参考点坐标。lpRect:指向RECT结构或CRect对象的指针,指定矩形坐标。ptStart:POINT结构或CPoint对象,指定圆弧起始参考点坐标。ptEnd:POINT结构或CPoint对象,指定圆弧结束参考点坐标。

55画弧线:参数含义实际的圆弧为从起始参考点[(x3,y3)或ptStart]沿矩形内切椭圆按逆时针方向到结束参考点[(x4,y4)或ptEnd]的一段圆弧。起点和终点不一定在假象的椭圆上,Windows会自动把椭圆上最接近的点当作真正的起始

56画弧线:实例下面的代码画一段1/4圆弧。voidCEx09View::OnDraw(CDC*pDC){CRectrect(0,0,200,200);//注意:屏幕坐标系统X轴向右为正;Y

温馨提示

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

最新文档

评论

0/150

提交评论