转自:http://blog.csdn.net/nuptboyzhb/article/details/7455471

源代码:http://download.csdn.net/detail/nuptboyzhb/4221531

CSplitterWnd

CSplitterWnd类提供一个分隔器窗口的功能,分隔器窗口是一个包含有多个窗格的窗口。窗格通常是应用程序特定的由CView派生的对象,但它也可以是具有适当子窗口ID的任何CWnd对象。

一个CSplitterWnd对象通常被嵌入CFrameWnd或CMDIChildWnd父对象。你应按如下步骤创建一个CSplitterWnd对象:

1.

在父框架中嵌入一个CSplitterWnd成员变量。

2.

重载父框架的CFrameWnd::OnCreateClient成员函数。

3.

从重载的OnCreateClient函数中调用类CSplitterWnd的Create或CreateStatic成员函数。

3.1调用Create成员函数可以创建一个动态的分隔器窗口。

3.2 使用CreateStatic成员函数可以创建一个静态分隔器窗口。

4. 从重载的OnCreateClient函数中调用类CSplitterWnd的CreateView成员函数;

重要的函数讲解:

BOOL Create( CWnd* pParentWnd,
             int nMaxRows,
             int nMaxCols,
             SIZE sizeMin,
             CCreateContext* pContext,
             DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT,
             UINT nID = AFX_IDW_PANE_FIRST
           );
返回值:如果成功则返回非零值;否则返回0
参数:

pParentWnd

分隔器窗口的父框架窗口。

nMaxRows

分隔器窗口中的最大行数。这个值不能超过2。

nMaxCols

分隔器窗口中的最大列数。这个值不能超过2。

sizeMin

指出显示一个窗格所需的最小尺寸。

pContext

指向一个CCreateContext结构的指针。多数情况下,这个值可以是传递给父框架窗口的pContext

dwStyle

指定窗口的风格。

nID

此窗口的子窗口ID。如果这个分隔器窗口不是嵌套在另一个分隔器窗口中的,则这个ID可以是AFX_IDW_PANE_FIRST。

BOOL CreateStatic( CWnd* pParentWnd,
                   int nRows,
                   int nCols,
                   DWORD dwStyle = WS_CHILD | WS_VISIBLE,
                   UINT nID = AFX_IDW_PANE_FIRST
                 );

返回值:如果成功则返回非零值;否则返回0。
参数:

pParentWnd

分隔器窗口的父框架窗口。

nRows

行数。这个值必须不超过16。

nCols

列数。这个值必须不超过16。

dwStyle

指定窗口的风格。

nID

此窗口的子窗口ID。如果这个分隔器窗口不是嵌套在另一个分隔器窗口中的,则这个ID可以是AFX_IDW_PANE_FIRSH。

virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );
返回值:如果成功则返回非零值;否则返回0。
参数:

row

指定用来放置新视的分隔器窗口行。

col

指定用来放置新视的分隔器窗口列。

pViewClass

指定新视的CRuntimeClass。

sizeInit

指定新视的初始尺寸。

pContext

指向用来创建此视的创建环境的指针(通常,该pContext被传递给在其中创建此分隔器窗口的父框架的重载的OnCreateClient成员函数)。

注意: 第三个参数CruntimeClass为RUNTIME_CLASS(类名);如果该类是资源类,那么该类的父类必须是CformView,

应用举例:

1.       新建一个单文档的应用程序,命名为SplitterWndDemo;

2.       插入一个对话框的资源,作为其中一个分割窗口;为对话框添加相应的控件;

2.1设置对话框的属性:将样式设置为下层;禁止使用标题栏;边框选择‘调整大小’;其他格式暂时都不设置;

2.2为对话框创建一个类,类名CLeftView;父类选择为CFormView;

3.       在CMainFrame嵌入一个CSplitterWnd成员变量。

CSplitterWnd m_splitterWnd;

4.       重载父框架CMainFrame的CFrameWnd::OnCreateClient成员函数,编辑代码如下:

 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)

 {

 // TODO: Add your specialized code here and/or call the base class

 //获得主窗口的大小

 CRect rect;

 GetClientRect(&rect);

 //产生第一次静态切分

 m_splitterWnd.CreateStatic(this, //父窗口指针

                                                                    ,    //行数

                                                                    );   //列数

 //为第1个窗格产生视图

 m_splitterWnd.CreateView(,,

            RUNTIME_CLASS(CLeftView),

            CSize(rect.Width()/,rect.Height()),

            pContext); 

 //为第2个窗格产生视图

 m_splitterWnd.CreateView(,,  //窗格的行、列序数

            RUNTIME_CLASS(CSplitterWndDemoView),//视图类

            CSize(rect.Width()-rect.Width()/,rect.Height()),//初始化大小 

            pContext);//父窗口的创建参数

 return TRUE;//不再调用基类的OnCreateClient函数

 //return CFrameWnd::OnCreateClient(lpcs, pContext);

 }

注意:要添加头文件#include "SplitterWndDemoView.h"

#include "LeftView.h"

由于CSplitterWndDemoView是应用程序的视图类,在其头文件中添加文档类的头文件#include"SplitterWndDemoDoc.h",否则会报错:'CSplitterWndDemoDoc' : missing storage-class or type specifiers

至此,界面已经完成

拆分窗口之间的数据传递:

.应用文档类进行数据传递

每一个由View类派生出来的类,都可以调用CView::GetDocument,获得当前应用程序文档类的指针;然后进行类型转换;注意,要将文档类的头文件包含进去;

举例:(继续上述应用程序的编程)

1.      为文档类添加一个CString类型的成员变量m_str;

2.      为CLeftView添加一个按钮控件和一个编辑框控件;为编辑框控件关联一个CString类型的成员变量;对按钮控件添加消息响应函数,并编辑代码如下:

UpdateData();

CSplitterWndDemoDoc *pDoc =(CSplitterWndDemoDoc*)GetDocument();//获取文档

pDoc->m_str=m_edit_data;//传递数据

pDoc->UpdateAllViews(NULL);//更新所有视图

3.      在CSplitterWndDemoView::OnDraw(CDC* pDC)编辑代码如下:

CSplitterWndDemoDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDC->TextOut(200,200,pDoc->m_str);

二.通过获得对方视图的指针,进行操作的交互

通过AfxGetApp()获得应用程序的指针,然后再通应用程序的指针获得主框架CMainFrame的指针,然后有CMainFrame的指针,获得CMainFrame的CsplitterWnd类型的成员变量m_splitterWnd;然后调用m_splitterWnd的GetPane函数;即可获得;

1.      为视图类添加一个CString类型的成员变量m_str_view;

2.      为CleftView再添加一个按钮控件;编辑代码如下:

CSplitterWndDemoApp *pApp = (CSplitterWndDemoApp *)AfxGetApp();//获得应用程序的指针

CMainFrame *pFrame = (CMainFrame *)pApp->m_pMainWnd;//获得主框架的指针

CSplitterWndDemoView *pView = (CSplitterWndDemoView *)pFrame->m_splitterWnd.GetPane(0,1);//获得视图类的指针

pView->m_str_view=m_edit_data;//数据传递

pView->Invalidate();//重绘视图

注意:添加相应类的头文件:

#include "MainFrm.h"

#include "SplitterWndDemoView.h"

3.      修改CsplitterWndDemoView类的OnDraw(CDC* pDC)函数

pDC->TextOut(200,300,m_str_view);

三.自定义的消息;

MFC拆分窗口及它们之间的数据交换(转)的更多相关文章

  1. MFC拆分窗口及它们之间的数据交换

    源代码:http://download.csdn.net/detail/nuptboyzhb/4221531 CSplitterWnd类 CSplitterWnd类提供一个分隔器窗口的功能,分隔器窗口 ...

  2. Android:Activity+Fragment及它们之间的数据交换.

    Android:Activity+Fragment及它们之间的数据交换 关于Fragment与Fragment.Activity通信的四种方式 比较好一点的Activity+Fragment及它们之间 ...

  3. Android Fragment与Activity之间的数据交换(Fragment从Activity获取数据)

    Fragment与Activity之间的数据交换,通常含有3: 一.Fragment从Activity获取数据(仅本文介绍了一个第一): 两.Activity从Fragment获取数据: 三.Frag ...

  4. [转]Android:Activity+Fragment及它们之间的数据交换(一)

    2014-05-18         来源:Android:Activity+Fragment及它们之间的数据交换(一)   简介: 为什么要用Fragment?使用Fragment可以在一个Acti ...

  5. Android:Activity+Fragment及它们之间的数据交换(一)

    简单介绍: 为什么要用Fragment?使用Fragment能够在一个Activity中实现不同的界面. Fragment与Fragment之间的动画切换,远比Activity与Activity之间的 ...

  6. Flink task之间的数据交换

    Flink中的数据交换是围绕着下面的原则设计的: 1.数据交换的控制流(即,为了启动交换而传递的消息)是由接收者发起的,就像原始的MapReduce一样. 2.用于数据交换的数据流,即通过电缆的实际数 ...

  7. OpenCV学习(6) 文件和Mat之间的数据交换

          有时候为了便于调试算法,我们需要从文本文件或二进制文件中读取数据,并把数据放到相应的矩阵中去.我们通常可以通过下面的函数实现.   1.从二进制文件中读取数据.      新建一个txt文 ...

  8. Android两个Activity之间的数据交换

    1. 不带数据 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceS ...

  9. Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger

    本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是Coun ...

随机推荐

  1. HDU 1695 (莫比乌斯反演) GCD

    题意: 从区间[1, b]和[1, d]中分别选一个x, y,使得gcd(x, y) = k, 求满足条件的xy的对数(不区分xy的顺序) 分析: 虽然之前写过一个莫比乌斯反演的总结,可遇到这道题还是 ...

  2. bzoj1221: [HNOI2001] 软件开发

    挖坑.我的那种建图方式应该也是合理的.然后连样例都过不了.果断意识到应该为神奇建图法... #include<cstdio> #include<cstring> #includ ...

  3. POJ 1088 滑雪【记忆化搜索】

    题意:给出一个二维矩阵,要求从其中的一点出发,并且当前点的值总是比下一点的值大,求最长路径 记忆化搜索,首先将d数组初始化为0,该点能够到达的路径长度保存在d数组中,同时把因为路径是非负的,所以如果已 ...

  4. HDU 4632 Palindrome subsequence (区间DP)

    题意 给定一个字符串,问有多少个回文子串(两个子串可以一样). 思路 注意到任意一个回文子序列收尾两个字符一定是相同的,于是可以区间dp,用dp[i][j]表示原字符串中[i,j]位置中出现的回文子序 ...

  5. HDU 4607 Park Visit (DP最长链)

    [题目]题意:N个城市形成一棵树,相邻城市之间的距离是1,问访问K个城市的最短路程是多少,共有M次询问(1 <= N, M <= 100000, 1 <= K <= N). [ ...

  6. Mysql线程池优化笔记

    Mysql线程池优化我是总结了一个站长的3篇文章了,这里我整理到一起来本文章就分为三个优化段了,下面一起来看看.     Mysql线程池系列一(Thread pool FAQ) 首先介绍什么是mys ...

  7. win10 enterprise 10240激活:

    win10 enterprise 10240激活: 以管理员命令:slmgr /upkslmgr /ipk NPPR9-FWDCX-D2C8J-H872K-2YT43slmgr /skms kms.x ...

  8. Hadoop Configuration

    Configuration的主要是加载配置文件,并储存在properties中. 细节内容不重复了,主要参考Hadoop技术内幕,Hadoop源代码,以及: http://blog.csdn.net/ ...

  9. Brackets sequence

    题意: 给你一个括号序列(有中小括号),求出以给定序列为子序列的最小合法括号序列. 分析: 非常经典,以前做过相似一道题,用区间dp,但怎么把这个序列求出来没想出来. dp[i][j]表示区间i-j是 ...

  10. HDU-4632 http://acm.hdu.edu.cn/showproblem.php?pid=4632

    http://acm.hdu.edu.cn/showproblem.php?pid=4632 题意: 一个字符串,有多少个subsequence是回文串. 别人的题解: 用dp[i][j]表示这一段里 ...