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

下载本文档

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

文档简介

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

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

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

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

5、员提供了一个统一的绘图界面。2021年10月16日星期六8打印机绘图仪显示器程序员使用GDI函数在设备描述环境中绘图设备描述环境2021年10月16日星期六9CDC类类nMFC的CDC类封装了GDI和DC,于是GDI函数就成了CDC的方法。nCDC类派生了CClientDC CMetaFileDC CPaintDC CWindowDC 等在不同场合下应用的CDC类打印机绘图仪显示器设备描述环境GDICDCDC CPenCPen类类画笔是绘制线条的工具,它CPen类的对象。 CPen类的构造函数为: CPen(int style,int width,COLORREF color); 2021年1

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

7、mp;newPen);/绘图代码 /在使用新画笔绘制线条之后,恢复原画笔 pDC-SelectObject(oldPen); 2021年10月16日星期六13 CBrush类类n画刷是CBrush类的对象,是用来填充封闭图形内部的工具。nCBrush类的构造函数有两个: CBrush(COLORREF color); CBrush(int style,COLORREF color);画刷颜色画刷颜色画刷样式2021年10月16日星期六14 CBrush类n使用画刷的代码片段为:使用画刷的代码片段为:/创建新画刷CBrush newBrush (color);/载入新画刷并把旧画刷存入指针CBr

8、ush*oldBrush=pDC-SelectObject(&newBrush);/绘图代码 /在使用新画刷绘制线条之后,恢复原画刷 pDC-SelectObject(oldBrush); CBrush使用void CMyView:OnDraw( CDC* pDC )CPen newPen( PS_SOLID, 2, RGB(0,0,0) ) )pDC-SelectObject( &newPen ); pDC-MoveTo(.);pDC-LineTo(.);pDC-SelectStockObject( BLACK_PEN ); / newPen被分离出来2021年10月16日星

9、期六15CBrush类型函数函数SelectStockObject可选用的库存可选用的库存GDI对象类型可以是下列值之一:对象类型可以是下列值之一:BLACK_BRUSH 黑色画刷DKGRAY_BRUSH 深灰色画刷GRAY_BRUSH 灰色画刷HOLLOW_BRUSH 中空画刷LTGRAY_BRUSH 浅灰色画刷NULL_BRUSH 空画刷WHITE_BRUSH 白色画刷BLACK_PEN 黑色画笔NULL_PEN 空画笔WHITE_PEN 白色画笔DEVICE_DEFAULT_FONT 设备默认字体SYSTEM_FONT 系统字体2021年10月16日星期六16简单画线1、定义画线起点心s

10、tar,end2、设置MOUSE消息WM_LBUTTONDOWNWM_LBUTTONUP3.使用画线函数MOVETTO,LINETO2021年10月16日星期六17绘制彩色线条WM_LBUTTONUPCClientDC dc(this);CPen pen(PS_SOLID,1,RGB(255,0,0);CPen *oldpen=dc.SelectObject(&pen);dc.MoveTo(start);dc.LineTo(old);dc.SelectObject(oldpen);2021年10月16日星期六18使用画刷WM_LBUTTONUPCBrush brush(RGB(255,

11、0,0);CClientDC dc(this);dc.FillRect(CRect(start,point),&brush);CRect(POINT topleft,POINT bottomRight)FillRect(LPCRECT lpRect,CBrush *brush)2021年10月16日星期六19透明画刷:LBUTTONUPCClientDC dc(this);/创建并获得设备描述表/创建一个空画刷CBrush *pBrush=CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH);/将画刷选入设备描述表CBrush *pol

12、dBrush=dc.SelectObject(pBrush);dc.Rectangle(CRect(start,point);dc.SelectObject(poldBrush);2021年10月16日星期六20位图画刷ONLBUTTONUPCBitmap bitmap;bitmap.loadBitmap(IDB_BITMAP1);CBrush brush(&bitmap);CClientDC dc(this);dc.FillRect(CRect(start,point),&brush);2021年10月16日星期六21绘制扇形效果/先给视图类定义一个私有变量old/在ONBU

13、TTONDOWN中初始化:old=point;ONMOUSEOVERCClientDC dc(this);/dc.SetROP2(R2_MERGENOTPEN);/dc.SetROP2(R2_BLACK);CPen pen(PS_SOLID,1,RGB(255,0,0);CPen *oldpen=dc.SelectObject(&pen);dc.MoveTo(start);dc.LineTo(old);old=point;dc.SelectObject(oldpen);2021年10月16日星期六22 CRect clientRect;GetClientRect(&client

14、Rect);/获取当前窗口大小/画背景- CBitmap bitmap; /定义一个位图 bitmap.LoadBitmap(IDB_BITMAP1); /加载一个位图 BITMAP bmp; /这个结构体能指示位图的高度和宽度 bitmap.GetBitmap(&bmp);/用位图信息填充结构体 /CreateCompatibleDC()能创建一个与pDC相兼容的内存上下文(块), /它表示了一个显示的表面,并在将图像拷到设备表面前在内存中准备图像. CDC dcCompatable; /定义一个兼容DC dcCompatable.CreateCompatibleDC(pDC); /

15、创建一个和pDC兼容的DC(dcCompatable). dcCompatable.SelectObject(&bitmap);/将位图选入兼容DC(dcCompatable)中 /StretchBit()可以实现将源位图可伸缩的拷到目的区域 pDC-StretchBlt(0,0,clientRect.Width(),clientRect.Height(),&dcCompatable,0,0, bmp.bmWidth,bmp.bmHeight,SRCCOPY); 2021年10月16日星期六23相关的函数介绍1)、为屏幕 DC 创建兼容的内存 DC:CreateCompatib

16、leDC() if(!m_dcMemory.CreateCompatibleDC(NULL) / CDC m_dcMemory;:PostQuitMessage(0); 2)、创建位图:CreateCompatibleBitmap()m_Bmp.CreateCompatibleBitmap(&m_dcMemory, rt.Width(), rt.Height(); / CBitmap m_Bmp;3)、把位图选入设备环境:SelectObject(),可以理解为选择画布:SelectObject(m_dcMemory.GetSafeHdc(), m_Bmp); 4)、把绘制好的图形“拷

17、贝“到屏幕上:BitBlt()pdcView-BitBlt(0, 0, rt.Width(), rt.Height(), &m_dcMemory, 0, 0, SRCCOPY);2021年10月16日星期六24核心代码CBitmap m_bmpBuf;/这里面保存了我们做的图,存在于内存中在view类里面我们需要将这个图拷贝到屏幕上去位于OnDraw(CDC *pDC)函数中:CDC dcMem;/以下是输出位图的标准操作CBitmap *pOldBitmap = NULL;dcMem.CreateCompatibleDC(NULL);pOldBitmap = dcMem.Select

18、Object(&pDoc-m_bmpBuf);BITMAP bmpinfo;pDoc-m_bmpBuf.GetBitmap(&bmpinfo);pDC-BitBlt(0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,&dcMem,0,0,SRCCOPY);dcMem.SelectObject(pOldBitmap);dcMem.DeleteDC();2021年10月16日星期六25CBmpDrawDoc *pDoc = GetDocument(); /得到document中的bitmap对象 CDC *pDC = GetDC();CDC dcMem;dcMem.CreateCompatibleDC(NULL);/这里我们就在内存中虚拟建造了DCpDoc-m_bmpBuf.DeleteObject();pDoc-m_bmpBuf.CreateCompatibleBitmap(pDC,100,100);/依附DC创建bitmapCBitmap *pOldBitmap = dcMem.SelectObject(&pDoc-m_bmpBuf);/我们调入了我们b

温馨提示

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

评论

0/150

提交评论