深入浅出MFC第2版(PDF格式)-第146部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
733
…………………………………………………………Page 796……………………………………………………………
第篇 深入 MFC 程式設計
// in HEXVIEW。CPP
BEGIN_MESSAGE_MAP(CHexView; CView)
//{{AFX_MSG_MAP(CHexView)
// NOTE the ClassWizard will add and remove mapping macros here。
//}}AFX_MSG_MAP
// Standard printing mands
ON_MAND(ID_FILE_PRINT; CView::OnFilePrint)
ON_MAND(ID_FILE_PRINT_DIRECT; CView::OnFilePrint)
ON_MAND(ID_FILE_PRINT_PREVIEW; CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////
// CTextView printing
BOOL CHexView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CHexView::OnBeginPrinting(CDC* /*pDC*/; CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CHexView::OnEndPrinting(CDC* /*pDC*/; CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
本例并未示范Serialization 动作。
非制式作法的缺点
既然是走后门,就难保哪一天出问题。如果MFC 的版本变动,
CMDIFrameWnd::OnWindowNew 内容改了,你就得注意本节这个方法还能适用否。
734
…………………………………………………………Page 797……………………………………………………………
第 13 章 多重文件與多重顯示
下面是Text 程序的执行画面。我先开启一个Text 窗口,再选按【Window/New Hex
Window 】或工具栏上的对应按钮,开启另一个Hex 窗口。两个View 窗口以不同的方
式显示同一份文件资料。
当你选按【File/Preview 】命令项,哪一个窗口为active 窗口,那个窗口的内容就出现在
预视画面中。以下是Text 窗口的打印预视画面:
735
…………………………………………………………Page 798……………………………………………………………
第篇 深入 MFC 程式設計
以下是Hex 窗口的打印预视画面:
多重文件
截至目前,我所谈的都是如何以不同的方式在不同的窗口中显示同一份文件资料。如果
我想写那种「多功能」软件,必须支持许多种文件类型,该怎么办?
就以前一节的Graph 程序为基础,继续我们的探索。Graph 的文件类型原本是一个整数
数组,数量有10 笔。我想在上面再多支持一种功能:文字编辑能力。
新的 Document 类別
首先,我应该利用ClassWizard 新添一个Document 类别,并以CDocument 为基础。
激活ClassWizard,选择【Member Variables 】附页,按下【Add Class。。。 】钮,出现对话框,
填写如下:
736
…………………………………………………………Page 799……………………………………………………………
第 13 章 多重文件與多重顯示
下面是 ClassWizard 为我们做出來的码:
#0001 // NewDoc。cpp : implementation file
#0002 //
#0003
#0004 #include 〃stdafx。h〃
#0005 #include 〃Graph。h〃
#0006 #include 〃NewDoc。h〃
#0007
#0008 #ifdef _DEBUG
#0009 #define new DEBUG_NEW
#0010 #undef THIS_FILE
#0011 static char THIS_FILE'' = __FILE__;
#0012 #endif
#0013
#0014 /////////////////////////////////////////////////////////////////
#0015 // CNewDoc
#0016
737
…………………………………………………………Page 800……………………………………………………………
第篇 深入 MFC 程式設計
#0017 IMPLEMENT_DYNCREATE(CNewDoc; CDocument)
#0018
#0019 CNewDoc::CNewDoc()
#0020 {
#0021 }
#0022
#0023 BOOL CNewDoc::OnNewDocument()
#0024 {
#0025 if (!CDocument::OnNewDocument())
#0026 return FALSE;
#0027 return TRUE;
#0028 }
#0029
#0030 CNewDoc::~CNewDoc()
#0031 {
#0032 }
#0033
#0034
#0035 BEGIN_MESSAGE_MAP(CNewDoc; CDocument)
#0036 //{{AFX_MSG_MAP(CNewDoc)
#0037 // NOTE the ClassWizard will add and remove mapping macros here。
#0038 //}}AFX_MSG_MAP
#0039 END_MESSAGE_MAP()
#0040
#0041 /////////////////////////////////////////////////////////////////
#0042 // CNewDoc diagnostics
#0043
#0044 #ifdef _DEBUG
#0045 void CNewDoc::AssertValid() const
#0046 {
#0047 CDocument::AssertValid();
#0048 }
#0049
#0050 void CNewDoc::Dump(CDumpContext& dc) const
#0051 {
#0052 CDocument::Dump(dc);
#0053 }
#0054 #endif //_DEBUG
#0055
#0056 /////////////////////////////////////////////////////////////////
#0057 // CNewDoc serialization
#0058
#0059 void CNewDoc::Serialize(CArchive& ar)
#0060 {
#0061 if (ar。IsStoring())
#0062 {
738
…………………………………………………………Page 801……………………………………………………………
第 13 章 多重文件與多重顯示
#0063 // TODO: add storing code here
#0064 }
#0065 else
#0066 {
#0067 // TODO: add loading code here
#0068 }
#0069
#0070 // CEditView contains an edit control which handles all serialization
#0071 ((CEditView*)m_viewList。GetHead())…》SerializeRaw(ar);
#0072 }
#0073
#0074 //////////////////////////////////////////////////////////////
#0075 // CNewDoc mands
注:阴影中的这两行码(#0070 和#0071)不是ClassWizard 产生的,是我自己加的,提前与
你见面。稍后我会解释为什么加这两行。
新的 Document Template
然后,我应该为此新的文件类型产生一个Document Template,并把它加到系统所维护的
DocTemplate 串行中。注意,为了享受现成的文字编辑能力,我选择CEditView 做为与
此Document 搭配之View 类别。还有,由于CChildFrame 已经因为第一个文件类型
Graph 的三叉静态分裂而被我们改写了OnCreateClient 函数,已不再适用于这第二个文
件类型(NewDoc ),所以我决定直接采用CMDIChildWnd 做为NewDoc 文件类型的MDI
Child Frame 窗口:
#include 〃stdafx。h〃
#include 〃Graph。h〃
#include 〃MainFrm。h〃
#include 〃ChildFrm。h〃
#include 〃GraphDoc。h〃
#include 〃GraphView。h〃
#include 〃NewDoc。h〃
。。。
BOOL CGraphApp::InitInstance()
{
。。。
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_GRAPHTYPE;
RUNTIME_CLASS(CGraphDoc);
RUNTIME_CLASS(CChildFrame); // custom MDI child frame
739
…………………………………………………………Page 802……………………………………………………………
第篇 深入 MFC 程式設計
RUNTIME_CLASS(CGraphView));
AddDocTemplate(pDocTemplate);
pDocTemplate = new CMultiDocTemplate(
IDR_NEWTYPE;
RUNTIME_CLASS(CNewDoc);
RUNTIME_CLASS(CMDIChildWnd); // use directly
RUNTIME_CLASS(CEditView));
AddDocTemplate(pDocTemplate);
。。。
}
CMultiDocTemplate 的第一个参数(resource ID )也不能再延用Graph 文件类型所使用的
IDR_GRAPHTYPE 了。要知道,这个ID 值关系非常重大。我们得自行设计一套适用于
NewDoc 文件类型的UI 系统出来(包括菜单、工具栏、文件存取对话框的内容、文件
图标、窗口标题。。。)。
怎么做?第7章的深入讨论将在此开花结果!请务必回头复习复习「Document Template
的意义」一节,我将直接动作,不再多做说明。
新的 UI 系统
下面就是为了这新的 NewDoc 文件型态所对应的 UI 系统,新添的文件內容 (没有什么
好工具可以帮忙,一般文字编辑器的 copy/paste 最快):
// in RESOURCE。H
#define IDD_ABOUTBOX 100
#define IDR_MAINFRAME 128