深入浅出MFC-学习笔记 Day 2

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等等。

MFC数据类型(data types)

第六章 MFC程序的生死因果

CWinApp–取代WinMain的地位

CFrameWnd-- 取代WndProc的地位

引爆器-- Application object

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值