2022年VC教案81绘图输出_第1页
2022年VC教案81绘图输出_第2页
2022年VC教案81绘图输出_第3页
2022年VC教案81绘图输出_第4页
2022年VC教案81绘图输出_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、课题: 第六章Windows 的图形设备接口及windows 绘图目的要求:windows 图形输出的原理 把握设备环境类的概念与使用 把握基本绘图工具的使用 教学重点:图形输出原理,绘图工具的使用 教学难点:图形输出原理 教学课时:4 教学方法:讲练结合 教学内容与步骤:一、 Windows 绘图过程与设备无关性图形设备接口GDI :治理 Windows 应用程序图形的绘制,在应用程序中, 通过调用 GDI函数绘制不同尺寸、颜色、风格的几何图形、文本和位图;这些图形处理函数组成了图形设备接口 GDI ;是形成 Windows 核心的三种动态链接库之一:user.dll, windows.dl

2、l, 设备环境 DC也称设备描述表或设备上下文,设备环境中的 “设备 ”是指任何类型的显示器或打印机等输出设备;从根本上来说,设备环境 DC 是一个由 Windows 治理的一个数据结构,它储存了绘图操作中一些共同需要设置的信息,如当前的画笔、画刷、字体和位图等图形对象及其属性, 以及颜色和背景等影响图形输出的绘图模式;并实现应用程序、设备驱动程序和输出设备之间绘图命令的转换;形象地说, 一个设备环境供应了一张画布和一些绘画的工具,我们可以使用不同颜色的工具在上面绘制点、线、圆和文本;绘图过程: 图形设备接口 GDI 处于设备驱动程序的上一层,当程序调用绘图函数时,GDI将绘图命令传送给当前设

3、备的驱动程序,以调用驱动程序供应的接口函数;驱动程序的接口函数将 Windows 绘图命令转化为设备能够执行的输出命令,实现图形的绘制;不同设备具 有不同的驱动程序,设备驱动程序是设备相关的;设备无关性:是指操作系统屏蔽了硬件设备的差异,使用户编程时一般无需考虑设备的类型,如不同种类的显示器或打印机;简洁而言: GDI 绘图语句的设备无关性;MFC 与 SDK 编程:MFC 将 GDI 函数和绘图对象封装在一个名为 CDC 的设备环境类中,因此我们可以通过调用 CDC 类的成员函数来完成绘图操作 . SDK 编程:通过设备环境调用系统供应的 GDI 函数和绘图函数来完成绘图过程;猎取设备环境

4、DC的方法:两种编程方式采纳 SDK方法编程,猎取 DC的方法有两种:在 WM_PAINT消息处理函数中通过调用 API函数 BeginPaint 猎取设备环境在其他函数中通过调用 API 函数 GetDChwnd 猎取设备环境,分别用 EndPaint HWND hwnd, PAINTSTRUCT &ps 和 ReleaseDC(hwnd)释放设备环境;采纳 MFC方法编程,在程序中通过声明一个 MFC设备环境类的对象就自动猎取了一个DC,当该对象被销毁时就自动释放了猎取的 DC;主要有三种方式定义 DC 对象:1,CDC pdcthis; 2,CClientDC pdcthis; 3,CP

5、aintDC pdcthis CDC类既作为其它 MFC设备环境类的基类,又可以作为一个一般的设备环境类使用;利用它可以拜访设备属性和设置绘图属性;CDC类对 GDI 的全部绘图函数进行了封装;CPaintDC 类是 OnPaint 函数使用的设备环境类,它代表一个窗口的绘图画面;假如添 加 WM_PAINT消息处理函数 OnPaint ,就需要使用 CPaintDC 类来定义一个设备环境对象;CClientDC 类代表了客户区设备环境;当在客户区实时绘图时,需要利用 CClientDC 类 定义一个客户区设备环境;CWindowDC类代表了整个程序窗口设备环境,可以在整个窗口区域绘图;二,

6、GDI 坐标系和映射模式:GDI 支持这两种坐标系;一般而Windows 坐标系分为规律坐标系和设备坐标系两种,言, GDI 的文本和图形输出函数使用规律坐标,而在客户区移动或按下鼠标的鼠标 位置是采纳设备坐标;规律坐标系是面对 DC 的坐标系,这种坐标不考虑详细的设备类型,在绘图时,Windows 会依据当前设置的映射模式将规律坐标转换为设备坐标;设备坐标系是面对物理设备的坐标系,这种坐标以像素或设备所能表示的最小长度单位为单位, X 轴方向向右, Y 轴方向向下;设备坐标系的原点位置0, 0不限定在设备显示区域的左上角; 设备坐标系分为屏幕坐标系、系;窗口坐标系和客户区坐标系三种相互独立的

7、坐标屏幕坐标系以屏幕左上角为原点,一些与整个屏幕有关的函数均采纳屏幕坐标,如GetCursorPos、SetCursorPos、 CreateWindow 、MoveWindow;弹出式菜单使用的也是屏幕坐标;窗口坐标系以窗口左上角为坐标原点,它包括窗口标题栏、菜单栏和工具栏等范畴;客户区坐标系以窗口客户区左上角为原点,主要用于客户区的绘图输出和窗口消息的处理;鼠标消息的坐标参数使用客户区坐标,坐标对应的规律坐标;坐标之间的相互转换:CDC类绘图成员函数使用与客户区MFC 供应了两个函数 CWnd:ScreenToClient 和 CWnd:ClientToScreen 用于屏幕坐标与客户区坐

8、标的相互转换;MFC 供应了两个函数 间的相互转换;CDC:DPtoLP 和 CDC: LPtoDP 用于设备坐标与规律坐标之映像模式(设备环境类对象调用其成员设置窗口映像模式)设置窗口映像模式:映像模式定义了将规律单位转化为设备的度量单位以及设备的x 方向和 y 方向,程序员可在一个统一的规律坐标系中操作而不必考虑输出设备的坐标系情形映射模式 规律单位 坐标系设定MM_TEXT 一个像素 X轴正方向朝右, Y轴正方向朝下MM_LOMETRIC 0.1毫米 X轴正方向朝右, Y轴正方向朝上MM_HIMETRIC 0.01毫米 X轴正方向朝右, Y轴正方向朝上MM_LOENGLISH 0.01英

9、寸 X轴正方向朝右, Y轴正方向朝上MM_HIENGLISH 0.001英寸 X轴正方向朝右, Y轴正方向朝上MM_TWIPS 1/1440 英 X轴正方向朝右, Y轴正方向朝上寸MM_ISOTROPIC 系统确定 X、Y轴可任意调剂, X 、Y轴比例为 1:1 MM_ANISOTROC 系统确定 X、Y轴可任意调剂, X、Y轴比例任意设置原点:视口的缺省原点和窗口的缺省原点均为(0,0)通过调用函数 CDC:SetWindowOrg 设置设备环境的 窗口原点 的坐标,调用CDC:SetViewportOrg 重新设置设备的视口原点 的坐标; 窗口: 对应规律坐标系上程序员设定的区域,视口:对

10、应实际输出设备上程序员设定的区域窗口原点是指规律窗口坐标系的原点在视口(设备) 坐标系中的位置,视口原点是指设备实际输出区域的原点;除了映射模式,窗口和视口也是打算一个点的规律坐标如何转换为设备坐标的一个因素;一个点的规律坐标依据如下式子转换为设备坐标:设备(视口)坐标= 规律坐标 窗口原点坐标+ 视口原点坐标绘图模式: 1,规律坐标映射为设备坐标(设置原点);2,直接在设备坐标中绘图;坐标映射: 设坐标方向为向右,向下,SetWindowOrg50 ,50,就:规律坐标(50,50)映射为设备坐标(0,0);即规律坐标中图形向左向上进行了平移;故窗口原点的设置原就:设为与要移动方向相反方向;

11、规律坐标 设备坐标A0,0 A50,50 例: 填空:将如上图中规律坐标中图形移到设备坐标中相应位置,就:SetWindowOrg _, _ 例 分别在 OnDraw 函数中添加如下代码,设置不同的窗口原点和视口原点,结果有什么不同;(1)pDC-SetMapModeMM_TEXT; pDC-RectangleCRect50, 50, 100, 100; (2)pDC-SetMapModeMM_TEXT; pDC-SetWindowOrg50, 50; pDC-RectangleCRect50, 50, 100, 100; (3)pDC-SetMapModeMM_TEXT; pDC-SetVi

12、ewportOrg50,50; pDC-RectangleCRect50, 50, 100, 100; (4)pDC-SetMapModeMM_TEXT; pDC-SetViewportOrg50,50; pDC-SetWindowOrg50, 50; pDC-RectangleCRect50, 50, 100, 100; 设备环境类对象的其它成员函数:颜色设置设置背景色的成员函数 CDC:SetBkColor 设置文本颜色的成员函数 CDC:SetTextColor ;例如:COLORREF rgbBkClr=RGB192,192,192; / 定义灰色pDC-SetBkCorlorrgbB

13、kClr; / 背景色为灰色pDC-SetTextColorRGB0,0,255; / 文本颜色为兰色说明:Windows 用 COLORREF 类型 的数据存放颜色,它是一个 32 位整数;任何一种颜色都是由红、绿、蓝三种基本颜色组成,COLORREF 类型数据的低位字节存放红色强度值,第 2 个字节存放绿色强度值,第3 个字节存放蓝色强度值,高位字节为0,每一种颜色重量的取值范畴为0 到 255;直接设置 COLORREF 数据不太便利,Windows 供应了 RGB 宏用于设置颜色,将其中的红、绿、蓝重量值转换为 COLORREF 类型的颜色数据: RGBbyRed, byGreen,

14、byBlue ,其中参数 byRed、byGreen 和 byBlue 分别表示红、绿、蓝重量值(范畴 0 到 255);红色值: RGB255 ,0, 0 蓝色值: RGB0,255,0 绿色值: RGB0,0,255 三、 GDI 对象:GDI 对象是 Windows 图形设备接口的抽象绘图工具;除了画笔和画刷,其它 GDI 对象仍包括字体、位图和调色板;MFC 对 GDI 对象进行了很好的封装,供应了封装 GDI 对象的类,如 CPen、CBrush、CFont、CBitmap 和 CPalette 等,这些类都是GDI 对象类 CGdiObject 的派生类;CDC 类供应了成员函数

15、SelectObject挑选用户自己创建的 GDI 对象;该函数有多种重载形式,可以挑选用户已定制好的画笔、画刷、字体和位图等不同类型的 GDI 对象;CPen* SelectObjectCPen* pPen; CPen *poldpen=pdc. SelectObject&pen; CBrush* SelectObjectCBrush* pBrush; virtual CFont* SelectObjectCFont* pFont; 绘图输出的一般过程:1, 创建设备环境对象, CClientDC pdcthis; 2, 创建 GDI 对象(绘图工具),CPen pen; pen.Creat

16、GetStockObject(BLACK_PEN );3, 设备环境对象挑选某些 GDI 对象, pdc. SelectObject&pen;4, 设备环境对象使用 GDI 对象调用绘图函数输出;pdc.ellipse; 1 画笔的创建第一步:使用画笔之前必需事先定义一个画笔对象(API :句柄)形式如下:CPen pen /HPEN hP; 其次步:然后调用成员函数 CreatStockObject 猎取 Windows 系统定义的四种画笔或 创建用户自定义新画笔;猎取系统画笔BLACK_PEN的形式如下:/hP=GetStockObject (BLACK_PEN ) ; pen.Creat

17、GetStockObject(BLACK_PEN ); 画笔样式: WHITE_PEN ,BLACK_PEN ,DC_PEN, NULL_PEN 创建新画笔,形式如下:Font. CreatePen .; /hP=CreatePen (int nPenStyle, /确定画笔样式int nWidth, /画笔宽度COLORREF rgbColor / 画笔颜色); 画笔样式有:PS_DASH :虚线PS_DASHDOT :点划线PS_DASHDOTDOT : 双点划线PS_DOT:点线PS_INSIDEFRAME :实线PS_NULL :无PS_SOLID :实线注:不再使用当前画笔时,需删除

18、画笔,以免占内存2 font.DeleteObject API 中: DeleteObjecthP; 画刷的创建第一步:使用画刷需事先定义一个画刷类对象;形式如下:/ HBRUSH hBr; /hBr 为画刷句柄CBrush brush; 其次步:然后调用函数 CreateStockObject 猎取 Windows 系统供应的 7 种画刷/ hBr= (HBRUSH )GetStockObjectnBrushStyle )画刷样式brush. CreateStockObjectnBrushStyle 画刷样式: BLACK_BRUSH 黑色画刷, DKGRAY_BRUSH 深灰色画刷GRAY

19、_BRUSH 灰色画刷, HOLLOW_BRUSH 虚画刷LTGRAY_BRUSH 亮灰色画刷, NULL_BRUSH 空画刷WHITE_BRUSH 白色画刷指定颜色画刷如何获得?可调用函数 CreateSolidBrush 和 CreateHatchBrush 创建具有指定颜色的单色画刷,创建指定阴影图案和颜色的画刷;brush. CreateSolidBrushrgbColor; 注: 删除画刷;不使用画刷时,可用 brush. DeleteObject; 删除画刷,释放内存四、 常用绘图函数(由设备环境类对象 CClient pdcthis 调用1设置画笔当前位置的函数 MoveToEx

20、 ,/ pdc. MoveToEx / BOOL MoveToEx / HDC hdc, int X,Y , / X 、Y 分别为新位置的规律坐标LPPOINT lpPoint / 存放原画笔位置的 POINT 结构地址 2 从当前位置向指定坐标点画直线的函数 LineToEx ,BOOL LineToExHDC hdc,int X,int Y /X 和 Y 为线段的终点坐标3 从 当 前 位 置 开 始 , 依 次 用 线 段 连 接 lpPoints 中 指 定 的 各 点 . pdc. Polyline / BOOL Polyline / HDC hdc, LPPOINT lpPoint

21、s, /指向包含各点坐标的 POINT 结构数组的指针int nCount / nCount 为 POINT 数组中点的个数 4 绘制椭圆弧线的函数 Arc ,BOOL Arc HDC hdc, int X1,intY1, /边框矩形左上角的规律坐标int X2,int Y2, /边框矩形右下角的规律坐标int X3,int Y3, /椭圆弧起始点坐标int X4,int Y4 /椭圆弧终止点坐标 5 绘制饼图,并用当前画刷进行填充BOOL Pie HDC hdc, int X1,intY1, /边框矩形左上角的规律坐标int X2,int Y2, /边框矩形右下角的规律坐标int X3,in

22、t Y3, /椭圆弧起始经线的确定点坐标int X4,int Y4 /椭圆弧终止经线的确定点坐标 6 绘制矩形,并用当前画刷进行填充 BOOL RectangleHDC hdc,int X1,int Y1,int X2,int Y2 X1 ,Y1 )和 X2 ,Y2)分别为矩形的左上角和右下角的规律坐标 7 绘制圆角矩形,并用当前画刷填充BOOL RoundRect HDC hdc,int X1,int Y1,int X2,int Y2, int nHeight, int nWidth 圆角的高度和宽度8 绘制椭圆,并用当前画刷填充 BOOL EllipseHDC hdc,intX1,intY

23、1,intX2,intY2 9绘制多边形,并用当前画刷填充 BOOL PolygonHDC hdc,LPPOINT lpPoints,int nCount 包含各点坐标的 POINT 数组的地址多边形点的个数四、 应用实例【例】 利用绘图函数创建填充区;共有三个填充图形,第一个是用深灰色画刷填充带圆角的矩形,其次个是采纳亮灰色画刷填充一个椭圆型图,第三个是用虚画刷填充饼形图;使用虚画刷填充时,看不出填充成效 . draw1Dlg.cpp void CDraw1Dlg:OnPaint if IsIconic . else CDialog:OnPaint; CClientDC pdcthis; C

24、Rect rc; this-GetClientRect&rc; pdc.Rectanglerc.left,rc.top,rc.right,rc.bottom; CPen pen; CBrush brush,brush1; pdc.SetMapModeMM_ANISOTROPIC; / 设 置 映 像 模 pen.CreateStockObjectBLACK_PEN; /GetStockObjectBLACK_PEN; /黑色画笔 brush.CreateStockObjectDKGRAY_BRUSH; / GetStockObjectDKGRAY_BRUSH; / 画刷 pdc.SelectO

25、bjectbrush; /挑选画刷 hDC, pdc.SelectObjectpen; /挑选画笔 hDC, pdc.RoundRect50,120,100,200,15,15; /绘制圆 角矩形brush1.CreateStockObjectLTGRAY_BRUSH; /采纳亮灰色画刷 pdc.SelectObjectbrush1; /挑选画刷 pdc.Ellipse150,50,200,150; /绘制椭圆 brush.CreateStockObjectHOLLOW_BRUSH; / 虚画刷 pdc.SelectObjectbrush; /挑选画刷 pdc.Pie250,50,300,10

26、0,250,50,300,50; /绘制饼形 动态图形:用户区窗口图形的刷新:常用用户区窗口刷新机制:当用户区的内容需要刷新时,系统向应用程序消息队列发送WM_PAINT 消息,系统在应用程序的消息队列中加入该消息,以通知窗口函数执行刷新处理;应用程序接收到该消息后,调用 刷新恳求的两种方式:On_Paint 函数实现窗口图形的重画;以下大事,系统会自动窗口刷新恳求:用户区移动或显示,用户窗口大小转变,程序通过滚动条滚动窗口, 窗口被另一个窗口掩盖的,复原如下拉式菜单关闭等,光标穿过用户区,图标拖过用户区;用户的刷新恳求:调用窗口类函数:Invalidatetrue 或 InvalidateR

27、ect 【例】 编写一个程序, 在屏幕上显现一个圆心沿正弦曲线轨迹移动的实心圆,而且,每隔四分之一周期, 圆的填充色和圆的周边颜色都发生变化,由正弦曲线幅值的 0.2 倍至 0.6 倍线性增长;同时, 圆的半径在四分之一周期之内1 正弦曲线的表示:窗口初始化时,生成正弦曲线各点的坐标;把正弦曲线一个周期的横坐标分成 100 个等分点,储备在数组lpSin100 中, 100 个点的坐标运算如下:forint j=0;j100;j+ /生成正弦曲线的点坐标 /POINT psSin100 lpSinj.x=longj*2*Pi/100*60;/ 正弦曲线宽放大 60 倍 lpSinj.y=lon

28、gdfRange*sinj*2*Pi/100; 高放大 dfRange=100 倍2 动态显示圆在正弦曲线上移动 数组 lpSin100 的长度为 100,设定圆在正弦曲线移动时共有 100 个位置 数组中每一个值是圆移动时圆心的坐标,每四分之一周期有 25 个位置i=25 处于第 1 个 1/4 周期,创建红色画笔和画刷;25i50 处于第 2 个 1/4 周期,创建绿色画笔和画刷;50i75 处于第 3 个 1/4 周期,创建蓝色画笔和画刷;75i100 处于第 4 个 1/4 周期,创建黄色画笔和画刷;CPen pen;Cbrush brush; ifi=25 /第一个 1/4 周期 /

29、hPen=CreatePenPS_DASH,1,RGB255,0,0; pen. CreatePenPS_DASH,1,RGB255,0,0; /hBrush=CreateHatchBrushHS_BDIAGONAL,RGB255,0,0; brush. CreateHatchBrushHS_BDIAGONAL,RGB255,0,0; lRadious=longdfRange*0.2+i%25*dfRange*0.4/25;/ 运算半径 在消息 WM_PAINT处理程序中, 由此经过线性差分运算圆半径的大小lRadious ,第 1 个 1/4周期的程序代码如下:创建的画笔和画刷选入设备环境后

30、,调用函数 Ellipse 绘制圆形3动态显示的关键:Sleep100; /停 0.1 秒; 调用 Sleep100函数使程序暂停0.1 秒;所含参数100代表暂停的时间,使用毫秒作单位;ifi100 InvalidateRecthWnd,NULL,1; /刷新用户区;i100 时调用函数刷新用户区 发送 WM_PAINT 消息,刷新整个用户区,清除用户区中全部的显示内容 详细操作:一,定义变量:class CTuyuanDlg : public CDialog / Construction public: CTuyuanDlgCWnd* pParent = NULL; public: / s

31、tandard constructor double dfTheta,dfRange; /正弦曲线的宽高放大倍数. long i,j; long lCentreX,lCentreY,lRadious; /定义圆心坐标和圆半径 . POINT lpSin100; /定义正弦曲线的点坐标 . ,做为该类的成员;位置:在对话框类对象定义中(即头文件中)或在 CText1Dlg.h 加入 二,初始化变量:头文件中: #define pi 3.14159 编译文件中: #inlcude “ math.h”dfTheta=60, dfRange=100.0; /正弦曲线的宽高放大倍数. i=0,j=0;

32、lCentreX=0,lCentreY=0,lRadious=long0.2*dfRange; forint j=0;j100;j+ /生成正弦曲线的点坐标 lpSinj.x=longj*2*Pi/100*dfTheta; lpSinj.y=longdfRange*sinj*2*Pi/100; 位置:在对话框类对象的构造函数或初始化函数中:三,绘图:CText1Dlg:OnInitDialog 位置:在对话框类对象的绘图函数中:void CText1Dlg:OnPaint CClientDC pdcthis; CPen pen,*mypen, pen1; CBrush brush,*mybrush; pdc.SetWindowOrg-50,-150; /pdc.SetWindowExt-200,-200;/ 设置原点坐标 pen1.CreatePenPS_DASH,1,RGB255,0,0; /建新画笔 /选入画笔 mypen=pdc.SelectObject&pen1; pdc.PolylinelpSin,100; / fabssini*2*Pi/100 *dfRange*0.4 ifi=25 /

温馨提示

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

评论

0/150

提交评论