图形程序设计_第1页
图形程序设计_第2页
图形程序设计_第3页
图形程序设计_第4页
图形程序设计_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

图形程序设计1第1页,共33页,2023年,2月20日,星期六

8.1设备上下文分类(设备环境)CDC类(设备环境类,Cobject的子类)

CDC类提供了对设备描述表进行操作的成员函数以及对窗口有关描述表进行操作的成员函数。用提供的函数对设备描述表进行操作,绘图工具的使用,图形界面的选择、颜色及调色板的操作。取得绘图的属性、映射方式、视口及窗口的操作、坐标转换等。2第2页,共33页,2023年,2月20日,星期六

CDC

CPaintDC

CClientDC

CWindowDC

CMetaFileDC

CPreviewDC

Cobject打印预览输出类CDC的子类3第3页,共33页,2023年,2月20日,星期六

CDC的派生类:

CpaintDC类一般用在函数OnPaint()内,响应WM_PAINT的消息。

windows的消息循环机制一直在采集各种消息,当接到WMPAINT消息时,自动调用固定的绘图函数,使用CpaintDC类对象的成员函数,完成客户区绘图。

(BeginPaint,EndPaint实现句柄建立与释放)

②CClientDC类窗口客户设备描述表,对窗口客户区的图形访问。(GetDC,ReleaseDC实现句柄建立与释放)

CwindowDC类提供一个设备环境、以便成员函数在包括非客户区在内的整个屏幕区的绘图。(GetwindowDC,ReleaseDC建立与释放句柄)4第4页,共33页,2023年,2月20日,星期六

④CMetaFileDC类

封装Windows图元文件中的绘图方法.

构造对象,调用Create函数,绘图:MoveTo,LineTo,…,Close,

返回句柄.(CreateEnhanced,CloseEnhanced建立与释放句柄)2.绘图类的主要差别①

CwindowDC类与CpaintDC和CClientDC类的区别

CwindowDC可以在非客户(窗口)绘制图形,坐标是全屏幕。

CpaintDC和CClientDC只能在客户区绘制图形。坐标原点是客户区的左上角。

CpaintDC类与CClientDC类的区别都可在客户内作图,区别是CpaintDC类应用在OnPaint函数中,以响应windows的WM_PAINT消息,自动实现作图。

CClientDC类可以实现实时绘图。

5第5页,共33页,2023年,2月20日,星期六

CClientDCCWindowDC6第6页,共33页,2023年,2月20日,星期六

3.绘图类的引用方法

①CDC类

CDC类不能用窗口对象指针初始化对象,一般不声明对象直接应用。常用于建立内存设备描述对象。OnDraw(CDC*pDC)②CpaintDC类

CpaintDCdc(this);

定义一个CpaintDC的对象dc,并用当前窗口对象指针this对对象dc进行初始化。

CClientDC类

CClientDCdc(this);

定义一个CClientDC的对象dc,并用当前窗口对象指针this对对象dc进行初始化。

7第7页,共33页,2023年,2月20日,星期六

CwindowDC类

CwindowDCdc(this);

定义一个CwindowDC类的对象dc,并用当前窗口对象指针this对dc进行初始化。4.CDC的部分函数

绘图对象的函数SetObject()

颜色调色板函数SelectPalette()

绘图属性函数SetBkColor()

映射函数SetMapMode()

绘制线条函数LineTo()

置笔位置函数MoveTo()

圆狐函数Arc()

文本颜色函数SetTextColor()8第8页,共33页,2023年,2月20日,星期六voidCMyView::OnDraw(CDC*pDC){CClientDCdc(this);

dc.TextOut(100,100,“成都理工大学图形输出“);}voidCmyView::OnDraw(CDC*pDC){pDC->SetMapMode(2);0.1mm/(象素)

pDC->SetViewportOrg(100,100);pDC->Rectangle(0,0,200,200);}用CClientDC绘图:用CDC绘图:9第9页,共33页,2023年,2月20日,星期六8.2图形设备对象利用MFC开发绘图程序时,需要各种绘图工具,如用来绘制线条的画笔、填充图形的画刷及设置文本格式的字体、颜色等,这些工具称为图形设备对象。MFC提供了图形设备对象类对它们进行封装,这些图形设备对象的描述见表。10第10页,共33页,2023年,2月20日,星期六8.3字体对象在Windows内部,字体用一个名为LOGFONT的结构表示,结构LOGFONT的定义如下:11第11页,共33页,2023年,2月20日,星期六

文本处理实例voidCCEx07aView::OnDraw(CDC*pDC){ CCEx07aDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO:adddrawcodefornativedatahereLOGFONTEx07aFont;定义结构体变量名

Ex07aFont.lfHeight=8;结构体成员中字体高度

Ex07aFont.lfWidth=0;字体平均宽度

Ex07aFont.lfEscapement=0;文本显示的角度

Ex07aFont.lfOrientation=0;字体的角度

Ex07aFont.lfWeight=FW_NORMAL;字体磅数

Ex07aFont.lfItalic=0;斜体字体

Ex07aFont.lfUnderline=0;下划线字体

Ex07aFont.lfStrikeOut=0;删除线的字12第12页,共33页,2023年,2月20日,星期六

Ex07aFont.lfCharSet=ANSI_CHARSET;Ex07aFont.lfOutPrecision=OUT_DEFAULT_PRECIS;Ex07aFont.lfClipPrecision=CLIP_DEFAULT_PRECIS;Ex07aFont.lfQuality=PROOF_QUALITY;Ex07aFont.lfPitchAndFamily=VARIABLE_PITCH|FF_ROMAN;strcpy(Ex07aFont.lfFaceName,"TimesNewRoman");intposition=0;for(inti=0;i<8;i++){Ex07aFont.lfHeight=16+(i*8);CFontfont;font.CreateFontIndirect(&Ex07aFont);CFont*oldFont=pDC->SelectObject(&font);position=position+Ex07aFont.lfHeight;13第13页,共33页,2023年,2月20日,星期六

pDC->SetTextColor(RGB(40+i*30,0,0));置色

pDC->SetBkMode(TRANSPARENT);置模式

pDC->TextOut(20,position,"成都理工大学"); pDC->SelectObject(oldFont);}} 14第14页,共33页,2023年,2月20日,星期六

15第15页,共33页,2023年,2月20日,星期六8.4画笔对象

MFC中的CPen类封装了画笔的功能,画笔对象可以帮助绘制出线条复杂的图形。一般通过两个步骤创建画笔对象,首先定义一个CPen对象,然后调用CreatePen函数初始化画笔。CreatePen函数有以下两种函数原型,第一种函数原型如下:BOOLCreatePen(intnPenStyle,intnWidth,COLORREFcrColor);16第16页,共33页,2023年,2月20日,星期六Cpen类的使用步骤如下:(1)定义画笔对象;(2)初始化画笔对象;(3)将生成的新画笔选入当前设置上下文,同时保留旧的画笔信息;(4)进行绘图;(5)恢复旧的画笔信息。17第17页,共33页,2023年,2月20日,星期六8.5画刷对象画刷对象用来在绘图输出时填充一个封闭图形,实际上定义了一个8像素×8像素大小的位图,在绘图时,windows将多个这样的位图平铺起来,填充封闭图形。MFC中的CBrush类封装了画刷的功能。在创建画刷时,通常先定义CBrush对象,然后调用CreateSolidBrush,CreateaHatchBrush或CreatePattemBrush函数,初始化画刷对象。18第18页,共33页,2023年,2月20日,星期六CBrush类的使用步骤如下:(1)定义画刷对象;(2)初始化画刷对象;(3)将生成的新画刷选入当前设备上下文,同时保留旧的画刷信息;(4)进行绘图;(5)恢复旧的画刷信息。19第19页,共33页,2023年,2月20日,星期六画笔与画刷结构(GDI对象中的绘图)

CGdiObject

CBitmap

CBrush

CFont

CPalette

CPen

CRgn20第20页,共33页,2023年,2月20日,星期六1.画笔的使用

构造一支画笔

Cpen();Cpen(intnPenStyle,intnWidth,COLORREFcrColor);

风格宽度颜色

Cpenpen1(PS_SOLID,10,RGB(255,0,0));Cpen*SelectObject(Cpen*pPen);Cpen*poldPen=pDc->SeclectObject(&pen1);函数原形选入画笔21第21页,共33页,2023年,2月20日,星期六2.

画刷的使用

构造一支画刷:

CBrush();CBrush(COLORREFcrColor);CBrush(intnIndex,COLORREFcrColor);

风格

HS_VERTICAL垂直阴影线

HS_HORIZONTAL水平阴影线

选入画刷:

CBrush*Brush;Brush=NewBrush(RGB(255,0,0));CBrush*poldBrush=pDc->SelectObject(&Brush);22第22页,共33页,2023年,2月20日,星期六3.在绘图过程中使用画笔对象

voidCmyTestView::OnDraw(CDC*PDC){CmyTestDoc*PDoc=GetDocument();//得到文档指针获得数据

ASSERT_VALID(PDoc);

//todo:adddrawcodefornativedatahereintposition=0,x;for(x=1;x<=11;x++){CPenPen(PS_SOLID,x*2+1,RGB(0,255,0));CPen*oldPen=PDC→SelectObject(&Pen);position+=x*2+10;PDC→MoveTo(20,position);PDC→LineTo(400,position);PDC→SelectObject(oldPen);}}

23第23页,共33页,2023年,2月20日,星期六24第24页,共33页,2023年,2月20日,星期六

4.

在绘图过程中使用画刷对象

25第25页,共33页,2023年,2月20日,星期六26第26页,共33页,2023年,2月20日,星期六

①.曲线

voidCMyView::OnCurve(){ //TODO:Addyourcommandhandlercodehere CClientDC*pdc=newCClientDC(this); Cpenpen; pen.CreatePen(PS_SOLID,5,RGB(250,0,0)); CPen*oldpen=(CPen*)pdc->SelectObject(&pen); constdoublePI=3.14159; inti,cx=10,x2=50,y2,m=35,k; doublef,dt,t,q,a[100]; k=m/2; f=30.0; dt=0.004;8.6画刷与画笔的应用27第27页,共33页,2023年,2月20日,星期六

for(i=1;

温馨提示

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

评论

0/150

提交评论