windows程序设计图形分析课件

上传人:我*** 文档编号:142184031 上传时间:2020-08-17 格式:PPT 页数:26 大小:492KB
返回 下载 相关 举报
windows程序设计图形分析课件_第1页
第1页 / 共26页
windows程序设计图形分析课件_第2页
第2页 / 共26页
windows程序设计图形分析课件_第3页
第3页 / 共26页
windows程序设计图形分析课件_第4页
第4页 / 共26页
windows程序设计图形分析课件_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《windows程序设计图形分析课件》由会员分享,可在线阅读,更多相关《windows程序设计图形分析课件(26页珍藏版)》请在金锄头文库上搜索。

1、图形处理,2020年8月17日星期一,2,Windows 绘图原理,我们在 Windows 环境下看到各种元素,如菜单、按钮、窗口、图像,从根本上说,都是“画”出来的。这时的屏幕,就相当于一块黑板,而 Windows 下的各种 GDI 要素,如画笔、画刷等,就相当于彩色粉笔了。我们在黑板上手工画图时,是一笔一划的,电脑亦然。只不过电脑的速度比手工快的太多,所以在我们看起来好像所有的图形文字都是同时出现的。,2020年8月17日星期一,3,普通绘图方式的局限,上述绘图方式我们暂且称之为普通绘图方式吧。虽然这种方式能满足相当一部分的绘图需要,但是当要绘制的对象太复杂,尤其是含有位图时,电脑便力不从

2、心了。这时的画面会显示的很慢,对于运动的画面,会给人“卡”住了的感觉,总之一个字:不爽。,2020年8月17日星期一,4,解决之道:双缓冲,双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。采取这种方法可以提高绘图速度,极大的改善绘图效果。下面是原理图:,2020年8月17日星期一,5,双缓冲原理示意图,2020年8月17日星期一,6,图形设备接口:,当前流行的操作系统绘图功能主要基于光栅图形学。包括基本图形(直线、圆弧、椭圆

3、弧)的扫描转换、多边形的扫描转换、区域填充、裁剪、反走样、投影和消隐等 图形设备接口: 图形设备接口也简称GDI,组成了Windows操作系统的核心部分。GDI管理Windows程序的所有图形输出。也就是说,无论窗口显示在屏幕上还是屏幕保护程序显式一些令人晕炫的图形,还是应用程序打印文档。GDI都要参与进来。 Windows本身使用GDi绘制用户界面元素,例如窗口、菜单和对话框。Windows甚至使用GDI显式鼠标指针、即使鼠标像是“漂浮”在其他屏幕对象之上。 Windows使用GDI,使得应用程序与基础硬件分开来绘制图形。GDI提供给高层绘图函数,这些函数不论基础硬件如何,都能生成相同结果。

4、,2020年8月17日星期一,7,GDI设备,GDI设备 成为GDI设备的唯一条件是点亮像素的能力。 设备环境类(CDC): CDC是所有设备上下文的基类,功能强大,使用其成员函数几乎可以完成所有的绘制工作。 GDI对象: Windows的GDI对象都是从基类CGdiObject中派生而来。可以通过调用GDi派生类的构造函数来创建GDI对象。GDI对象包括:CBitmap、CBrush 、CPen、CFont、CRgn和CPalette。,2020年8月17日星期一,8,GDI和设备描述环境,GDI是用户可以调用的一套用于绘图操作的函数集 。 用来在显示设备硬件与程序员之间进行隔离的虚拟绘图环

5、境叫做设备描述环境DC。它屏蔽了显示设备的特殊性,给程序员提供了一个统一的绘图界面。,打印机,绘图仪,显示器,程序员使用GDI函数在设备描述环境中绘图,设备描述环境,2020年8月17日星期一,9,CDC类,MFC的CDC类封装了GDI和DC,于是GDI函数就成了CDC的方法。 CDC类派生了CClientDC CMetaFileDC CPaintDC CWindowDC 等在不同场合下应用的CDC类,打印机,绘图仪,显示器,设备描述环境,GDI,CDC,DC,2020年8月17日星期一,10,CPen类,画笔是绘制线条的工具,它CPen类的对象。 CPen类的构造函数为: CPen(int

6、style,int width,COLORREF color);,样式,颜色,宽度,2020年8月17日星期一,11,CPen类,画笔必须在设备环境中使用。 设备环境中有一个默认的黑色画笔。 在任何时刻设备环境中必须有一支画笔,并且只能有一支。因此在使用自己定义的画笔时,要使用CDC的函数把默认画笔替换为自己定义的画笔,这个函数的原型为: CPen* SelectObject( CPen* pPen );,2020年8月17日星期一,12,CPen类,使用画笔的代码片段为:,/创建新画笔 CPen newPen(PS_SOLID,width,color); /载入新画笔并把旧画笔存入指针 CP

7、en*oldPen=pDC-SelectObject(,2020年8月17日星期一,13,CBrush类,画刷是CBrush类的对象,是用来填充封闭图形内部的工具。 CBrush类的构造函数有两个:,CBrush(COLORREF color);,CBrush(int style,COLORREF color);,画刷颜色,画刷颜色,画刷样式,2020年8月17日星期一,14,CBrush类,使用画刷的代码片段为:,/创建新画刷 CBrush newBrush (color); /载入新画刷并把旧画刷存入指针 CBrush*oldBrush=pDC-SelectObject(,2020年8月1

8、7日星期一,15,CBrush使用,void CMyView:OnDraw( CDC* pDC ) CPen newPen( PS_SOLID, 2, RGB(0,0,0) ) ) pDC-SelectObject( / newPen被分离出来 ,2020年8月17日星期一,16,CBrush类型,函数SelectStockObject可选用的库存GDI对象类型可以是下列值之一: BLACK_BRUSH 黑色画刷 DKGRAY_BRUSH 深灰色画刷 GRAY_BRUSH 灰色画刷 HOLLOW_BRUSH 中空画刷 LTGRAY_BRUSH 浅灰色画刷 NULL_BRUSH 空画刷 WHIT

9、E_BRUSH 白色画刷 BLACK_PEN 黑色画笔 NULL_PEN 空画笔 WHITE_PEN 白色画笔 DEVICE_DEFAULT_FONT 设备默认字体 SYSTEM_FONT 系统字体,2020年8月17日星期一,17,简单画线,1、定义画线起点心star,end 2、设置MOUSE消息WM_LBUTTONDOWN WM_LBUTTONUP 3.使用画线函数MOVETTO,LINETO,2020年8月17日星期一,18,绘制彩色线条WM_LBUTTONUP,CClientDC dc(this); CPen pen(PS_SOLID,1,RGB(255,0,0); CPen *ol

10、dpen=dc.SelectObject(,2020年8月17日星期一,19,使用画刷,WM_LBUTTONUP CBrush brush(RGB(255,0,0); CClientDC dc(this); dc.FillRect(CRect(start,point), CRect(POINT topleft,POINT bottomRight) FillRect(LPCRECT lpRect,CBrush *brush),2020年8月17日星期一,20,透明画刷:LBUTTONUP,CClientDC dc(this);/创建并获得设备描述表 /创建一个空画刷 CBrush *pBrush

11、=CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH); /将画刷选入设备描述表 CBrush *poldBrush=dc.SelectObject(pBrush); dc.Rectangle(CRect(start,point); dc.SelectObject(poldBrush);,2020年8月17日星期一,21,位图画刷,ONLBUTTONUP CBitmap bitmap; bitmap.loadBitmap(IDB_BITMAP1); CBrush brush(,2020年8月17日星期一,22,绘制扇形效果,/先给视图类定义一个

12、私有变量old /在ONBUTTONDOWN中初始化:old=point; ONMOUSEOVER CClientDC dc(this); /dc.SetROP2(R2_MERGENOTPEN); /dc.SetROP2(R2_BLACK); CPen pen(PS_SOLID,1,RGB(255,0,0); CPen *oldpen=dc.SelectObject(,2020年8月17日星期一,23,CRect clientRect; GetClientRect(,2020年8月17日星期一,24,相关的函数介绍,1)、为屏幕 DC 创建兼容的内存 DC:CreateCompatibleDC

13、() if(!m_dcMemory.CreateCompatibleDC(NULL) / CDC m_dcMemory; :PostQuitMessage(0); 2)、创建位图:CreateCompatibleBitmap() m_Bmp.CreateCompatibleBitmap(,2020年8月17日星期一,25,核心代码,CBitmap m_bmpBuf;/这里面保存了我们做的图,存在于内存中 在view类里面我们需要将这个图拷贝到屏幕上去 位于OnDraw(CDC *pDC)函数中: CDC dcMem;/以下是输出位图的标准操作 CBitmap *pOldBitmap = NUL

14、L; dcMem.CreateCompatibleDC(NULL); pOldBitmap = dcMem.SelectObject(,2020年8月17日星期一,26,CBmpDrawDoc *pDoc = GetDocument(); /得到document中的bitmap对象 CDC *pDC = GetDC(); CDC dcMem; dcMem.CreateCompatibleDC(NULL);/这里我们就在内存中虚拟建造了DC pDoc-m_bmpBuf.DeleteObject(); pDoc-m_bmpBuf.CreateCompatibleBitmap(pDC,100,100);/依附DC创建bitmap CBitmap *pOldBitmap = dcMem.SelectObject(,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号