按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
Tile ID_WINDOW_TILE_HORZ MDIFrameWnd::OnWindowCmd Yes
Arrange Icons ID_WINDOW_ARRANGE MDIFrameWnd::OnWindowCmd Yes
Help
About AppName ID_APP_ABOUT None
上表的最后一字段为No 者有五笔,表示虽然那些命令项有预设的处理例程,但你必须
在自己的Message Map 中设定映射项目,它们才会起作用。噢,AppWizard 此时又表现
出了它的善体人意,自动为我们做出了这些码:
BEGIN_MESSAGE_MAP(CScribbleApp; CWinApp)
。。。
ON_MAND(ID_FILE_NEW; CWinApp::OnFileNew)
ON_MAND(ID_FILE_OPEN; CWinApp::OnFileOpen)
ON_MAND(ID_FILE_PRINT_SETUP; CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CScribbleView; CView)
。。。
ON_MAND(ID_FILE_PRINT; CView::OnFilePrint)
ON_MAND(ID_FILE_PRINT_PREVIEW; CView::OnFilePrintPreview)
END_MESSAGE_MAP()
448
…………………………………………………………Page 511……………………………………………………………
第7章 簡單而完整:MFC 骨幹程式
对话框
Scribble 可以激活许多对话框,前一节提了许多。唯一要程序员自己动手(我的意思是
出现在我们的程序代码中)的只有About 对话框。
为了拦截WM_MAND 的ID_APP_ABOUT 项目,首先我们必须设定其Message
Map :
BEGIN_MESSAGE_MAP(CScribbleApp; CWinApp)
ON_MAND(ID_APP_ABOUT; OnAppAbout)
ON_MAND(ID_FILE_NEW; CWinApp::OnFileNew)
ON_MAND(ID_FILE_OPEN; CWinApp::OnFileOpen)
ON_MAND(ID_FILE_PRINT_SETUP; CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
当消息送来,就由OnAppAbout 处理:
void CScribbleApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg。DoModal();
}
其中CAboutDlg 是CDialog 的衍生类别:
class CAboutDlg : public CDialog
{
enum { IDD = IDD_ABOUTBOX }; // IDD_ABOUTBOX 是RC 文件中的对话框模板资源
。。。
DECLARE_MESSAGE_MAP()
};
比之于SDK 程序中的对话框,这真是方便太多了。传统SDK 程序要在RC 文件中定义
对话框模板(dialog template,也就是其外形),在C 程序中设计对话框函数。现在只
需从CDialog 衍生出一个类别,然后产生该类别之对象,并指定RC 文件中的对话框面
板资源,再调用对话框对象的DoModal 成员函数即可。
第10 章一整章将讨论所谓的对话框数据交换(DDX )与对话框数据确认(DDV)。
449
…………………………………………………………Page 512……………………………………………………………
第篇 湷觥 FC 程式設計
改用CEditView
Scribble step0 除了把一个应用程序的空壳做好,不能再贡献些什么。如果我们在
AppWizard 步骤六中把CScribbleView 的基础类别从CView 改为CEditView,那可就
有大妙用了:
CEditView 是一个已具备文字编辑能力的类别,它所使用的窗口是Windows 的标准控
制组件之一Edit ,其SerializeRaw 成员函数可以把Edit 控制组件中的raw text (而非
「对象」所持有的资料)写到文件中。当我们在AppWizard 步骤六选择了它,程序代码中
所有的CView 统统变成CEditView,而最重要的两个虚拟函数则变成:
void CScribbleDoc::Serialize(CArchive& ar)
{
// CEditView contains an edit control which handles all serialization
((CEditView*)m_viewList。GetHead())…》SerializeRaw(ar);
}
void CScribbleView::OnDraw(CDC* pDC)
{
450
…………………………………………………………Page 513……………………………………………………………
第7章 簡單而完整:MFC 骨幹程式
CScribbleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
就这样,我们不费吹灰之力获得了一个多窗口的文字编辑器:
并拥有读写档能力以及预视能力:
451
…………………………………………………………Page 514……………………………………………………………
第篇 湷觥 FC 程式設計
452
…………………………………………………………Page 515……………………………………………………………
4
深入MFC 程 序 设 计
深入湷觥FC
2nd Edition
453
…………………………………………………………Page 516……………………………………………………………
MFC
第篇 深入 程式設計
454
…………………………………………………………Page 517……………………………………………………………
第8章
Document…View 深入探讨
形而上者谓之道,形而下者谓之器。
对于 View 而言,很少有人能够先道而后器。
Document/
完全由AppWziard 代劳做出的Scribble step0,应用程序的整个架构(空壳)都已经建
构起来了,但是Document Document 和VView iew 还空着好几个最重要的函数(都是虚拟函数)等着
你设计其实体。这就像一部汽车外面的车体以及内部的油路电路都装配好了,但还等着
最重要的发动机(引擎)植入,才能够产生动力,开始「有所为」。
我已经在第7章概略介绍了Document/View 以及Document Template ,还有更多的秘密将
在本章揭露。
为什么需要Document…View (形而上)
MFC 之所以为Application Framework ,最重要的一个特征就是它能够将管理资料的程序
码和负责资料显示的程序代码分离开来,这种能力由MFC 的Document/View 提供。