第七章Windows的图形设备接口及Windows绘图
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设备描述表属性
不同的CDC输出函数以不同的方式使用设 备描述表的属性。
例如,在用LineTo画线时,当前画笔决定了线的 颜色、宽度和样式(实线、虚线、点划线等等)
最常用来定义(更改)设备描述表属性的 CDC函数是SelectObject。画笔(Pen)、画 刷(Brush)、字体(Font)、位图(Bitmap)、 调色板(Palette)和区域(Region)均可由此 函数选入DC。
MFC 框架封装的OnPaint()函数 // CView drawing support void CView::OnPaint() { // standard paint routine CPaintDC dc(this); //构造函数会自动调用BeginPaint函数,
//在析构函数中会自动调用EndPaint函数。
大模块:KERNEL32.DLL、 USER32.DLL 、GDI32.DLL)
2
2013-7-25
GDI
GDI的主要目的之一是支持与设备无 关的图形。它处理来自Windows应用 程序的图形函数调用,然后把这些调用 传递给合适的设备驱动程序,由设备驱 动程序把这些函数调用转换为设备(如 显示器或打印机)能够理解的代码或命 令,并产生最后的输出结果。
设置和获取设备描述表属性的函数。
2013-7-25
9
MFC中的设备描述表
在MFC编程中,设备描述表被封装成类。
在使用MFC编制Windows程序时,设备描述表对
象包含如下内容:
Windows设备描述表(作为通往各种输出设备 的桥梁)。
程序用来获取DC属性的函数、用来更改DC属性 的函数,用来产生输出(即真正画图)的GDI函 数(如绘线条、形状和文本的Windows API函数) 等。
29
2013-7-25
CreatePen函数原型
BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor );
其中参数nPenStyle代表了画笔的样式, 可以为下列值之一
PS_SOLID,PS_DASH,PS_DOT, PS_DASHDOT,PS_DASHDOTDOT,PS_NULL, PS_INSIDEFRAME
2013-7-25
19
MFC中设备描述表捕获与释放
CPaintDC、CClientDC、CWindowDC和 CMetaFileDC每个类的构造函数和析构函数 调用相应的函数捕获和释放设备描述表DC, 从而使得DC的使用非常方便简捷: CPaintDC dc(this); // Do some drawing
2013-7-25
21
MFC中设备描述表捕获与释放
示例如下:
CPaintDC * pDC=new CPaintDC(this);
在这种情况下,有必要在创建设备描述表的函数结
束之前执行删除语句。
delete pDC;
以便调用对象的析构函数释放设备描述表(DC)。
2013-7-25
22
MFC中的OnPaint函数
CPaintDC
CClientDC
设备上下文类
CWindowDC
描述 代表整个窗口的设备描述表,包括 客户区和非客户区。 代表Windows图元文件的DC。一 个Windows图元文件包括一系列的 图形设备接口命令,可以通过重放 这些命令来创建图形。向 CMetaFileDC对象进行的各种绘制 操作可以被记录到一个图元文件中。
句柄是一个无符号的整数, Windows 用它在内部引用对象
7
2013-7-25
设备描述表
在取得DC句柄后,Windows会用默认的属 性值填入内部设备描述表结构。
可以通过调用不同的GDI函数改变这些预设值。 利用其他GDI函数可以取得这些属性的目前值。 还有其他的GDI函数能够在窗口的客户区真正 地绘图
2013-7-25
24
MFC中何时调用OnPaint函数
在发生以下事件时,会产生WM_PAINT消 息:
在用户移动或显示窗口时,窗口中先前被隐藏 的区域重新可见; 用户改变的窗口的大小。 程序使用ScrollWindow或ScrollDC函数滚动客 户区的一部分; 程序使用InvalidateRect或InvalidateRgn函数时。
类 Windows图形 设备句柄 描述
CBrush CPen CFont
HBRUSH HPEN HFONT
用来填充正在绘制的对象的内 部 用来绘制对象的边线 用来绘制文本
CBitmap HBITMAP 用来提供操作位图的接口
CPalette HPALETTE 用作应用程序和色彩输出设备 (如显示器)之间的接口
MFC的CDC类将Windows设备描述表和获 取设备描述表句柄GDI函数,就近地封装在 一起,而CDC派生类如CPaintDC和 CClientDC则代表Windows应用程序使用 的不同类型的设备描述表。
2013-7-25
12
CDC类的结构层次:
Cobject
CDC
CClientDC
CPaintDC
2013-7-25
27
MFC创建画笔的方法
方法一:构造一个CPen对象并把定义画笔
所用的参数都传给该对象。
CPen pen(PS_SOLID,1,RGB(255,0,0));
方法二:构造一个没有初始化的CPen对象
并调用CPen::CreatePen。
CPen pen; pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
显示工具提示。
2013-7-25
26
二、 画笔对象
MFC类CPen封装了GDI中的画笔对象,画 笔对象代表了进行绘制时所用的线条。
默认画笔画出的是一个像素点宽的黑色实
线。
Windows用当前选入DC的画笔绘制直线和 曲线,并给用Rectangle、Ellipse以及其 它图形生成函数画出的图形镶画边框。
2013-7-25
30
把画笔选入DC的方法
怎样使用创建好的画笔?
只要把画笔选入DC,然后调用画线函数即可。
把画笔选入DC的函数为SelectObject。
示例如下:
CPen pen(PS_SOLID,10,RGB(255,0,0));//红 色画笔 CPen *pOldPen=dc.SelectObject(&pen); dc.Ellipse(0,0,100,100);
OnPrepareDC(&dc); //详见“Cview::OnPrepareDC” OnDraw(&dc);
}
2013-7-25
重点关注!
23
MFC中何时调用OnPaint函数
OnPaint()函数是响应WM_PAINT消息而 被调用的。
第一个WM_PAINT消息:
大多数应用程序在WinMain中进入消息循环 之前的初始化期间都会调用函数 UpdateWindow。Windows利用这个机会给 窗口过程发送第一个WM_PAINT消息。
第七章 Windows绘图
GDI
图形设备接口(GDI:Graphics Device Interface)是Windows的子系统,它 的主要任务是负责系统与绘图程序之间 的信息交换,处理所有Windows程序的 图形输出(即在视频显示器和打印机等 设备上显示图形)。
GDI的结构:
从程序员的角度来看,GDI由几百个函 数调用和一些相关的数据类型、宏和结 构组成。 在GDI32.DLL中。(Window三
3
2013-7-25
GDI
GDI可以看作是一个应用程序与图形 输出设备之间的中介。
一方面,GDI向应用程序(程序员)提供 了一个与设备无关的编程环境。 另一方面,它又以设备相关的格式和具 体的设备打交道。
2013-7-25
4
设备描述表(Device Context)
设备描述表(简称为“DC”)实际上是GDI 内部保存的数据结构。 设备描述表与特定的显示设备(如视频显 示器或打印机)相关。对于视频显示器,DC 总是与显示器上的特定窗口有关。
2013-7-25
10
MFC中的设备描述表
在MFC中,程序员不用捕获设备描述表句柄 和调用GDI输出函数,至少不必直接捕获和 调用,而是通过创建一设备描述表对象并调 用它的成员函数来画图。
在使用MFC编制Windows程序时,所有的绘 制操作通过一个DC对象进行。
2013-7-25
11
MFC中的设备描述表
DC在国内书本中常见的译名有:“设备上 下文”、“设备描述表”、“设备环境”
2013-7-25
5
设备描述表
DC记录了与之相关的设备的绘制属性的相 关信息,这些属性决定了GDI绘图函数工作的 细节。 例如,调用TextOut(BOOL TextOut( int x, int y, const CString& str ))时,你只需要在 函数中给出起始坐标和文本,您不必指定字 体、文本色,文本后面的背景色彩,以及字 符间距,因为这些属性都是DC的一部分。
2013-7-25
31Fra Baidu bibliotek
DC中的常用画图函数
用来画直线和曲线的CDC函数
2013-7-25
32
DC中的常用画图函数
用来画封闭图形的CDC函数
2013-7-25
33
画笔 实例程序
2013-7-25
34
使用画笔在设备上下文中进行输出
2013-7-25
6
设备描述表
当你想在一个图形输出设备上(诸如屏幕或打印 机)上绘图时,首先必须获得一个DC的句柄,然 后你在GDI函数中将这个句柄作为一个参数,向 Windows标识您想在其上进行绘图的设备。
当Windows程序在屏幕、打印机或其他输出设备 上画图时,它并不是将像素直接输出到设备上,而 是将图绘制到由设备描述表(DC)表示的逻辑意 义上的“显示平面”上去。
获得DC句柄的几个GDI函数: BeginPaint, GetDC,GetWindowDC。,这三个函数获得的DC都 与视频显示器上的某个特定窗口有关。
2013-7-25
8
GDI函数调用
组成GDI的几百个函数调用可以分为几大类:
获取(或创建)和释放(或清除)设备描述 表句柄的函数。 绘图函数。
CMetaFileDC
CWindowDC
2013-7-25
13
设备上下文类 CDC
描述
所有设备描述表类的基类。可用来 直接访问整个显示器或如打印机之 类的非显示DC。 用于在窗口客户区画图,但仅限于 OnPaint处理程序;它是在窗口的 OnPaint成员函数中使用的一种DC。 代表窗口的客户区的DC。通常在需 要直接在窗口客户区进行绘制时使 用(常常不在OnDraw函数中)。
传送给类的构造函数的指针确定了设备描述 表所属的窗口。
2013-7-25
20
MFC中设备描述表捕获与释放
当在栈上构造DC,若对象的生命周期结束, 则它的析构函数会被自动调用,而且析构函 数一旦被调用。设备描述表就会被返回给 Windows。 当在堆上用new创建设备描述表(DC)时, 要注意亲自释放设备描述表。
2013-7-25
25
MFC中何时调用OnPaint函数
在某些情况下,客户区的一部分被临时覆盖, Windows试图保存一个显示区域,并在以后恢 复它,但这并不总是成功的,下面的情况,
Windows可能发送WM_PAINT消息:
Windows擦除覆盖了部分窗口的对话框或消息 框;
菜单下拉出来,然后被释放。
2013-7-25
28
MFC创建画笔的方法
方法三:构造一个没有初始化的CPen对象,
向LOGPEN结构中填充描述画笔特性的参数, 然后再调用CPen:CreatePenIndirect生成 画笔。
CPen pen; LOGPEN lp; lp.lopnStyle=PS_SOLID; lp.lopnWidth.x=1; lp.lopnColor=RGB(255,0,0); pen.CreatePenIndirect(&lp);
CMetaFileDC
MFC中的设备描述表属性
当使用CDC输出函数在屏幕上画图时, 输出的某些特性并没有在函数调用 过程中规定,但可以通过设备描述表 自身获得。这是因为它们是设备描述 表的默认属性。 下表列出了一些设备描述表最常用的 属性和访问这些属性的CDC函数。
2013-7-25
16
表7. 2 MFC中的Windows GDI对象类