按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
BEGIN_MESSAGE_MAP(CGraphDoc; CDocument)
//{{AFX_MSG_MAP(CGraphDoc)
ON_MAND(ID_GRAPH_DATA1; OnGraphData1)
ON_MAND(ID_GRAPH_DATA2; OnGraphData2)
ON_MAND(ID_GRAPH_DATA3; OnGraphData3)
ON_UPDATE_MAND_UI(ID_GRAPH_DATA1; OnUpdateGraphData1)
716
…………………………………………………………Page 779……………………………………………………………
第 13 章 多重文件與多重顯示
ON_UPDATE_MAND_UI(ID_GRAPH_DATA2; OnUpdateGraphData2)
ON_UPDATE_MAND_UI(ID_GRAPH_DATA3; OnUpdateGraphData3)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
利用ClassWizard 产生两个新类别, 做为三叉分裂窗口中的另两个窗口的
View 类别:
类别名称 基础类别 文件
CText View CView TEXTVIEW。CPP TEXTVIEW。H
CBar View CView BARVIEW。CPP BARVIEW。H
改写CChildFrame::OnCreateClient 函数如下(这是本节的技术重点):
#include 〃stdafx。h〃
#include 〃Graph。h〃
#include 〃ChildFrm。h〃
#include 〃TextView。h〃
#include 〃BarView。h〃
。。。
BOOL CChildFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/;
CCreateContext* pContext)
{
//产生静态分裂窗口,横列为1,纵行为2。
m_wndSplitter1。CreateStatic(this; 1; 2);
//产生分裂窗口的第一个窗口(标号0;0)的view 窗口,采用CTextView。
m_wndSplitter1。CreateView(0; 0; RUNTIME_CLASS(CTextView);
CSize(300; 0); pContext);
// 产生第二个分裂窗口,横列为2 纵行为1。位在第一个分裂窗口的(0;1)窗口
m_wndSplitter2。CreateStatic(&m_wndSplitter1; 2; 1;
WS_CHILD | WS_VISIBLE; m_wndSplitter1。IdFromRowCol(0; 1));
//产生第二个分裂窗口的第一个窗口(标号0;0)的view 窗口,采用CBarView。
m_wndSplitter2。CreateView(0; 0; RUNTIME_CLASS(CBarView);
CSize(0; 150); pContext);
//产生第二个分裂窗口的第二个窗口(标号1;0)的view 窗口,采用CGraphView。
m_wndSplitter2。CreateView(1; 0; pContext…》m_pNewViewClass;
CSize(0; 0); pContext);
717
…………………………………………………………Page 780……………………………………………………………
第篇 深入 MFC 程式設計
// 设定active pane
SetActiveView((CView*)m_wndSplitter1。GetPane(0;0));
return TRUE;
}
为什么最后一次CreateView 时我以pContext …》m_pNewViewClass 取代
RUNTIME_CLASS(CGraphView) 呢? 后者当然也可以, 但却因此必须包含
CGraphView 的声明;而如果你因为这个原因而包含GraphView。h 档,又会产生三个
编译错误,挺麻烦!
至此,Document 中虽然没有任何资料,但程序的UI 已经完备,编译联结后
可得以下执行画面:
修改CGraphDoc,增加一个整数数组m_intArray ,这是真正存放资料的地方,
我采用MFC 内建的CArray,为此,必须在STDAFX。H 中加上一行:
#include // MFC templates
718
…………………………………………………………Page 781……………………………………………………………
第 13 章 多重文件與多重顯示
为了设定数组内容,我又增加了一个SetValue 成员函数,并且在【Graph Data】菜单
命令被执行时,为m_intArray 设定不同的初值:
// in GRAPHDOC。H
class CGraphDoc : public CDocument
{
。。。
public:
CArray m_intArray;
public:
void SetValue(int i0; int i1; int i2; int i3; int i4;
int i5; int i6; int i7; int i8; int i9);
。。。
};
// in GRAPHDOC。CPP
CGraphDoc::CGraphDoc()
{
SetValue(5; 10; 15; 20; 25; 78; 64; 38; 29; 9);
}
void CGraphDoc::SetValue(int i0; int i1; int i2; int i3; int i4;
int i5; int i6; int i7; int i8; int i9);
{
m_intArray。SetSize(DATANUM; 0);
m_intArray'0' = i0;
m_intArray'1' = i1;
m_intArray'2' = i2;
m_intArray'3' = i3;
m_intArray'4' = i4;
m_intArray'5' = i5;
m_intArray'6' = i6;
m_intArray'7' = i7;
m_intArray'8' = i8;
m_intArray'9' = i9;
}
void CGraphDoc::OnGraphData1()
{
SetValue(5; 10; 15; 20; 25; 78; 64; 38; 29; 9);
UpdateAllViews(NULL);
}
void CGraphDoc::OnGraphData2()
{
SetValue(50; 60; 70; 80; 90; 23; 68; 39; 73; 58);
719
…………………………………………………………Page 782……………………………………………………………
第篇 深入 MFC 程式設計
UpdateAllViews(NULL);
}
void CGraphDoc::OnGraphData3()
{
SetValue(12; 20; 8; 17; 28; 37; 93; 45; 78; 29);
UpdateAllViews(NULL);
}
void CGraphDoc::OnUpdateGraphData1(CCmdUI* pCmdUI)
{
pCmdUI…》SetCheck(m_intArray'0' == 5);
}
void CGraphDoc::OnUpdateGraphData2(CCmdUI* pCmdUI)
{
pCmdUI…》SetCheck(m_intArray'0' == 50);
}
void CGraphDoc::OnUpdateGraphData3(CCmdUI* pCmdUI)
{
pCmdUI…》SetCheck(m_intArray'0' == 12);
}
各位看到,为了方便,我把m_intArray 的数据封装属性设为public 而非private ,
检查「m_intArray 内容究竟是哪一份资料」所用的方法也非常粗糙,呀,不要非难我,
重点不在这里呀!
在RESOURCE。H 文件中加上两个常数定义:
#define DATANUM 10
#define DATAMAX 100
修改CGraphView,在OnDraw 成员函数中取得Document ,再透过Document
对象指针取得整数数组,然后将10 笔数据的曲线图绘出:
#0001 void CGraphView::OnDraw(CDC* pDC)
#0002 {
#0003 CGraphDoc* pDoc = GetDocument();
#0004 ASSERT_VALID(pDoc);
#0005
#0006 int cxDot;cxDotSpacing;cyDot; cxGraph;cyGraph; x;y; i;
#0007 RECT rc;
#0008
#0009 CPen pen (PS_SOLID; 1; RGB(255; 0; 0)); // red pen
#0010 CBrush brush(RGB(255; 0; 0)); // red brush
720
…………………………………………………………Page 783……………………………………………………………
第 13 章 多重文件與多重顯示
#0011 CBrush* pOldBrush = pDC…》SelectObject(&brush);
#0012 CPen* pOldPen = pDC…》SelectObject(&pen);
#0013
#0014 cxGraph = 100;
#0015 cyGraph = DATAMAX; // defined in resource。h
#0016
#0017 this…》GetClientRect(&rc);