第七章 MFC骨干程序
所谓骨干程序就是指有AppWizard生成的MFC程序。如下图的层次关系是程序中常用的几个类,一定要熟记于心。
1 Document/View应用程序
CDocument存放资料内容,CView显示资料,并且负责最资料的编辑、修改。
有关文件读写的动作在CDocument 的Serialize 函数进行,有关画面显示的动作在CView 的OnDraw 或OnPaint 函数进行。
程序每打开一份文件(资料),就应该产生三份对象:
1. 一份Document 对象,
2. 一份View 对象,
3. 一份CMDIChildWnd 对象(做为外框窗口)
Document Template 用来管理上面程序生成的对象。如其中CMultiDocTemplate 的构造式参数如下:
1 CMultiDocTemplate::CMultiDocTemplate(UINT nIDResource, //资源ID 2 CRuntimeClass* pDocClass, //指向Document 对象 3 CRuntimeClass* pFrameClass,//指向CMDIChildWnd 对象 4 CRuntimeClass* pViewClass);//指向View 对象
字符串资源(string)
IDR_MAINFRAME "\nScrib\nScrib\nScribble Files (*.scb)\n.SCB\nScribble.Document\nScrib Document"
这是一个以'\n'分割的七个子字符串资源。每一个子字符串都可以在程序进行过程中取得,只要调用CDocTemplate::GetDocString 并在其第二参数中指定索引 值(1~7)即可。其中七个子字符串资源意义如下:
string七个子字符串资源的出现位置如下:
例子
1 主窗口的产生
构造MDI 主窗口,有两个步骤。第一个步骤是new 一个CMDIFrameWnd 对象,第二个步骤是调用其LoadFrame 函数。
2 工具栏和状态列的诞生(Toolbar & Status bar)
工具栏和状态列分别由CToolBar 和CStatusBar 掌管。两个对象隶属于主窗口,所以可以在CMainFrame中声明两个对象用来表示。
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
然后在主窗口创建的时候初始化 工具栏和状态列,通过Create()与 LoadToolBar()函数以及Create()与 SetIndicators()函数
3 鼠标拖放(Drag and Drop)
实现:使用CreateWindowEx()创建窗口并指定第一个风格为WS_EX_ACCEPTFILES的窗口才能接受拖拽文件。在MFC中实现如下:
1 BOOL CScribbleApp::InitInstance() 2 { 3 ... 4 // Enable drag/drop open 5 m_pMainWnd->DragAcceptFiles();//愿意接受拖拽文件 6 // Enable DDE Execute open 7 EnableShellOpen();//实现双机打开文件 8 RegisterShellFileTypes(TRUE);//注册文件类型 9 ... 10 }
你可以拖拽任何类型的文件,但是只有你指定的才能响应,其他的则不能打开。
4 消息映射 (Message Map)
首先你应该在类别声明处加上DECLARE_MESSAGE_MAP 宏, 然后在.CPP 档中使用BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP 两个宏,宏中间夹带 的就是「讯息与函数对映关系」。
5 标准菜单File / Edit / View / Window / Help
几乎所有MDI程序都有两组菜单。一组是当没有任何子窗口(文件窗口)存在时出现,另一组则是当有任何子窗口(文件窗口)存在时出现。而后者更加复杂多样,包含所有的文件操作。MFC将很多常用的菜单操作预先定义好了,直接使用就行。
6 对话框
每个程序的关于对话框都需要自己改写,加入自己的内容。作者,日期一类的。