按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
第 13 章 多重文件與多重顯示
#0028 {
#0029 CMDIChildWnd* pActiveChild = MDIGetActive();
#0030 CDocument* pDocument;
#0031 if (pActiveChild == NULL ||
#0032 (pDocument = pActiveChild…》GetActiveDocument()) == NULL)
#0033 {
#0034 TRACE0(〃Warning: No active document for WindowNew mandn〃);
#0035 AfxMessageBox(AFX_IDP_MAND_FAILURE);
#0036 return; // mand failed
#0037 }
#0038
#0039 // otherwise we have a new frame!
#0040 CDocTemplate* pTemplate = ((CTextApp*) AfxGetApp())…》m_pTemplateHex;
#0041 ASSERT_VALID(pTemplate);
#0042 CFrameWnd* pFrame = pTemplate…》CreateNewFrame(pDocument; pActiveChild);
#0043 if (pFrame == NULL)
#0044 {
#0045 TRACE0(〃Warning: failed to create new framen〃);
#0046 AfxMessageBox(AFX_IDP_MAND_FAILURE);
#0047 return; // mand failed
#0048 }
#0049
#0050 pTemplate…》InitialUpdateFrame(pFrame; pDocument);
#0051 }
如果你要两个view 都有打印预视的能力,必须在CHexView 中改写下面三个
虚拟函数,至于它们的内容,可以依样画葫芦地从CTextView 的同名函数中拷
贝一份过来:
// in HEXVIEW。H
class CHexView : public CView
{
。。。
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CHexView)
protected:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC; CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC; CPrintInfo* pInfo);
//}}AFX_VIRTUAL
。。。
};
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 ///////////////////////////////////////////////////