图形设备接口与绘图_第1页
图形设备接口与绘图_第2页
图形设备接口与绘图_第3页
图形设备接口与绘图_第4页
图形设备接口与绘图_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

图形设备接口与绘图Chap7第一页,共三十八页。本章内容设备环境和设备环境类GDI绘图对象及其管理映射模式CDC中的绘图操作及其特点绘制文本第二页,共三十八页。

Windows的图形设备接口Windows图形设备接口(GDI,GraphicsDeviceInterface)是为与设备无关的图形设计的。所谓设备无关性,就是操作系统屏蔽了硬件设备的差异。因为计算机常与一系列不同的设备结合在一起,如打印机、绘图仪等输出设备以及显示设备等,因而设备无关性的图形能使用户编程时无需考虑特殊的硬件设置,这对Windows编程来说是非常重要的。Windows应用程序使用图形设备接口和Windows设备驱动程序来支持与设备无关的图形。图形设备接口(GDl)是Windows系统的重要组成部分,负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上显示图形或文字。第三页,共三十八页。

Windows的图形设备接口计算机输出设备和显示设备种类繁多,包括不同技术标准的显示器、打印机、绘图仪等,每类设备又包含许多不同的型号。为了适应不同的设备,Windows系统提供应用程序与具体设备分离的功能。操作系统管理并协调一系列输出设备驱动程序,将应用程序的图形输出请求转换为打印机、绘图仪、显示器或其他输出设备上的输出。GDI的设备无关性是Windows操作系统的特色之一。对于开发人员而言,所要做的工作仅仅是在系统的帮助下建立一个与某个实际输出设备的关联,以要求系统加载相应的设备驱动程序,其他的具体输出操作则由系统实现。Windows系统分担了应用程序的硬件设备适配器功能。第四页,共三十八页。设备描述表(DeviceContext)设备描述表是一个用来确定任何设备的GDI输出的位置和形象的属性的集合。应用程序并不能直接存取设备描述表,但是,应用程序可以使用设备描述表的句柄来间接地存取设备描述表及其属性。当程序为设备描述表要求一个句柄时,就将创建一个设备描述表。创建的设备描述表包含了它所有的属性和默认值,应用程序可以修改这些属性。应用程序对图形的操作均参照设备描述表中的属性执行。可以将设备描述表看成图形的“输出模板”。依靠这块模板,当程序员调用GDI函数输出图形或文字时,不必关心诸如背景颜色、字体等问题。第五页,共三十八页。设备描述表(DeviceContext)设备环境(windows保存的一个数据结构,该结构包含应用程序向设备输出时所需要的信息。)应用程序MFC设备环境类图形设备接口设备驱动程序第六页,共三十八页。

8.1.2设备环境类设备环境类CDC的分类CClientDC:只能在窗口的用户区绘图.用户区指窗口中除去边框、标题栏、菜单栏、状态栏等的区域、通常先调用窗口的GetClientRect()来获取用户区的大小.CWindowDC:能在窗口的任意位置绘图.通常先调用GetWindowRect()来获取窗口在屏幕坐标系中的外边框坐标.CPaintDC:往往在OnPaint()函数中使用,OnPaint()函数首先构造一个CpaintDC对象,再把它的指针传给OnDraw()函数进行绘图.第七页,共三十八页。

8.1.2设备环境类设备环境类CDC的内容当前GDI绘图对象及其管理映射方式绘图状态管理和绘图操作第八页,共三十八页。

8.2GDI绘图对象及其管理建立设备环境调用BeginPaint()函数应用程序响应WM_PAINT消息进行图形刷新时,由OnPaint()函数调用BeginPaint()函数获取设备环境指针,并把它传递给OnDraw()函数完成绘图.调用GetDC()函数如果绘图工作不是由WM_PAINT消息驱动的则调用GetDC()函数获取设备环境.第九页,共三十八页。8.2.2GDI对象的分类CPenCBrushCFontCRgnCPaletteCBitmap第十页,共三十八页。

8.2.3CPen第十一页,共三十八页。

8.2.3CPen例: HPENhpold,hpnew; hpnew=(HPEN)GetStockObject(BLACK_PEN); hpold=(HPEN)pDC->SelectObject(hpnew); pDC->MoveTo(10,10); pDC->LineTo(100,100); pDC->SelectObject(hpold);第十二页,共三十八页。

8.2.3CPen第十三页,共三十八页。

8.2.3CPen例: CPenmyPen,*oldPen; myPen.CreatePen(PS_SOLID,10,RGB(255,0,0)); oldPen=(CPen*)pDC->SelectObject(&myPen); pDC->MoveTo(10,10); pDC->LineTo(100,100); pDC->SelectObject(oldPen);第十四页,共三十八页。

8.2.4CBrush第十五页,共三十八页。

8.2.4CBrush例:

HBRUSHhb,oldhb; hb=(HBRUSH)GetStockObject(BLACK_BRUSH); oldhb=(HBRUSH)pDC->SelectObject(hb); pDC->Rectangle(20,20,200,200); pDC->SelectObject(oldhb);第十六页,共三十八页。8.2.4CBrush第十七页,共三十八页。

8.2.4CBrush第十八页,共三十八页。

8.2.4CBrush例:

CBrushmyBrush,*oldBrush; myBrush.CreateHatchBrush(HS_CROSS,RGB(255,0,0)); oldBrush=pDC->SelectObject(&myBrush); pDC->Rectangle(20,20,200,200); pDC->SelectObject(oldBrush);第十九页,共三十八页。

8.2.5CFont第二十页,共三十八页。

8.2.5CFont中文的字体是很丰富的,目前有40多种字体但是,系统提供的字体往往还不能满足应用程序的需要.程序员可调用GreateFont()、CreatFontIndirect()、CreatPointFont()、CreatPointFontIndex()创建自定义字体.第二十一页,共三十八页。

8.2.5CFont第二十二页,共三十八页。

8.2.5CFont例:第二十三页,共三十八页。

8.2.5CFont例:

for(inti=5;i<10;i++) { CFontfont; font.CreateFont(-i*5, 0, 100, 0, 400, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Arial"); CFont*oldFont=pDC->SelectObject(&font); pDC->TextOut(30,50*i-200,"使用CreatFont()创建字体");

pDC->SelectObject(oldFont); }第二十四页,共三十八页。

8.2.5CFont当调用CreatFontIndirect()函数时,必须使用LOGFONT结构来构造CFont对象来绘制字体,LOGFONT结构如下:TypedefstructtagLOGFONT{ LONGlfHeight; LONGlfWidth; LONGlfEscapement; LONGlfOrientation; LONGlfWeight; BYTElfItalic; BYTElfUnderline; BYTElfStrikeOut; BYTElfCharSet; BYTElfOutPrecision; BYTElfClipPrecision; BYTElfQuality; BYTElfPitchAndFamility; BYTElfFaceName[LF_FACESIZE];}LOGFONT第二十五页,共三十八页。

8.2.5CFont例:第二十六页,共三十八页。

8.2.5CFont例:

LOGFONTlf; lf.lfHeight=40; lf.lfWidth=20; lf.lfItalic=true; lf.lfUnderline=true; lf.lfOrientation=0; lf.lfWeight=800; lf.lfEscapement=0; lf.lfCharSet=GB2312_CHARSET; CFontfont; font.CreateFontIndirect(&lf); CFont*old=pDC->SelectObject(&font); pDC->TextOut(0,200,"使用CreatFontIndirect()创建字体");

pDC->SelectObject(old);

第二十七页,共三十八页。8.4CDC中的绘图操作及其特点设置绘图参数设置绘图模式intSetRop2(intDrawMode);设置背景颜色VirtualCOLORREFSetBKColor(COLOREFcrColor);设置背景模式IntSetBKMode(intnBKMode);nBKModeOPAQUE(不透光):输出文本模式,默认值nBKModeTRANSPARENT(透明):绘制之前背景色不改变绘图函数第二十八页,共三十八页。8.4CDC中的绘图操作及其特点绘图函数点CPointGetCurrentPosition();CPointMoveTo(intx,inty);CPointMoveTo(POINTpoint);直线BOOLLineTo(intx,inty);BOOLLineTo(intx,inty);椭圆IntGetArcDirection();IntSetArcDirection(intnArcDirection);第二十九页,共三十八页。8.4CDC中的绘图操作及其特点绘图函数椭圆绘制椭圆弧线的函数Arc的原型如下:BOOLArc(intXl,intYl,//指定边框矩形左上角的逻辑坐标intX2,intY2,//指定边框矩形右下角的逻辑坐标intX3,intY3,//椭圆弧起始径线的确定点坐标intX4,intY4//椭圆弧终止径线的确定点坐标);

x2,y2x3,y3x4,y4x1,y1第三十页,共三十八页。8.4CDC中的绘图操作及其特点绘图函数椭圆使用当前画笔绘制一个饼图,并使用当前画刷进行填充的函数Pie: 该函数的原型如下: BOOLPie ( intXl,intYl,//指定边框矩形左上角的逻辑坐标 intX2,intY2,//指定边框矩形右下角的逻辑坐标 intX3,intY3,//椭圆弧起始径线的确定点坐标 intX4,intY4//椭圆弧终止径线的确定点坐标 );第三十一页,共三十八页。8.4CDC中的绘图操作及其特点绘图函数椭圆画椭圆BOOLEllipse(intx1,inty1,intx2,inty2);BOOLEllipse(LPCRECTlpRect);矩形voidFillRect(LPCRECTlpRect,Cbrush*pBrush);voidFrameRect(LPCRECTlpRect,Cbrush*pBrush);BOOLRectangle(intx1,inty1,intx2,inty2);BOOLRectangle(LPCRECTlpRect);

第三十二页,共三十八页。8.5绘制文本文本格式化属性属性文本及背景颜色对齐方式字符间隔文本调整CDC的方法SetTextColor()SetBkColor()SetBkMode()SetTextAlign()

第三十三页,共三十八页。8.5绘制文本绘制文本函数BOOLTextOut(intx,inty,constCstrint&str);VirtualintDrawText(LPCTSTRlpszString,intnCount,LPRECTlpRect,UNITnFormat);intDrawText(constCString&str,LPRECTlpRect,UNITnFormat);VirtualBOOLExtTextOut(intx,inty,UNITnOption,LPCRECTlpRect,LPCTSTRlpszString,UNITnCount,LPINTlpDxWidths);BOOLExtTextOut(intx,inty,UNITnOption,LPCRECTlpRect,constCstring&str,LPINTlpDxWidths);VirtualCsizeTabbedTextOut(intx,inty,LPCTSTRlpszString,intnCount,intnTabPositions,LPINTlpnTabStopPosition,intnTabOrigin);CsizeTabbedTextOut(intx,inty,constCstring&str,intnTabPositions,LPINTlpnTabStopPosition);

第三十四页,共三十八页。8.6实例

第三十五页,共三十八页。8.6实例

CFontView成员变量:

LOGFONTm_lFont; COLORREFm_cTextColor;CFontView::CFontView(){ m_cTextColor=RGB(255,0,0); m_lFont.lfHeight=30; m_lFont.lfWidth=0; m_lFont.lfEscapement=0; m_lFont.lfOrientation=0; m_lFont.lfWeight=FW_NORMAL; m_lFont.lfItalic=FALSE; m_lFont.lfUnderline=FALSE; m_lFont.lfStrikeOut=FALSE; m_lFont.lfCharSet=GB2312_CHARSET; m_lFont.lfOutPrecision=OUT_STROKE_PRECIS; m_lFont.lfQuality=DRAFT_QUALITY; m_lFont.lfPitchAndFamily=VARIABLE_PITCH|FF_MODERN; strcpy(m_lFont.lfFaceName,"楷体_GB2312");}第三十六页,共三十八页。8.6实例

voidCFontView::OnDraw(CDC*pDC){ CFontDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); CFontmyFont; CFont*pOldFont; myFont.CreateFontIndirect(&m_lFont); pOldFont=pDC->SelectOb

温馨提示

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

评论

0/150

提交评论