MFC拆分窗口及它们之间的数据交换[转]

源代码: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成员函数,编辑代码如下:

 1 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
 2
 3 {
 4
 5 // TODO: Add your specialized code here and/or call the base class
 6
 7 //获得主窗口的大小
 8
 9 CRect rect;
10
11 GetClientRect(&rect);
12
13 //产生第一次静态切分
14
15 m_splitterWnd.CreateStatic(this, //父窗口指针
16
17                                                                    1,    //行数
18
19                                                                    2);   //列数
20
21 //为第1个窗格产生视图
22
23 m_splitterWnd.CreateView(0,0,
24
25            RUNTIME_CLASS(CLeftView),
26
27            CSize(rect.Width()/4,rect.Height()),
28
29            pContext);
30
31
32 //为第2个窗格产生视图
33
34 m_splitterWnd.CreateView(0,1,  //窗格的行、列序数
35
36            RUNTIME_CLASS(CSplitterWndDemoView),//视图类
37
38            CSize(rect.Width()-rect.Width()/5,rect.Height()),//初始化大小
39
40            pContext);//父窗口的创建参数
41
42 return TRUE;//不再调用基类的OnCreateClient函数
43
44 //return CFrameWnd::OnCreateClient(lpcs, pContext);
45
46 }

注意:要添加头文件

#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);

三.自定义的消息;

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

MFC拆分窗口及它们之间的数据交换[转],布布扣,bubuko.com

时间: 2024-10-23 15:27:59

MFC拆分窗口及它们之间的数据交换[转]的相关文章

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

2014-05-18         来源:Android:Activity+Fragment及它们之间的数据交换(一)   简介: 为什么要用Fragment?使用Fragment可以在一个Activity中实现不同的界面.Fragment与 Fragment之间的动画切换,远比Activity与Activity之间的动画切换变化方式多.很多时候,我们通过使用一个Activity,切换 多个Fragment.本次博客,主要列举一下Fragment与它的Activity之间进行数据交换的方式.

单臂路由器实现不同vlan之间的数据交换

实验名称:通过单臂路由实现不同vlan间的通信 实验拓扑: 实验步骤: (1)      给交换机配置vlan并将接口分别加入vlan (2)      配置路由器 (3)      验证两个vlan之间的通信 总结:就是在给路由器的子接口配置ip地址前,一定要对子接口进行vlan数据的封装,否则无法识别该vlan数据对应的哪个子接口的IP地址. 单臂路由器实现不同vlan之间的数据交换,布布扣,bubuko.com

Flink中task之间的数据交换机制

Flink中的数据交换构建在如下两条设计原则之上: 数据交换的控制流(例如,为实例化交换而进行的消息传输)是接收端初始化的,这非常像最初的MapReduce. 数据交换的数据流(例如,在网络上最终传输的数据)被抽象成一个叫做IntermediateResult的概念,它是可插拔的.这意味着系统基于相同的实现逻辑可以既支持流数据,又支持批处理数据的传输. 数据传输包含多个对象,它们是: JobManager master节点,用于响应任务调度.恢复.协作,以及通过ExecutionGraph数据结

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

简介: 为什么要用Fragment?使用Fragment可以在一个Activity中实现不同的界面.Fragment与Fragment之间的动画切换,远比Activity与Activity之间的动画切换变化方式多.很多时候,我们通过使用一个Activity,切换多个Fragment.本次博客,主要列举一下Fragment与它的Activity之间进行数据交换的方式. 1.Fragment中通过getActivity()然后进行强制转化,调用Activity中的公有方法 ((XXXXActivit

Android两个Activity之间的数据交换

1. 不带数据 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); next=(Button)findViewById(R.id.next); next.setOnClickListener(new Button.OnClickListener() { @Override

java中的线程协调与线程间的数据交换

Java中提供多种方式协调线程的工作. CountDownLatch:当多个也就是具体的数量等于CountDownLatch初始化参数的时候.线程达到了预期状态或者完成了预期工作时触发事件,其他线程可以等待这个事件来触发自己的后续工作.等待的线程是多个.达到了预期状态的线程会调用CountDownLatch的countDown方法.等待的线程会调用CountDownLatch的await方法. import java.util.concurrent.CountDownLatch; import

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

本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是CountDownLatch? 倒计时计数器,调用CountDownLatch对象的CountDown()方法就将计数器减一,当计数到达0时,则所有等待者或者全部等待者开始执行. 2.如何用? new CountDownLatch(1); 直接new,其构造函数必须传一个int类型的参数,参数的意思是: c

并发库应用之十 & 多线程数据交换Exchanger应用

申明:用大白话来说就是用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人会一直等待第二个人,直到第二个人拿着数据到来时,才能彼此交换数据. java.util.concurrent.Exchanger<V> V 表示可以交换的对象类型 对应构造方法摘要: Exchanger()    创建一个新的 Exchanger 方法摘要: V  exchange(V v)       等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程

物理隔离与数据交换-网闸的设计原理

一.什么是网闸 网闸技术的需求来自内网与外网数据互通的要求,比如政府的电子政务是对公众服务,与互联网连通,而内网的政府办公网络,由于保密的要求,内网若与网连通,则面临来自公网的各种威胁.安全专家给出的建议是:由于目前的安全技术,无论防火墙.UTM等防护系统都不能保证攻击的一定阻断,入侵检测等监控系统也不能保证入侵行为完全捕获,所以最安全的方式就是物理的分开,所以在公安部的技术要求中,要求电子政务的内.外网络之间"物理隔离".没有连接,来自外网对内网的攻击就无从谈起. 但是,网络的物理隔