MFC-设备描述表-路径层
设备描述表概述

– BOOL AlphaBlend( int xDest, int yDest, int nDestWidth, int nDestHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, BLENDFUNCTION blend );
设置设备描述表属性的方式
选入选出方式:在处理事件期间选入,事件处理完毕后选出。 状态机方式:按需要随时设置。
设置设备描述表的属性
设备描述表属性的保持问题
通常情况下,在一个事件函数中设置的设备描述表属性通常不能保 存到下一个消息函数,所以对于每一个消息函数,都应该在使用设 备描述表之前都要重新进行设置。
• 画线的笔,绘图填图的刷子,位图,调色板,剪裁 区域,及路径(Path)。
设备描述表分类
名称 Display
Printer
Memory
特点
显示设备描述表,提供对视频显示设备上 的绘制操作的支持
打印设备描述表,提供对打印机、绘图仪 设备上的绘制操作的支持
内存设备描述表,提供对位图操作的支持
Information 信息设备描述表,提供对操作设备信息获 取的支持
hdc = GetWindowDC (hwnd) ;/ReleaseDC (hwnd, hdc) ;
4 取得设备上下文 句柄通用函数:
hdc = CreateDC (pszDriver, pszDevice, pszOutput, pData) ; /DeleteDC (hdc) ; 如取整个屏幕的设备上下文 句柄: hdc = CreateDC (TEXT (“DISPLAY”), NULL, NULL, NULL) ;
第8章 MFC概述

CClientDC与CPaintDC的区别:CPaintDC的对象一般用 在OnPaint内以响应Windows消息WM_PAINT,自动完 成绘制,在整个窗ntDC应用在非响应Windows消息WM_PAINT 的情况下,进行实时绘制,绘制的区域内被重画。
几种DC及区别 CWindowDC:关联一特定窗口,允许开发者在目标窗口 的任何一部分进行绘图,包含边界与标题,这种DC同 WM_NCPAINT消息一起发送。
几种DC及区别
CWindowDC与CClientDC,CPaintDC的区别: CWindowDC可在非客户区绘制图形,而CClientDC, CPaintDC只能在客户区绘制图形。CWindowDC下坐标 原点是在屏幕的左上角,CClientDC,CPaintDC下坐标 原点是在客户区的左上角。
响应WM_PAINT消息的DC。
CWindowDC 代表整个屏幕的DC。
几种DC及区别 CClientDC:(客户区设备上下文)用于客户区的输出,与 特定窗口关联,可以让开发者访问目标窗口中客户区,其 构造函数中包含了GetDC,析构函数中包含了ReleaseDC。
CPaintDC:用于响应窗口重绘消息(WM_PAINT)时的绘 图输出。CPaintDC在构造函数中调用BeginPaint()取得设备 上下文, 在析构函数中调用EndPaint()释放设备上下文。 EndPaint()除了释放设备上下文外,还负责从消息队列中 清除WM_PAINT消息。因此, 在处理窗口重画时,必须使 用CPaintDC,否则WM_PAINT消息无法从消息队列中清除, 将引起不断的窗口重画。CPaintDC也只能用在 WM_PAINT 消息处理之中。
核心框架类层次结构
CView类负责将文件内容 呈现到显示装置上:也 许是屏幕,也许是打印 机。文件内容的呈现由 虚拟函数OnDraw 负责。 由于这个类别实际上就 是你在屏幕上所看到的 窗口(外再罩一个外框 窗口),所以它也负责 使用者输入的第一线服 务。
mfc

MFC给这些类定义了一个成员变量来保存MFC Object对应的Windows Object的句柄。对于设备描述表CDC类,将保存两个HDC句柄。
从层次上讲比较
MFC Object是高层的,Windows Object是低层的;
MFC Object封装了Windows Object的大部分或全部功能,MFC Object的使用者不需要直接应用Windows Object的HANDLE(句柄)使用Win32 API,代替它的是引用相应的MFC Object的成员函数。
最后,返回TRUE表示成功注册。
调用AfxRegisterWndClass注册
AfxRegisterWndClass函数也是MFC全局函数。AfxRegisterWndClass的函数原型:
LPCTSTR AFXAPI AfxRegisterWndClass(UINT nClassStyle,
后续几节分别对前四类作一个简明扼要的论述。
Windows Object
用SDK的Win32 API编写各种Windows应用程序,有其共同的规律:首先是编写WinMain函数,编写处理消息和事件的窗口过程WndProc,在WinMain里头注册窗口(Register Window),创建窗口,然后开始应用程序的消息循环。
设备上下文
HDC
CDC and CDC-derived classes
菜单
HMENU
CMenu
笔
HPEN
CGdiObject类,CPen和CPen-derived classes
刷子
HBRUSH
CGdiObject类,CBrush和CBrush-derived classes
MFC各类库详解

1.MFC概述1.MFC是一个编程框架MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。
因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。
Microsoft Visual C++提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。
1.封装构成MFC框架的是MFC类库。
MFC类库是C++类库。
这些类或者封装了Win32应用程序编程接口,或者封装了应用程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO数据访问的功能,等等,分述如下。
(1)对Win32应用程序编程接口的封装用一个C++ Object来包装一个Windows Object。
例如:class CWnd是一个C++ window object,它把Windows window(HWND)和Windows window有关的API函数封装在C++ window object的成员函数内,后者的成员变量m_hWnd就是前者的窗口句柄。
(2)对应用程序概念的封装使用SDK编写Windows应用程序时,总要定义窗口过程,登记Windows Class,创建窗口,等等。
MFC把许多类似的处理封装起来,替程序员完成这些工作。
另外,MFC提出了以文档-视图为中心的编程模式,MFC类库封装了对它的支持。
文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处理、查看数据。
(3)对COM/OLE特性的封装OLE建立在COM模型之上,由于支持OLE的应用程序必须实现一系列的接口(Interface),因而相当繁琐。
MFC中的DC、CDC、HDC、句柄、设备

MFC中的DC、CDC、HDC、句柄、设备上下文究竟是什么意思?在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数.也就是说MFC封装了Windows API 你说你喜欢C++而MFC换一种说法就是一个用C++写的一个函数库然后你来调用只不过这个类不是你写的MFC提供数百个类,最重要的、也是编写任何VC++应用程序都必不可少的两个类CWinApp和CFrameWnd,这两个类是编写复杂庞大应用程序的基石。
1>封装特性:构成MFC框架的是MFC类库而MFC类库又是C++的一个类库。
这些类封装WIN32应用程序编程接口,OLE(Object Link Embed 对象链接嵌入)特性,ODBC和DAO数据访问的功能。
2>继承特性:MFC抽象出了众多类的共同特性,并设计出一些基类作为实现其他类的基础,这些类中最重要的类是CObject类和CCmdTarget类,程序员可以从适当的MFC类中派生出自己的类,实现特定的功能达到编程的目的。
3>虚拟和消息映射:MFC是以C++为基础,当然支持虚函数,但作为一个编程框架必须要解决的是效率问题:如果MFC仅仅通过虚函数来支持动态约束必然会产生大量的虚函数表这样编程框架过于臃肿而且消耗更多的内存。
但是MFC建立了消息映射机制这样降低了内存的使用却大大提高了效率消息映射是一个将消息和成员函数相互关联的表,当应用程序的框架窗口接收到一个消息时,MFC将搜索该窗口的消息映射,如果存在一个处理消息的处理程序,那么就调用该处理程序.它通过宏来实现消息到成员函数的映射,而且这些函数不必是虚拟的成员函数,这样不需要为消息映射函数生成一个很大的虚拟函数表(V表),节省内存。
MFC消息映射机制:将消息与消息处理函数联系起来,形成一一对应的机制。
消息映射宏声明:DECLARE_MESSAGE_MAP定义:BEGIN_MESSAGE_MAPON_COMMANDON_CONTROLON_MESSAGEEND_MESSAGE_MAPMFC主要组成部分:类、宏和全局函数。
MFC的基本组成及程序模式类型

2.线程基类:CWinThread类 线程基类:CWinThread类 所有线程的基类,可直接使用。CWinApp类就是从 所有线程的基类,可直接使用。CWinApp类就是从 CWinThread类中派生出来的 CWinThread类中派生出来的
11
3.窗口应用程序类:CWinApp类 窗口应用程序类:CWinApp类 每个应用程序有且只有一个应用程序对象, 每个应用程序有且只有一个应用程序对象,在运 行程序中该对象与其它对象相互协调, 行程序中该对象与其它对象相互协调,该对象从 CWinApp类中派生出来 CWinApp类封装了初始化 类中派生出来。 类封装了初始化、 CWinApp类中派生出来。CWinApp类封装了初始化、运 终止应用程序的代码。 行、终止应用程序的代码。
14
3.菜单类:CMenu类 菜单类:CMenu类
该类是CObject类的子类,用于管理菜单。它是一个 该类是CObject类的子类,用于管理菜单。 CObject类的子类 HMenu的封装 的封装, Windows HMenu的封装,提供了与窗口有关的菜单资 源建立、修改、跟踪及删除的成员函数。 源建立、修改、跟踪及删除的成员函数。
2
以层次结构组织 是用来编 写Windows 应用程序 C++类集 的C++类集 封装了大部分API函数 封装了大部分API函数 API 提供了图形环境下应用程序的框架 提供了创建应用程序的组件
提供了大量的基类供程序员根据不同的应用环境进行扩充 MFC 允许在编程过程中自定义和扩展应用程序中的类 较好的移植性, 较好的移植性,可移植于众多的平台 MFC还很好地保持了程序的向下兼容性 MFC还很好地保持了程序的向下兼容性
4.文档/视类 文档/ 文档对象由文档模板对象创建, 文档对象由文档模板对象建,管理应用程序的 数据。视对象表示一个窗口的客户区, 数据。视对象表示一个窗口的客户区,显示文档数据 并允许用户与之交互
MFC各类库详解

1.MFC概述1.MFC是一个编程框架MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。
因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。
Microsoft Visual C++提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。
1.封装构成MFC框架的是MFC类库。
MFC类库是C++类库。
这些类或者封装了Win32应用程序编程接口,或者封装了应用程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO数据访问的功能,等等,分述如下。
(1)对Win32应用程序编程接口的封装用一个C++ Object来包装一个Windows Object。
例如:class CWnd是一个C++ window object,它把Windows window(HWND)和Windows window有关的API函数封装在C++ window object的成员函数内,后者的成员变量m_hWnd就是前者的窗口句柄。
(2)对应用程序概念的封装使用SDK编写Windows应用程序时,总要定义窗口过程,登记Windows Class,创建窗口,等等。
MFC把许多类似的处理封装起来,替程序员完成这些工作。
另外,MFC提出了以文档-视图为中心的编程模式,MFC类库封装了对它的支持。
文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处理、查看数据。
(3)对COM/OLE特性的封装OLE建立在COM模型之上,由于支持OLE的应用程序必须实现一系列的接口(Interface),因而相当繁琐。
第五章 MFC基础

MFC类的组织结构
CObject类是MFC中多数 类和用户自定义子类的 根类,是抽象基类。它 提供了许多编程所需的 公共操作。
对象的建立 对象的删除
串行化支持 (Serialization)
运行时信息 对象诊断输出
绘图和打印类
输出(设备相关)类 绘图工具类
4
应用程序体 系结构类
MFC类的组织结构
创建Windows 窗口要分两 步进行
引入构造函数,构 造一个CWnd对象
调用Create建立Windows窗 口,并将它连到CWnd对象上
2.视图类:CView类
表示框架窗口的客户区和显示文档数据并接收输入的客户区, 其派生类主要有如下几种: CScrollView:具有滚动功能的视图的基类 CFormView:其布局在对话资源中定义的滚动视图 CEditView:具有文本编辑、查找、替换和滚动功能的视图
应用程序和线程支持类 命令相关类 文档类 文档模板类 视图类(体系结构) 框架窗口(体系结构)
简单数据类型类
数组、列表和映射类
窗口、对话 框和控件类
框架窗口类(窗口) 视图类(窗口) 对话框类 控件条类
数组类 列表类 映射类
文件和数据库类
文件I/O类 DAO类 ODBC类
Database Access Object (DAO)类提供了比ODBC 类更广泛的支持
12
可视对象类
7.绘画对象类:CGdiObject类
图形绘画对象子层次结构以CGdiObject类为根类,可用于建 立绘画对象模型,如画笔、刷子、字体、位图、调色板等。
8.设备描述表类:CDC类
该类及其子类支持设备描述表对象,是CObject类的子类。 CDC类是一个较大的类,包括许多成员函数,如映射函数、 绘画工具函数、区域函数等,通过CDC对象的成员函数可以 完成所有的绘画工作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MFC中路径层
在MFC中,路径层主要运用于在窗口中绘图。
学过Photoshop的同学都知道,我们在设计一张海报时,可能会用到多张图片进行合成,而在合成之前是要对每张图片进行各自处理的。
这个时候我们就要给每一张图片定制一个它独有的处理空间---路径层。
在各个独立的空间---路径层上,我们对每张图片进行处理而互相不受影响。
类似地,MFC中,在一块窗口上我们也可以定制多个路径层并在各个路径层上进行绘图或输出字符的操作。
MFC中,我们利用CDC类提供的成员函数BeginPath()和EndPath()这两个函数来实现一个路径层的创建。
(一)BeginPath()
CDC::BeginPath
BOOL BeginPath( );
Return Value
Nonzero if the function is successful; otherwise 0.//如果打开路径层成功则返回值为一个非零值,否则返回0;
Remarks
Opens a path bracket in the device context. After a path bracket is open, an application can begin calling GDI drawing functions to define the points that lie in the path. An application can close an open path bracket by calling the EndPath member function. When an application calls BeginPath, any previous paths are discarded.
//在设备描述表中打开一个路劲层,一个路径层打开后,应用程序就可以调用GDI函数(图形设备接口函数),去设置处在这个路径层中的点,应用程序通过调用EndPath函数将路径层关闭。
当应用程序调用BeginPath的时候,之前的路径就会被弃置不理。
(二)EndPath()
CDC::EndPath
BOOL EndPath( );
Return Value
Nonzero if the function is successful; otherwise 0..//如果关闭路径层成功则返回值为一个非零值,否则返回0;
Remarks
Closes a path bracket and selects the path defined by the bracket into the device context.
//用于关闭一个路径层,并且将由这个路径层定义的路径选入设备描述表当中
在绘图时,如果希望图的某一部分与其他部分分开处理,就可以利用路径层的独立性
(三) SelectClipPath
CDC::SelectClipPath
BOOL SelectClipPath( int nMode );//此函数的作用是将所建立的路径层作为一个剪辑区域,将原来的路径层作为另一个剪辑区域,然后对这两个区域进行取交集、并集的操作得到一个新的剪辑区域,并在这个新的剪辑区域里进行互操作。
Return Value
Nonzero if the function is successful; otherwise 0.//函数成功返回值为非零,否则为0;
Parameters
nMode //函数形参可取如下值
Specifies the way to use the path. The following values are allowed:
//指定使用路径的方式,以下值是可取的
RGN_AND The new clipping region includes the intersection (overlapping areas) of the current clipping region and the current path.
//交集,也就是说,如果在两个剪辑区域里面都有作图的话,最后的效果是只
在剪辑区的交集处显示图形
RGN_COPY The new clipping region is the current path.
//新的剪辑区就是新建路径层上的剪辑区
RGN_DIFF The new clipping region includes the areas of the current clipping region, and those of the current path are excluded.
//新的剪切区是旧的剪切区中除去路径层的部分
RGN_OR The new clipping region includes the union (combined areas) of the current clipping region and the current path.
//新的剪切区是旧的剪切区和路径层的并集
RGN_XOR The new clipping region includes the union of the current clipping region and the current path, but without the overlapping areas.
//新的剪切区是旧的剪切区和路径层的并集,但除去他们的交集部分
Remarks
Selects the current path as a clipping region for the device context, combining the new region with any existing clipping region by using the specified mode. The device context identified must contain a closed path.。