按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
有极佳的示范。
■ CView 此类别负责将文件内容呈现到显示装置上:也许是屏幕,也许是打印
机。文件内容的呈现由虚拟函数OnDraw 负责。由于这个类别实际上就是你在
屏幕上所看到的窗口(外再罩一个外框窗口),所以它也负责使用者输入的第
一线服务。例如第8章的Scribble Step1 范例,其View 类别便处理了鼠标的
按键动作。
High level abstractions
视觉性UI 对象属于此类,例如工具栏CToolBar、状态列CStatusBar、对话框列
CDialogBar。加强型的View 也属此类,如可卷动的ScrollView 、以对话框为基础的
334
…………………………………………………………Page 397……………………………………………………………
第5章 總觀Application Framework
CFormView、小型文字编辑器CEditView、树状结构的CTreeView,支持RTF 文件格式
的CRichEditView 等等。
Afx 全域函数
还记得吧,C++ 并不是纯种的对象导向语言(SmallTalk 和Java 才是)。所以,MFC
之中得以存在有不属于任何类别的全域函数,它们统统在函数名称开头冠以Afx 。
下面是几个常见的Afx 全域函数:
函数名称 说明
AfxWinInit 被WinMain (由MFC 提供)调用的一个函数,用做MFC GUI
程序初始化的一部份,请看第6章的「AfxWinInit AFX 内部
初始化动作」一节。如果你写一个MFC console 程序,就得
自行调用此函数(请参考Visual C++ 所附之Tear 范例程序)。
AfxBeginThread 开始一个新的执行线程(请看第14 章,# 756 页)。
AfxEndThread 结束一个旧的执行线程(请看第14 章,# 756 页)。
AfxFormatString1 类似printf 一般地将字符串格式化。
AfxFormatString2 类似printf 一般地将字符串格式化。
AfxMessageBox 类似Windows API 函数MessageBox 。
AfxOutputDebugString 将字符串输往除错装置(请参考附录D ,# 924 页)。
AfxGetApp 取得application object (CWinApp 衍生对象)的指针。
AfxGetMainWnd 取得程序主窗口的指针。
AfxGetInstance 取得程序的instance handle 。
AfxRegisterClass 以自定的WNDCLASS 注册窗口类别(如果MFC 提供的数个
窗口类别不能满足你的话)。
MFC 宏 (macros)
CObject 和CRuntimeClass 之中封装了数个所谓的object services ,包括「取得执行时期
的类别信息」(RTTI )、Serialization (文件读写)、动态产生对象。。。等等。所有衍生自CObject
335
…………………………………………………………Page 398……………………………………………………………
第篇 湷觥 FC 程式設計
的类别,都继承这些机能。我想你对这些名词及其代表的意义已经不再陌生…如果你没
有错过第3章的「MFC 六大技术仿真」的话。
■ 取得执行时期的类别信息(RTTI ),使你能够决定一个执行时期的对象的类别
信息,这样的能力在你需要对函数参数做一些额外的类型检验,或是当你要针
对对象属于某种类别而做特别的动作时,份外有用。
■ Serialization 是指将对象内容写到文件中,或从文件中读出。如此一来对象的
生命就可以在程序结束之后还延续下去,而在程序重新激活之后,再被读入。
这样的对象可说是〃persistent〃 (永续存在)。
■ 所谓动态的对象生成(Dynamic object creation ),使你得以在执行时期产生一
个特定的对象。例如document 、view 、和frame 对象就都必须支持动态对象
生成,因为framework 需要在执行时期产生它们(第8章有更详细的说明)。
此外,OLE 常常需要在执行时期做对象的动态生成动作。例如一个OLE server 程序必
须能够动态产生OLE items ,用以反应OLE client 的需求。
MFC 针对上述这些机能,准备了一些宏,让程序能够很方便地继承并实作出上述四大
机能。这些宏包括:
宏名称 提供机能 出现章节
DECLARE_DYNAMIC 执行时期类别信息 第3章、第8章
IMPLEMENT_DYNAMIC 执行时期类别信息 第3章、第8章
DECLARE_DYNCREATE 动态生成 第3章、第8章
IMPLEMENT_DYNCREATE 动态生成 第3章、第8章
DECLARE_SERIAL 对象内容的文件读写 第3章、第8章
IMPLEMENT_SERIAL 对象内容的文件读写 第3章、第8章
DECLARE_OLECREATE OLE 对象的动态生成 不在本书范围之内
IMPLEMENT_OLECREATE OLE 对象的动态生成 不在本书范围之内
336
…………………………………………………………Page 399……………………………………………………………
第5章 總觀Application Framework
我也已经在第3章提过MFC 的消息映射(Message Mapping)与命令绕行(mand
Routing)两个特性。这两个性质系由以下这些MFC 宏完成:
宏名称 提供机能 出现章节
DECLARE_MESSAGE_MAP 声明消息映射表数据结构 第3章、第9章
BEGIN_MESSAGE_MAP 开始消息映射表的建置 第3章、第9章
ON_MAND 增加消息映射表中的项目 第3章、第9章
ON_CONTROL 增加消息映射表中的项目 本书未举例
ON_MESSAGE 增加消息映射表中的项目 ???
ON_OLECMD 增加消息映射表中的项目 本书未举例
ON_REGISTERED_MESSAGE 增加消息映射表中的项目 本书未举例
ON_REGISTERED_THREAD_ 增加消息映射表中的项目 本书未举例
MESSAGE
ON_THREAD_MESSAGE 增加消息映射表中的项目 本书未举例
ON_UPDATE_MAND_UI 增加消息映射表中的项目 第�