MFC的窗口分割实例以及CSplitterWnd类

上传人:豆浆 文档编号:11121635 上传时间:2017-09-02 格式:PDF 页数:9 大小:199.91KB
返回 下载 相关 举报
MFC的窗口分割实例以及CSplitterWnd类_第1页
第1页 / 共9页
MFC的窗口分割实例以及CSplitterWnd类_第2页
第2页 / 共9页
MFC的窗口分割实例以及CSplitterWnd类_第3页
第3页 / 共9页
MFC的窗口分割实例以及CSplitterWnd类_第4页
第4页 / 共9页
MFC的窗口分割实例以及CSplitterWnd类_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《MFC的窗口分割实例以及CSplitterWnd类》由会员分享,可在线阅读,更多相关《MFC的窗口分割实例以及CSplitterWnd类(9页珍藏版)》请在金锄头文库上搜索。

1、 的窗口分割的设计与实现以及 CSplitterWnd 类分析 1 引言 在 Microsoft VC+ 6.0 中, 基于 MFC 的应用程序一般分为以下几种: 多文档界面 ( MDI) 、单文档界面( SDI)以及基于对话框的应用程序。其中单文档又可分为单视图的和多视图的,一般情况下,单文档仅需要单视图就够了,如 Windows 自带的记事本、画图程序等等,但在一些情况下,单文档需要多视图支持,比如同时观察文档的不同部分,同时从不同的角度观察同一文档等。 在 MFC 的框架下,文档对象( CDocument)有一个保存其所有视图的列表,并提供了增加视图( AddView)与删除视图( Re

2、moveView)函数,以及当文档内容改变时通知其所有视图的方法( UpdateAllViews) 。通过多文档框架的窗口复制机制和单文档框架的分割窗口机制是实现单文档多视图的主要方法。 2 单文档的多视图 一般地,单文档与多视图有三种情况: (1)在多文档界面 MDI 中,每个视图位于 MDI 的一个独立子文档框架中,视图对象基于同一个视图类。用户可以通过 “窗口 | 新窗口 ”菜单,为同一文档的视图再创建一个窗口,通过新创建的窗口, 可以编辑和观察文档的另一部分, 同一文档各个视图之间自动实现同步,用户修改一个视图的内容,在另外的视图中也自动更新。 MFC 框架通过复制原来的子框架窗口和其

3、中的视图来实现上面的功能,并且是完全自动的。 (2)视图对象基于同一视图类,所有视图位于同一文档框架中。 分割窗口将单文档窗口的视图区分割成几个独立的视图, 框架从同一视图类创建多个视图对象。 Word 的子窗口即属于这种类型。 (3)视图对象基于不同的视图类,所有的视图位于同一文档框架中。 多个视图共享同一文档框架,但从不同的视图类创建,每个视图可以为文档提供不同的观察和编辑方法。比如在一个窗口里观察文档的不同部分,或者是在一个窗口里用不用类型的视图观察同一个文档。这种类型的实现方法是通过重载框架类 CMainFrame 的成员函数 OnCreateClient 实现,用户可以根据不同需要将

4、窗口分为垂直或水平的多个分割窗口。 下面通过实例设计,介绍单文档多视图的窗口分割和多视图之间的通信的实现方法。 3 分割窗口 如图 1,把窗口分成三个视图,左视图基于 CView 类,可用来作几何图形;右上视图基于 CEditView 类,用于显示文本消息;右下视图基于 CFormView 类,在此视图中做一个文本框及发送、清除按钮,发送按钮用来向右上视图传送消息。 图 1 设计样式 打开 Microsoft VC+ 6.0, 通过 MFC AppWizard( exe) 新建名为 SplitWnd 的单文档 ( SDI)工程,新建工程时所有选项均按默认设定。 工程建好后,把工程中的 CSpl

5、itWndView 视图类作为左视图所对应的类(该类的实现与本文重点无关,故不阐述,有兴趣读者可与作者联系) ,由于需要三个视图窗口对应三个 视图类,因此需要手动创建右上视图、右下视图对应的类,可以通过 MFC 向导向应用程序添加两个 MFC 类(菜单 “Insert | New Class”) ,因为在右上视图用于显示文本,故其基类选CEditView,类名为 CLeftTopView;另一个 MFC 类的基类选 CFormView 类,取类名为CLeftBttmView,该类即对应右下视图(由于该类基于 CFormView 类,需要有对话框与之对应,故应先在资源中新建对话框,对话框中的控件

6、如图 1) 。 完成类的添加后,进行代码编写,首先在 CMainFrame 类声明中添加 CSplitterWnd 对象的声明: class CMainFrame : public CFrameWnd CSplitterWnd m_wndSplitter;/ split the view into left and right CSplitterWnd m_wndSplitterRight; / split the right view into top and bottom 然后重载 CMainFrame 类的函数 OnCreateClient,添加如下代码,即可实现窗口的分割: BOOL

7、CMainFrame:OnCreateClient ( ) /先把窗口分割为 12 的形式,即分割为两列 m_wndSplitter.CreateStatic( this, 1, 2 , WS_CHILD | WS_VISIBLE| WS_BORDER); /然后把窗口第 2 列再分割为 21 的形式 m_wndSplitterRight.CreateStatic( &m_wndSplitter, 2, 1, WS_CHILD|WS_VISIBLE, m_wndSplitter.IdFromRowCol(0, 1) ); /下面为分割后的窗口对应的视图类 m_wndSplitter.Creat

8、eView(0, 0, RUNTIME_CLASS(CSplitWndView), CSize(600, 100), pContext); m_wndSplitterRight.CreateView(0, 0, RUNTIME_CLASS(CLeftTopView), CSize(10, 500), pContext); m_wndSplitterRight.CreateView(1, 0, RUNTIME_CLASS(CLeftBttmView), CSize(10, 10), pContext); 通过 CSplitterWnd 类的对象, 调用 CreateStatic( CWnd* p

9、ParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST)成员函数用于创建并初始化静态拆分窗口, 参数 pParentWnd 用来标识拆分父窗口, nRows, nCols标识行列数,即把父窗口 pParentWnd 分成的行列数, dwStyle 用来标识拆分窗口的风格,而nID 是指拆分父窗口 pParentWnd 的哪个子窗口。因此调用对象 m_wndSplitter 的函数CreateStatic 时,把整个窗口拆分成 1 行 2 列(左右)

10、两个视图:第 0 行 0 列(即左视图) ,然后调用 CreateView 函数设置该视图的类 CSplitterTestView;而对第 0 行 1 列,调用对象m_wndSplitterRight 的函数 CreateStatic,将其拆分成 2 行 1 列(上下)两个视图,故此时的父窗口为 m_wndSplitter,且 nID 为 m_wndSplitter.IdFromRowCol(0, 1),因为 m_wndSplitter有左右两个窗口,而需拆分的为第 0 行 1 列,然后调用函数 CreateView 设置视图的类。 4 视图之间的通信 视图之间的通信,指在各个视图之间传递数据

11、。该例中,在右下视图中点击发送按钮则把文本框中的文字发送到右上视图,并在右上视图显示,即实现这两个视图间的数据传递。 在 CLeftBttmView 类中添加发送按钮对应函数 OnSendMsg,其功能就是把文本框中的内容发送给右上视图,主要代码如下: void CLeftBttmView:OnSendMsg() UpdateData();/更新控件变量数据,文本框对应的变量为 m_sText /通过 CMainFrame 类中的 m_wndSplitterRight 变量获得右上视图类指针 CMainFrame * pMainFrm = (CMainFrame *)AfxGetApp()-G

12、etMainWnd(); CWnd * pWnd = pMainFrm-m_wndSplitterRight.GetPane(0, 0); CLeftTopView* pLeftTopView = DYNAMIC_DOWNCAST(CLeftTopView, pWnd); pLeftTopView -GetMsg( m_sText + rn );/CLeftTopView 成员函数,接收数据 右上视图类 CLeftTopView 的成员函数 GetMsg 则需保存接收到的消息并显示,主要代码如下: void CLeftTopView:GetMsg(CString sMsg) m_sAllMsg

13、 += sMsg; / m_sAllMsg 为成员变量,记录所有消息 int nTextLen = GetWindowTextLength(); GetEditCtrl().SetSel(nTextLen, nTextLen); GetEditCtrl().ReplaceSel( sMsg );/显示新消息 有了上面两个函数就可以实现右上视图类 CLeftTopView 与右上视图类 CLeftBttmView之间的简单通讯,类似地,可以实现所有视图之间任意的数据传递。 实例说明 实例为一个基于单文档的 MFc 应用程序,通过静态分割窗口的方式三叉切分窗口,即共有三个窗格。程序实现的功能是用户

14、可以输入学生的信息,并添加到列表视图中。程序最终运行的结果如下图: 程序运行结果 其中左侧的基本信息输入的窗格采用的是 CFormView 类型的视图, 在用户可以其中进行信息的录入,单击 “提交 ”按钮,数据就添加道文档中了,并在右侧的列表视图中显示。右侧信息显示的窗格采用的是 CListView 类型的视图,显示文档中存储的所有学生信息。而底部的窗格采用的是 CEditView 类型的视图,用于提示用户上一步添加的数据。下面介绍具体的实现过程。 创建工程 使用 AppWizard 创建一个基于单文档的应用程序框架工程,工程名为 “Guo”,其余的现象均采用默认设置。 添加视图类 需要为 3

15、 个窗格添加 3 个视图类。 CLeftFormView、 CTopListView、 CBottomEditView,其基类分别为 CFormView、 CListView 和 CEditView。 1、 CLeftFormView 类的实现 A、 添加对话框资源模板:添加 CLeftFormView 类之前,首先要向工程中添加CLeftFormView 视图中对话框模板,如下图所示: 对话框模板的 ID 为 “IDD_DIALOG1”,其 Style 属性设置为 “Child”, Bolder 属性设置为“None”。 B、 添加 CLeftFormView 类。执行 “Insert”“N

16、ew Class”菜单命令,弹出 “New Class”对话框,在其中的 Name 编辑框中输入类名 “CLeftFormView”,在 Base Class 列表框中选择基类“CFormView”选项,在 Dialog ID 列表框中选择 “IDD_DIALOG1”对话框资源。单击 Ok 即可实现 CLeftFormView 类的添加。 C、添加 CLeftFormView 类的相关资源:利用 Class Wizard 在 CLeftFormView 中,为对话框模板的 4 个编辑控件分别添加 CString 类型的成员变量 m_Num、 m_Name、 m_Magor、m_Home,并为 “提交 ”按钮添加 BN_CLICKED 消息响

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号