




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
文档视图上机指导书【例8.1】文档视图结构应用程序例子(Ex_DocView)。(1)创建基于CFormView类的多文档应用程序用MFC AppWizard(exe)创建一个默认的多文档应用程序Ex_DocView,但在向导的第六步将CEx_DocViewView的基类由默认的CView选择为CFormView类,如图8.2所示。图8.2 设置视图的基类为CFormView类(2)添加应用程序所需的数据 第一步 在Visual C+中,选择菜单【插入】【新建类】,打开新建类对话框。在“Class type”组合框中选择Generic Class,类名为CStudent,默认的类文件为Student.cpp,设置该类的父类为CObject,并单击【OK】按钮。如图8.3所示。图8.3 添加CStudent类 第二步 打开项目工作区的文件视图,双击打开Student.h文件,如图8.4所示,编辑CStudent类定义的代码如下:class CStudent : public CObject public:long m_nCode;CString m_sName;long m_lAge;double m_lScore;CStudent();CStudent(long,CString,long ,double);virtual CStudent();图8.4 打开Student.h文件 第三步 同上步,编辑Student.cpp文件,修改类CStudent的构造函数实现代码如下:CStudent:CStudent(long code,CString name,long age,double score)m_nCode=code;m_sName=name; m_lAge=age;m_lScore=score; 第四步 在Ex_DocViewDoc.h文件中,为类CEx_DocViewDoc添加数据成员:class CEx_DocViewDoc : public CDocumentpublic: POSITION curPos;CTypedPtrList m_dataList; 说明:m_dataList定义为CStudent类指针的表CtypedPtrList变量,curPos定义为POSITION变量,用来指示当前指针。 第五步 在文件stdafx.h中加入添加如下代码:#include因为在程序中使用了模板类CTypedPtrList。 第六步 在Ex_DocViewDoc.h文件的头部添加如下代码:#include Student.h 第七步 在文档关闭时,需要清除m_dataList占用的内存,利用属性窗口为CEx_DocViewDoc类加入虚函数DeleteContens(),并添加代码: void CEx_DocViewDoc:DeleteContents() while(!m_dataList.IsEmpty() delete m_dataList.RemoveHead(); CDocument:DeleteContents(); (3)修改IDD_EX_DOCVIEW_FORM对话框资源,添加应用程序所需控件: 第一步 打开项目工作区的资源视图,双击打开IDD_EX_DOCVIEW_FORM对话框资源如图8.5所示,编辑IDD_EX_DOCVIEW_FORM对话框资源,如图8.6所示。 图8.5 打开对话框资源 图8.6 编辑后的对话框控件 第二步 设置图8.6各控件的属性如表8.1所示。表8.1 添加的控件控件ID标题其他属性编辑框(学号)IDC_CODE默认编辑框(姓名)IDC_NAME默认编辑框(年龄)IDC_AGE默认编辑框(成绩)IDC_SCORE默认按钮(添加)IDC_ADD添加默认按钮(下一个)IDC_NEXT下一个默认 第三步 打开MFC ClassWizard的Member Variable页面,确定Class Name是CEx_DocViewView,如图8.7所示。选中所需的控件ID号,双击鼠标。依次为下列控件添加成员变量,如下表8.2所示。图8.7 为CEx_DocViewView添加成员变量表8.2 控件变量ID成员变量名属性类型变量类型IDC_CODEm_nCodeValueUINTIDC_NAMEm_sNameValueCStringIDC_AGEm_lAgeValuelongIDC_SCOREm_lScoreValuedouble(4)为按钮编写消息响应函数 第一步 用MFC ClassWizard为按钮IDC_ADD添加BN_CLICKED的消息映射,如图8.8所示,单击【添加函数】按钮为CEx_DocViewView添加OnAdd( )成员函数,再单击【编辑代码】按钮为该含函数加入下列代码:void CEx_DocViewView:OnAdd() UpdateData(); CEx_DocViewDoc *pDoc=GetDocument();ASSERT_VALID(pDoc); CStudent *pStudent;pStudent=new CStudent(m_nCode,m_sName,m_lAge,m_lScore); pDoc-m_dataList.AddTail(pStudent); pDoc-curPos=pDoc-m_dataList.GetHeadPosition();图8.8 为按钮IDC_ADD编写消息响应函数说明:UpdateData()函数迫使对话框编辑控件和相应变量之间传送数据,该函数原型为:BOOL UpdateData(BOOL bSaveAndValidate:TRUE);其中bSaveAndValidate为true时表示数据已经更新。在CEx_DocViewView:OnAdd()函数中,取得指向文档的指针,操作文档对象的成员变量m_dataList,首先使用用户输入的变量值构造一个新CStudent对象,然后将其加入m_dataList表尾,最后将curPos指向表头。通过上面的操作,一个新CStudent对象就加到m_dataList表中。 第二步 同上步,用MFC ClassWizard为按钮IDC_NEXT添加BN_CLICKED的消息映射,并增加下列代码:void CEx_DocViewView:OnNext() CEx_DocViewDoc *pDoc =GetDocument();ASSERT_VALID(pDoc);if(pDoc-curPos!=NULL) CStudent *pStudent=(CStudent *)pDoc-m_dataList.GetAt(pDoc-curPos);m_nCode=pStudent-m_nCode;m_sName=pStudent-m_sName;m_lAge=pStudent-m_lAge;m_lScore=pStudent-m_lScore;UpdateData(false); pDoc-m_dataList.GetNext(pDoc-curPos); if(pDoc-curPos=NULL) pDoc-curPos=pDoc-m_dataList.GetHeadPosition();elseMessageBox(当前列表中没有数据!);说明:CEx_DocViewView:OnNext函数用来循环遍历m_dataList表,首先得到文档指针,然后判断,如果curPos为空,就说明没有数据,因为在OnAdd函数中将其设在表头。如果表不空,就进行循环遍历。 第三步 编译运行并测试,结果见图8.1【例8.2】文档视图结构应用程序例子(Editor)。(1)创建单文档应用程序Editor 第一步 用MFC AppWizard(exe)创建一个默认的单文档应用程序Editor,但在向导的第四步单击【Advanced】按钮,弹出AdvancedOption对话框,设置文档视图结构的一些属性,如图8.9所示。图8.9 Advanced Option对话框该对话框提供的Document Template String(文档模板字符串)标签页,该项的值将与应用程序类中定义文档模板类对象的第一个文档模板字符串IDR_MAINFRAME对应。它包括以下几个文本框:l File extension:指定应用程序创建的文档所用的文件名后缀。输入后缀名.txt,表明Editor使用文本文件的后缀名.TXT;l File type ID:用于在Windows的注册数据库中标识应用程序的文档类型;l Main frame caption:主框架窗口标题,默认情况下与项目名相一致;l Doc type name:文档类型名,指定与一个从CDocument派生的文档类相关的文档类型名;l Filter name:用作“打开文件”、“保存文件”对话框中的过滤器。Visual Studio会自动根据输入的后缀名生成一个过滤器:Editor Files(*.txt)。这样,当在Open File对话框中选择Editor Files(*.txt)时,只有以.txt为后缀名的文件名显示在文件名列表中;l File new name(short name):用于指定在new对话框中使用的文档名。当应用程序支持多种文档类型时,选择【Fi1e】【New】命令会弹出一个对话框,列出应用程序所支持的所有文档类型,供用户选择。选择一种文档类型后,自动创建相应类型的文档。l File type name(long name):用于指定当应用程序作为OLE Automation服务器时使用的文档类型名,使用默认值。(2)添加应用程序所需的数据 第一步 打开项目工作区的文件视图,双击打开EditorDoc.h文件,如图8.10所示,并在该文件中,定义文档的数据成员,加入以下代码:class CEditorDoc : public CDocumentpublic:CStringList lines; / 链表CStringList来保存文本编辑器的数据int nLineNum; / 用于指示当前编辑行行号 图8.10 打开EditorDoc.h文件 第二步 同上步,打开在EditorDoc.cpp文件,在CEditorDoc:OnNewDocument()成员函数加入初始化数据成员的代码:BOOL EditorDoc:OnNewDocument()if (!CDocument:OnNewDocument() return FALSE;nLineNum=0;POSITION pos; / pos指向链表当前元素。pos=lines.GetHeadPosition(); / 返回链表头指针while(pos!=NULL)(CString)lines.GetNext(pos).Empty();lines.RemoveAll(); / 清除链表中的所有指针return TRUE;说明:语句(CString)lines.GetNext(pos).Empty()的作用是:以当前pos为参数,返回下一个元素指针,同时修改pos,使它指向下一个元素。使用强制类型转换将GetNext()函数返回的元素指针转化为CString类型,然后调用Cstring:Empty()方法清除该行中的所有字符。通过一个while循环,清除所有文本行的数据。一般地,类的数据成员的初始化都是在构造函数中完成的,但由于文档对象创建后,需要反复刷新而不是反复创建,因此文档类的数据成员初始化工作放在OnNewDocument成员函数中完成而不在构造函数中做这件事情。 第三步 用MFC ClassWizard为CEditorDoc类添加虚函数DeleteContents(),如图8.11所示。同时,增加下述代码:void CEditorDoc:DeleteContents() nLineNum=0;POSITION pos;pos=lines.GetHeadPosition();while(pos!=NULL)(CString)lines.GetNext(pos).Empty();lines.RemoveAll();CDocument:DeleteContents();图8.11 为CEditorDoc类添加虚函数说明:在使用【File】【Open】命令打开一个文档或关闭应用程序时,都需要清理文档对象中的数据。文档的清理是在文档的CDocument:DeleteContents()虚函数中完成的。DeleteContents()成员函数需要反复调用,它的功能是删除文档的数据,并确信一个文档在使用前为空。有读者可能想到在析构函数中清理文档数据,但析构函数只在文档对象结束时调用,用于清除那些在对象生存期都将存在的数据项,显然析构函数不能满足重复调用的要求。(3)处理键盘输入 第一步 在文档类的头文件EditorDoc.h中,定义视图类的数据成员,加入以下代码:class CEditorView : public CViewint lHeight;int cWidth; 第二步 用MFC ClassWizard为CEditorView类添加虚函数OnInitialUpdate(),并增加下列代码:void CEditorView:OnInitialUpdate() CDC *pDC=GetDC(); / 取得当前窗口的设备场境指针并存放在pDC中TEXTMETRIC tm;pDC-GetTextMetrics(&tm);lHeight=tm.tmHeight+tm.tmExternalLeading;cWidth=tm.tmAveCharWidth;CView:OnInitialUpdate();说明:视图类一般在CView:OnInitialUpdate()成员函数来初始化视图类的数据成员。因为这时,视图窗口已经创建,马上开始更新,那么可能影响视图显示的数据一定要在这时初始化。在以下情况下,应用程序将自动执行视图类的OnInitialUpdate()来初始化视图类数据成员:调用CDocument:OnNewDocument时;调用CDocument:OnOpenDocument时需要清除视图原有的显示内容。TEXTMETRIC是一个数据结构,它包含字体的宽度、高度、字的前后空白等字段。调用CDC:GetTextMetrics()获取字体的TEXTMETRIC,从而取得字体的宽度和高度等信息。 第三步 用MFC ClassWizard为类CEditorView添加WM_CHAR的消息处理函数OnChar(),如图8.12所示。打开CEditorView:OnChar()函数进行编辑。修改后的OnChar函数如下:void CEditorView:OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) CEditorDoc* pDoc=GetDocument();CClientDC dc(this);CString line(); / 存放编辑器当前行字符串POSITION pos=NULL; / 字符串链表位置指示if(nChar=r) / 若是回车,则增加一行pDoc-nLineNum+;else/ 按行号返回字符串链表中位置值pos=pDoc-lines.FindIndex(pDoc-nLineNum);if(!pos)/ 没有找到该行号对应的行,因此它是一个空行,把它加到字符串链表中line+=(char)nChar;pDoc-lines.AddTail(CString(line);else/ 当前文本行还没有换行结束,因此将文本加入到行末line=pDoc-lines.GetAt(pos);line+=(char)nChar;pDoc-lines.SetAt(pos,line);TEXTMETRIC tm;dc.GetTextMetrics(&tm);dc.TextOut(0,(int)pDoc-nLineNum*tm.tmHeight,line,line.GetLength();CView:OnChar(nChar, nRepCnt, nFlags); 图8.12 为CEditorView类添加消息处理函数说明:编辑器要不断接收用户的键盘输入,就必须处理键盘消息。每按下一个字符,窗口就会接收到一个消息WM_CHAR。WM_CHAR消息是在视图类中处理的,对该消息的处理过程大致包括:读取用户输入的字符,如果输入是一个回车,则将总行数nLineNum加1,否则将输入字符加到当前行行末。最后调用TextOut函数输出当前编辑中的文本行。 第四步 修改CEditorView类的OnDraw()函数,编辑后该函数的代码如下:void CEditorView:OnDraw(CDC* pDC)CEditorDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);TEXTMETRIC tm;pDC-GetTextMetrics(&tm);lHeight=tm.tmHeight+tm.tmExternalLeading;cWidth=tm.tmAveCharWidth;int y=0;POSITION pos;CString line;if(!(pos=pDoc-lines.GetHeadPosition()return;while(pos!=NULL)line=pDoc-lines.GetNext(pos);pDC-TextOut(0, y, line, line.GetLength();y+=lHeight;在OnDraw()函数中,首先调用GetDocument()函数,取得指向当前视图所对应的文档的指针。通过这个指针,来访问文档中的数据。以后在视图中修改文档中的数据,也是通过GetDocument()来取得文档指针,再通过该文档指针修改文档中的数据。 第五步 编译运行,结果如图8.13所示。图8.13 Editor的运行结果【例8.3】一个简单的文档序列化示例(Ex_SDIArchive)。 第一步 用MFCAppWizard(exe)创建一个默认的单文档应用程序Ex_SDIArchive。 第二步 打开StringTable资源,将文档模板字符串资源IDR_MAINFRAME内容修改为:文档序列化操作nnn自定义文件(*.my)n.mynExSDIArchive.DocumentnEx_SDI Document。如图8.16所示。图8.16 文档模板字符串的设置 第三步 为CEx_SDIArchiveDoc类添加下列成员变量:class CEx_SDIArchiveDoc : public CDocumentpublic: CPoint points100; int m_index; / 表示数组中点的数目; 第四步 在CExSDIArchiveDoc:OnNewDocument函数中添加下列代码:m_index=0;BOOL CEx_SDIArchiveDoc:OnNewDocument()m_index=0;return TRUE; 第五步 用MFC ClassWizard为类CEx_SDIArchiveView添加WM_LBUTTONDOWN的消息处理函数OnLButtonDown(),如图8.17所示。然后打开该函数进行编辑。修改后的OnLButtonDown函数如下:void CEx_SDIArchiveView:OnLButtonDown(UINT nFlags, CPoint point) CEx_SDIArchiveDoc* pDoc=GetDocument();if(pDoc-m_index=100)return; pDoc-m_index+; pDoc-pointspDoc-m_index=point; / 接受鼠标输入,将其添加到文档类 pDoc-SetModifiedFlag(); / 设置文档修改标志 Invalidate(); / 更新客户区域CView:OnLButtonDown(nFlags, point);图8.17 为视图类添加WM_LBUTTONDOWN的消息处理函数 第六步 修改CEx_SDIArchiveView CEditorView类的OnDraw()函数,编辑后该函数的代码如下:void CEx_SDIArchiveView:OnDraw(CDC* pDC)int index;index=pDoc-m_index; for (int i=1;iEllipse(pDoc-pointsi.x-2,pDoc-pointsi.y-2, pDoc-pointsi.x+2,pDoc-pointsi.y+2); 第七步 用MFC ClassWizard为类CEx_SDIArchiveDoc添加Serialize虚函数,实现文档类中成员添加下列代码:void CEx_SDIArchiveDoc:Serialize(CArchive& ar)if (ar.IsStoring()arm_index;for (int i=0;i=m_index;i+) arpointsi.xm_index;for (int i=0;ipointsi.xpointsi.y; 第八步 编译运行并测试。结果如图8.18所示。程序运行后,选择【文件】【另存为】命令,指定一个文档名ab,然后选择【文件】【新建】命令,再打开文档,结果就会弹出对话框,显示该文档的内容。图8.18 Ex_SDIArchive的运行结果【例8.4】一个简单的CArchive类用法的示例(Ex_Archive)。 第一步 用MFC AppWizard(exe)创建一个默认的基于对话框的应用程序Ex_Archive。 第二步 选择【文件】【新建】命令,显示出“新建”对话框。单击“文件”标签在左边的列表框中选择C/C+ Header File项,在右边的“文件”下的编辑框中键入Person.h,单击【确定】按钮,如图8.19所示。在Person.h文件中输入下面的代码:class CPerson : public CObjectDECLARE_SERIAL(CPerson)public:UINT Load(void);CString m_szName ;UINT m_nAge;virtual void Serialize(CArchive& ar);CPerson(); virtual CPerson();图8.19 新建头文件 第三步 同上步,选择【文件】【新建】命令,显示出“新建”对话框。单击“文件”标签,在左边的列表框中选择C+ Source File项,在右边的“文件”下的编辑框中输入Person.cp,单击【确定】按钮。在Person.cpp文件中输入下面的代码:#include stdafx.h#include Person.hIMPLEMENT_SERIAL(CPerson, CObject, 1)CPerson:CPerson() CPerson:CPerson() void CPerson:Serialize(CArchive& ar) if (ar.IsStoring()arm_szNamem_szNamem_nAge; UINT CPerson:Load()CFile f;char buf512;if( !f.Open( person.dat, CFile:shareDenyWrite|CFile:modeRead) ) return 0;else CArchive ar( &f, CArchive:load, 512, buf );Serialize(ar);return 1;说明:通过2、3两步建立了CPerson类,并且改类为可序列化的类,CPerson类的成员函数Load( )首先生成指向person.dat文件的CFile对象,然后构造读文件的CArchive对象ar,并从文件中读数据完成Cperson对象的初始化。 第四步 编辑IDD_EX_ARCHIVE_DIALOG对话框资源,如图8.20所示。图8.20 对话框资源设置图8.20控件的属性如表8.3示:表8.3 添加的控件控件ID标题其他属性编辑框(Name)编辑框(Age)按钮(保存)IDC_EDIT_NAMEIDC_EDIT_AGEIDC_SAVE保存默认默认默认 第五步 打开MFC ClassWizard的Member Variable页面,确定class Name是CEx_ArchiveDlg,选中所需的控件ID号,双击鼠标。依次为下列控件添加成员变量,如下表8.4所示。表8.4 控件变量ID成员变量名属性类型变量类型IDC_EDIT_AGEm_nAgeValueUINTIDC_EDIT_NAMEm_szNameValueCString 第六步 为类CEx_ArchiveDlg添加一个CPerson类的对象m_person成员。并在Ex_ArchiveDlg.h文件的头部添加以下语句:#include person.h 第七步 修改CEx_ArchiveDlg的OnInitDialog()函数在该函数中添加从文件读取数据并初始化m_person的代码:BOOL CEx_ArchiveDlg:OnInitDialog()if(m_person.Load()this-m_szName=this-m_person.m_szName;this-m_nAge=this-m_person.m_nAge;this-UpdateData(FALSE);else AfxMessageBox(load person data fails);return TRUE; 第八步 用MFC ClassWizard为按钮IDC_SAVE添加BN_CLICKED的消息映射,并增加下列代码:void CEx_ArchiveDlg:OnSave() CFile f;char buf512;if( !f.Open( person.dat,CFile:modeCreate | CFile:modeWrite) ) exit( 1 );CArchive ar( &f, CArchive:store, 512, buf ); UpdateData();m_person.m_nAge=this-m_nAge;m_person.m_szName=this-m_szName;m_person.Serialize(ar); 第九步 编译运行并测试。【例8.5】将单文档应用程序中的文档窗口静态分成32个窗格(Ex_Split)。 第一步 用MFC AppWizard(exe)创建一个单文档应用程序Ex_Split。 第二步 打开框架窗口类MainFrm.h头文件,为CMainFrame类添加一个保护类型的切分窗口类的数据成员,如下面的定义:protected:CStatusBarm_wndStatusBar;CToolBarm_wndToolBar;CSplitterWnd m_wndSplitter; / 添加的数据成员 第三步 用MFC ClassWizard为CMainFrame类添加OnCreateClient(当主框架窗口客户区创建的时候自动调用该函数)函数重载,并添加下列代码:BOOL CMainFrame:OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) CRect rc; GetClientRect(rc);/ 获取客户区大小/ 计算每个窗格的平均尺寸CSize paneSize(rc.Width()/2-16,rc.Height()/3-16);m_wndSplitter.CreateStatic(this,3,2);/ 创建3 x 2个静态窗格/ 为相应的窗格指定视图类m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CEx_SplitView), paneSize,pContext);m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CEx_SplitView),paneSize,pContext);m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CEx_SplitView), paneSize,pContext);m_wndSplitter.CreateView(1,1,RUNTIME_CLASS(CEx_SplitView),paneSize,pContext);m_wndSplitter.CreateView(2,0,RUNTIME_CLASS(CEx_SplitView), paneSize,pContext);m_wndSplitter.CreateView(2,1,RUNTIME_CLASS(CEx_SplitView),paneSize,pContext);return TRUE;说明:在静态切分窗口的生成过程中CMainFrame类的相关成员函数的调用工程如图8.21所示。图8.21 静态切分窗口的生成过程 第四步 在MainFrm.cpp源文件的开始处,添加视图类CEx_SplitView的包含文件:#include Ex_SplitView.h 第五步 在Ex_SplitView.h头文件的开始处,在class CEx_SplitView : public CView语句前面添加下列代码:class CEx_SplitDoc; 第六步 修改CEx_SplitView:OnDraw ()函数,编辑后该函数的代码如下:void CEx_SplitView:OnDraw(CDC* pDC)CEx_SplitDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC-TextOut(0,0,Hello World!); 第七步 编译并运行,结果如图8.22所示。图8.22 Ex_Split的运行结果【例8.6】静态切分窗口的多视图SDI应用程序(Ex_SplitSDI)。(1)创建一个默认的单文档应用程序Ex_SplitSDI 第一步 用MFC AppWizard(exe)创建一个单文档应用程序Ex_SplitSDI。(2)增加文档类数据成员 第一步 为文档类添加集合类成员: CArray m_nArray;在Ex_SplitSDIDoc.h文件的头部,加入语句:#include 第二步 在CEx_SplitSDIDoc:OnNewDocument()函数中,初始化数据成员m_nArray:BOOL CEx_SplitSDIDoc:OnNewDocument()m_nArray.SetSize(10,0);m_nArray0=10; m_nArray1=5;m_nArray2=7; m_nArray3=23;m_nArray4=14; m_nArray5=16;m_nArray6=10; m_nArray7=7;m_nArray8=9; m_nArray9=6;return TRUE; 第三步 修改CEx_SplitSDIView:OnDraw()函数,编辑后该函数的代码如下:void CEx_SplitSDIView:OnDraw(CDC* pDC)CEx_SplitSDIDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);TEXTMETRIC tm;pDC-GetTextMetrics(&tm);int y=0; char str20;for(int i=0;im_nArray.GetSize();i+)wsprintf(str,%d: %d,i+1,pDoc-m_nArrayi);pDC-TextOut(0,y,str);y+=tm.tmHeight+tm.tmExternalLeading;(3)增加一个新的视图类CBarView 第一步 在Visual C+中,选择菜单【插入】【新建类】命令,打开新建类对话框。在“Class type”组合框中选择MFC Class,类名为CBarView,默认的类文件为BarView.cpp。设置该类的父类为CView,如图8.23所示。图8.23 New Class对话框 第二步 在BarView.h文件中,在类CBarView的定义中添加如下代码:CEx_SplitSDIDoc* GetDocument();在BarView.h文件的头部,加入以下语句: #include Ex_SplitSDIDoc.h 第三步 在BarView.cpp文件中,添加类CBarView:GetDocument()的实现函数:CEx_SplitSDIDoc* CBarView:GetDocument() ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CEx_SplitSDIDoc);return (CEx_SplitSDIDoc*)m_pDocument; 第四步 修改CBarView:OnDraw()函数,编辑后该函数的代码如下:void CBarView:OnDraw(CDC* pDC)CEx_SplitSDIDoc* pDoc = GetDocument();CRect rc; int cBar,cBarSpace,x,y;int cxGraph=100;int cyGraph=20;GetClientRect(&rc);CBrush br1(RGB(255,0,0);CPen pen(PS_SOLID,1,RGB(255,0,0);CBrush *poldbr=pDC-SelectObject(&br1);CPen *poldpen=pDC-SelectObject(&pen);cBar=cxGraph*3/4/10;cBarSpace=cBar/3;pDC-SetMapMode(MM_ANISOTROPIC);pDC-SetWindowOrg(0,0);pDC-SetViewportOrg(10,rc.bottom-10);pDC-SetWindowExt(cxGraph ,cyGraph);pDC-SetViewportExt(rc.right-20,-rc.bottom+20);int i;for(x=cBarSpace,y=0,i=0;im_nArray.GetSize();i+,x+=cBar+cBarSpace)pDC-Rectangle(x,y,x+cBar,y+pDoc-m_nArrayi);pDC-SelectObject(poldbr);pDC-SelectObject(poldpen);(4)修改框架窗口类,实现静态切分窗口 第一步 打开框架窗口类MainFrm.h头文件,为CMainFrame类添加一个保护类型的切分窗口类的数据成员,如下面的定义:protected:CStatusBarm_wndStatusBar;CToolBarm_wndToolBar;CSplitterWnd m_wndSplitter; 第二步 用MFC ClassWizard为CMainFrame类添加OnCreateClient(当主框架窗口客户区创建的时候自动调用该函数)函数重载,并添加下列代码:BOOL CMainFrame:OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) m_wndSplitter.CreateStatic(this,1, 2);m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CEx_SplitSDIView),CSize(200,0),pContext);m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CBarView),CSize(0,0),pContext);return TRUE; 第三步 在MainFrm.cpp源文件的开始处,添加视图类CSplitterView的包含文件:#include BarView.h#include Ex_SplitSDIView.h 第四步 编译并运行,结果如图8.23所示。图8.23 Ex_SplitSDI的运行结果【例8.7】静态切分窗口的多视图MDI应用程序(Ex_SplitMDI)。该示例是用切分窗口在一个多文档应用程序Ex_SplitMDI中为同一个文档数据提供两种不同的显示和编辑方式,如图8.24所示。在左边的窗格(表单视图)中,用户可以调整小圆在右边窗格的坐标位置。而若在右边窗格(一般视图)中任意单击鼠标,相应的小圆会移动到当前鼠标位置处,且左边窗格的编辑框内容也随之发生改变。图8.24 Ex_SplitMDI的运行结果(1)设计并完善切分窗口左边的表单视图 第一步 用MFC AppWizard(exe)创建一个多文档应用程序Ex_SplitMDI。在第六步中将视图的基类选择为CFormView。 第二步 打开表单模板资源IDD_EX_SPLITMDI_FORM,见图8.24,调整表单模板大小,并依次添加如表8.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- it项目采购合同样本
- 中英投资合同样本
- 买卖标准合同样本
- 共用线路三方协议合同标准文本
- 个人租赁土地合同样本
- 代购柴油合同标准文本
- 住房代理销售合同样本
- 中石油用工合同样本
- 个人坟墓购买合同样本
- 住房公积金购房合同样本
- 湖北省十一校2024-2025学年高三第二次联考数学试卷(解析版)
- 《手工制作》课件-幼儿园挂饰
- 人武专干考试题型及答案
- 2025届高三化学二轮复习 化学反应原理综合 课件
- 2025年北京五湖四海人力资源有限公司招聘笔试参考题库含答案解析
- 常见的酸和碱第2课时酸的化学性质 2024-2025学年九年级化学人教版(2024)下册
- 欢乐购物街-认识人民币(说课稿)-2024-2025学年人教版数学一年级下册
- 2025年中国南方航空股份有限公司招聘笔试参考题库含答案解析
- 疫苗与接种管理制度
- 电子商务案例分析知到智慧树章节测试课后答案2024年秋西安邮电大学
- 《通信用开关电源的元器件降额准则-》
评论
0/150
提交评论