VC基础巩固学习-MFC
异常处理
Exception(异常情况)是一个颇为新鲜的C++语言特征,可以帮助管理执行器的错误。
- C++导入了三个新的exception保留字
- try。之后跟随一段以{}圈出来的程序代码,exception可能在其中发生。
- catch。之后跟随一段以{}圈出来的程序代码,那是exception处理例程之所在。catch一个紧跟在try之后。
- throw。只是一个指令,用来产生(丢出)一个exception。
double m, n;
cin >> m >> n;
try {
cout << "before dividing." << endl;
if (n == 0)
throw - 1; //抛出整型异常
else if (m == 0)
throw - 1.0; //拋出 double 型异常
else
cout << m / n << endl;
cout << "after dividing." << endl;
}
catch (double d) {
cout << "catch (double)" << d << endl;
}
catch (...) {
cout << "catch (...)" << endl;
}
MFC的exception机制是以宏和exception types为基础的。这些宏类似于C++的exception保留字。
THROW宏相当于C++语言中的throw指令,以什么类型作为THROW的参数,就会有一个相对应的AfxThrow_函数被调用。
TRY
{
//try block.
}
CATCH(CMemoryException, e){
printf("Caught a memory exception. \n");
}
AND_CATCH_ALL (e){
printf("Caught an exception . \n");
}
END_CATCH_ALL
Template
C++ 的Template有两种,一种针对function,另一种针对class.
Template function:
template <class T>
T power(T base, int exponent);
int i = power (5 , 4);
Template classes:
class CThree
{
public:
CThree(T t1, T t2, T t3);
T Min();
T Max();
private:
T a, b, c;
};
template <class T>
T CThree<T>::Min()
{
T minab = a < b ? a : b;
return minab < c ? minab : c;
}
template <class T>
T CThree<T>::Max()
{
T maxab = a < b ? b : a;
return maxab < c ? c : maxab;
}
template <class T>
T CThree<T>::CThree(T t1, T t2, T t3) : a(t1), b(t2), c(t3)
{
return ;
}
第三章 MFC六大关键技术之仿真
MFC也是个Windows程序。InitApplication和InitInstance现在成了MFC的CWinApp的两个虚函数。
RTTI(运行时类型识别)
- 编译时需选用/GR选项(Enable C++ RTTI)
- 包含typeinfo.h
- 使用新的typeid运算符
CSquare *pSquare = new CSquare;
cout << pSquare -> IsKindOf(CSquare); //return 1 (TRUE)
类别型录网与CRuntime Class
"类别型录"的链接元素将以CRuntimeClass描述之,那是一个结构,至少需要有类名称、链表的Next指针、链表的First指针。由于Frist指针属于全局变量,所以它应该被static修饰之。
DECLEAR_DYNAMIC / IMPLEMENT_DYNAMIC 宏
为了神不知鬼不觉把CRuntimeClass对象塞到类之中,并声明一个可以抓到该对象地址的函数,定义了DECLEAR_DYNAMIC宏。
#define DECLEAR_DYNAMIC (class_name)
public:
static CRuntimeClass class##classname;
virtual CRuntimeClass* GetRuntimeClass() const;
DEClARE_DYNAMIC(CView)
public:
static CRuntimeClass classCView;
virtual CRuntimeClass* GetRuntimeClass() const;
类别型录的内容指定以及连接工作也要如此,于是再定义IMPLEMENT_DYNAMIC宏
#define IMPLEMENT_DYNAMIC(class_name, base_classname)
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFFm NULL)
Dynamic Creation(动态创建)
DECLEAR_DYNCREATE / IMPLEMENT_DYNCREATE宏
DECLEAR_DYCREATE(class_name)
IMPLEMENT_DYCREATE(class_name, base_name)
Persistence(永久保存)机制
MFC有一套Serialize机制,目的在于把文件名的选择、文件的开关、缓冲区的建立、数据的读写、提取运算符和插入运算符的重载、对象的动态创建等都包装起来。
Serialize(数据读写)
每一个可写到文件或可从文件中读出的类,都应该有它自己的serailize函数,负责它自己的数据读写文件操作。通过提取和插入运算符,把数据导流到archive中,archive是一个与文件息息相关的缓冲区,可以想想成文件的化身。
DECLARE_SERIAL / IMPLEMENT_SERIAL宏
- 要将<<和>>两个运算符重载,还要讲Serialize函数神不知鬼不觉地放入类声明之中,最好是使用宏。
- 为了在每一个对象被处理之前,能够处理繁琐的工作,诸如判断是否第一次出现、记录版本号码、记录文件名等工作,CRuntimeClass需要两个函数Load和Store;
Message Mapping(消息映射)
定义一个消息的数据结构。通过DECLARE_MESSAGE_MAP()、BEGIN_MESSAGE_MAP(class_name, base_name)、END_ESSAGE_MAP()、ON_COMMAND()
//in header file
class CView : public CWnd
{
public:
...
DECLEAR_MESSAGE_MAP()
};
//in implement file
#define CViewid 122
BEGIN_MESSAGE_MPA(CView, CWnd)
ON_COMMAND(CViewid, 0)
END_MESSAGE_MAP()
Command Routin(命令传递)
消息传递网架设起来了。当消息进来是,会有一个泵推动它前进。
第四章 Visual C++ 集成开发环境
调试工具
- TRACE宏。
参数字符串将被输出到调试窗口去,不会影响程序进行。
TRACE("Hello World");
可以把字符串和数值都送到afxDump变量去。
afxDump << "Hello World" <<i<<endl; // i是整数变量。
VC++ 调试器
- 设置断点(F9),以【Build / Debug / Go】或F5执行程序。调试过程中可以打开【View / Variables】打开窗口,查看所有的变量值。
程序代码产生器 :AppWizard
VERSIONINFO 资源编辑器
VERSIONINFO程序判断存在与使用者系统中的文件版本号码。
加速键(Accelerator)编辑器
通常加速键是两个按键的组合(例如:Alt + N ),用以取代鼠标在层层菜单中的拉下、单机操作。
第五章 总观Application Framework
General Purpose classes
- CObject: 万类之首
- collection classes :数据处理类,这些类都支持Serialization.
- 杂项类:
- exception handling classes:异常处理类。
- …
Windows API classes
- CWinThread: MFC程序中的线程
- CWinApp: 代表整个MFC应用程序
- Cwnd: 所有窗口,所有窗口类(主窗口类、子窗口类、控件等等)都有一个对应的C++类。这些类统统派生自CWnd。“窗口handle”和“C++”对象结盟,
- CCMdTarget: CWnd的父类。派生自它,类才能处理命令消息。这个类的消息映射以及命令消息传递的大部分关键。
- GDI类、DC类、Menu类
Application framework classes
- CDoctemplate、CSingleDocTemplate、CMultiDocTemplate:Document Template扮演黏胶的角色,把Document和View和其Frame(外框窗口)胶黏在一块儿。
- CDocument: 负责修改文件内容以及读写文件。读写文件由虚函数Serialize负责。
- CView: 此类负责将文件内容呈现到显示装置上。文件内容的呈现由虚函数OnDraw负责。
High level abstractions
视觉性UI对象属于此类,例如:CToolBar、CStatusBar、CDialogBardeng .
Afx全局函数
类似AfxMessageBox、AfxBeginThread等等
MFC宏(macros)
DECLEAR_DYNAMIC、IMPLEMENT_DYNAMIC、DECLEAR_SERIAL等等。