友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
深入浅出MFC第2版(PDF格式)-第132部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
第篇 深入 MFC 程式設計
IDR_TEXTTYPE;
RUNTIME_CLASS(CTextDoc);
RUNTIME_CLASS(CChildFrame); // custom MDI child frame
RUNTIME_CLASS(CHexView));
。。。
}
int CTextApp::ExitInstance()
{
delete m_pTemplateTxt;
delete m_pTemplateHex;
return CWinApp::ExitInstance();
}
修改CTextDoc 程序代码,添加成员变量。Document 的数据是10 笔字符串:
// in TEXTDOC。H
class CTextDoc : public CDocument
{
public:
CStringArray m_stringArray;
。。。
};
// in TEXTDOC。CPP
BOOL CTextDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
m_stringArray。SetSize(10);
m_stringArray'0' = 〃If you love me let me know; 〃;
m_stringArray'1' = 〃if you don't then let me go; 〃;
m_stringArray'2' = 〃I can take another minute 〃;
m_stringArray'3' = 〃 of day without you in it。 〃;
m_stringArray'4' = 〃 〃;
m_stringArray'5' = 〃If you love me let it be; 〃;
m_stringArray'6' = 〃if you don't then set me free〃;
m_stringArray'7' = 〃。。。 〃;
m_stringArray'8' = 〃SORRY; I FORGET IT! 〃;
m_stringArray'9' = 〃 J。J。Hou 1995。03。22 19:26〃;
return TRUE;
}
730
…………………………………………………………Page 793……………………………………………………………
第 13 章 多重文件與多重顯示
修改CTextView::OnDraw 函数码,在其中取得Document 对象指针,然后把文
字显现出来:
// in TEXTVIEW。CPP
void CTextView::OnDraw(CDC* pDC)
{
CTextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int i; j; nHeight;
TEXTMETRIC tm;
pDC…》GetTextMetrics(&tm);
nHeight = tm。tmHeight + tm。tmExternalLeading;
j = pDoc…》m_stringArray。GetSize();
for (i = 0; i 《 j; i++) {
pDC…》TextOut(10; i*nHeight; pDoc…》m_stringArray'i');
}
}
修改CHexView 程序代码, 在OnDraw 函数中取得Document 对象指针, 把
ASCII 转换为Hex 码,再以文字显示出来:
#0001 #include 〃stdafx。h〃
#0002 #include 〃Text。h〃
#0003 #include 〃TextDoc。h〃
#0004 #include 〃HexView。h〃
#0005 。。。
#0006 void CHexView::OnDraw(CDC* pDC)
#0007 {
#0008 // CDocument* pDoc = GetDocument();
#0009 CTextDoc* pDoc = (CTextDoc*)GetDocument();
#0010
#0011 int i; j; k; l; nHeight;
#0012 long n;
#0013 char temp'10';
#0014 CString Line;
#0015 TEXTMETRIC tm;
#0016
#0017 pDC…》GetTextMetrics(&tm);
#0018 nHeight = tm。tmHeight + tm。tmExternalLeading;
#0019
#0020 j = pDoc…》m_stringArray。GetSize();
731
…………………………………………………………Page 794……………………………………………………………
第篇 深入 MFC 程式設計
#0021 for(i = 0; i 《 j; i++) {
#0022 wsprintf(temp; 〃%02x 〃; i);
#0023 Line = temp;
#0024 l = pDoc…》m_stringArray'i'。GetLength();
#0025 for(k = 0; k 《 l; k++) {
#0026 n = pDoc…》m_stringArray'i''k' & 0x00FF;
#0027 wsprintf(temp; 〃%02lx 〃; n);
#0028 Line += temp;
#0029 }
#0030 pDC…》TextOut(10; i*nHeight; Line);
#0031 }
#0032 }
定义CMainFrame 的两个命令处理例程:OnWindowText 和OnWindowHex,使选
单命令项目和工具栏按钮得以发挥效用。函数内容直接拷贝自图13…5,只要
修改其中第14 行即可。这两个函数是本节的技术重点。
#0001 void CMainFrame::OnWindowText()
#0002 {
#0003 CMDIChildWnd* pActiveChild = MDIGetActive();
#0004 CDocument* pDocument;
#0005 if (pActiveChild == NULL ||
#0006 (pDocument = pActiveChild…》GetActiveDocument()) == NULL)
#0007 {
#0008 TRACE0(〃Warning: No active document for WindowNew mandn〃);
#0009 AfxMessageBox(AFX_IDP_MAND_FAILURE);
#0010 return; // mand failed
#0011 }
#0012
#0013 // otherwise we have a new frame!
#0014 CDocTemplate* pTemplate = ((CTextApp*) AfxGetApp())…》m_pTemplateTxt;
#0015 ASSERT_VALID(pTemplate);
#0016 CFrameWnd* pFrame = pTemplate…》CreateNewFrame(pDocument; pActiveChild);
#0017 if (pFrame == NULL)
#0018 {
#0019 TRACE0(〃Warning: failed to create new framen〃);
#0020 AfxMessageBox(AFX_IDP_MAND_FAILURE);
#0021 return; // mand failed
#0022 }
#0023
#0024 pTemplate…》InitialUpdateFrame(pFrame; pDocument);
#0025 }
#0026
#0027 void CMainFrame::OnWindowHex()
732
…………………………………………………………Page 795……………………………………………………………
第 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……………………………………………………………
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!