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成员函数,编辑代码如下:
- 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, //行数
- 2); //列数
- //为第1个窗格产生视图
- m_splitterWnd.CreateView(0,0,
- RUNTIME_CLASS(CLeftView),
- CSize(rect.Width()/4,rect.Height()),
- pContext);
- //为第2个窗格产生视图
- m_splitterWnd.CreateView(0,1, //窗格的行、列序数
- RUNTIME_CLASS(CSplitterWndDemoView),//视图类
- CSize(rect.Width()-rect.Width()/5,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);
三.自定义的消息;
from:http://blog.csdn.net/nupt123456789/article/details/7455471
MFC拆分窗口及它们之间的数据交换的更多相关文章
- MFC拆分窗口及它们之间的数据交换(转)
转自:http://blog.csdn.net/nuptboyzhb/article/details/7455471 源代码:http://download.csdn.net/detail/nuptb ...
- Android:Activity+Fragment及它们之间的数据交换.
Android:Activity+Fragment及它们之间的数据交换 关于Fragment与Fragment.Activity通信的四种方式 比较好一点的Activity+Fragment及它们之间 ...
- Android Fragment与Activity之间的数据交换(Fragment从Activity获取数据)
Fragment与Activity之间的数据交换,通常含有3: 一.Fragment从Activity获取数据(仅本文介绍了一个第一): 两.Activity从Fragment获取数据: 三.Frag ...
- [转]Android:Activity+Fragment及它们之间的数据交换(一)
2014-05-18 来源:Android:Activity+Fragment及它们之间的数据交换(一) 简介: 为什么要用Fragment?使用Fragment可以在一个Acti ...
- Android:Activity+Fragment及它们之间的数据交换(一)
简单介绍: 为什么要用Fragment?使用Fragment能够在一个Activity中实现不同的界面. Fragment与Fragment之间的动画切换,远比Activity与Activity之间的 ...
- Flink task之间的数据交换
Flink中的数据交换是围绕着下面的原则设计的: 1.数据交换的控制流(即,为了启动交换而传递的消息)是由接收者发起的,就像原始的MapReduce一样. 2.用于数据交换的数据流,即通过电缆的实际数 ...
- OpenCV学习(6) 文件和Mat之间的数据交换
有时候为了便于调试算法,我们需要从文本文件或二进制文件中读取数据,并把数据放到相应的矩阵中去.我们通常可以通过下面的函数实现. 1.从二进制文件中读取数据. 新建一个txt文 ...
- Android两个Activity之间的数据交换
1. 不带数据 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceS ...
- Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger
本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是Coun ...
随机推荐
- ThinkPHP - 登录流程
数据库: /* Navicat MySQL Data Transfer Source Server : 本地连接 Source Server Version : 50710 Source Host : ...
- C++,对象成员的访问
成员变量和成员函数的访问可以采用以下几种访问方式:对象.成员变量名: 对象.成员函数名(实参列表)对象的指针->成员变量名; 对象的指针->成员函数名(实参列表)对象的引用.成员变量名对象 ...
- 内核printk打印等级
为了确认内核打印等级以及prink 参数对打印的分级,在led驱动初始化代码[以及exit出口]加入如下代码. 每次insmod .rmmod led模块时,根据打印等级的设置,得到不同的打印结果: ...
- maven 构建web项目index.jsp报错
The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path... 解决 ...
- vim 小技巧总结
1.v+移动光标可以选中文本. 2.y可以复制已经选中的文本 3.p可以粘贴 复制一行则:yy 复制当前光标所在的位置到行尾:y$ 复制当前光标所在的位置到行首:y^ 复制三行则:3yy,即从当前光标 ...
- 打工心态废掉了很多人,包括你吗?(你把现在这家公司的业务都弄清楚、弄懂了吗?君子报仇十年不晚!不离不弃!)good
我只拿这点钱,凭什么去做那么多工作,我傻呀. 我为公司干活,公司付我一份报酬,等价交换而已,我不欠谁的. 我只要对得起这份薪水就行了,多一点我都不干,做了也白做. 工作嘛,又不是为自己干,说得过去就行 ...
- ASP.NET MVC 5 学习教程:添加视图
原文 ASP.NET MVC 5 学习教程:添加视图 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 通过控 ...
- 修复ubuntu播放wmv等视频没有声音问题
1. Mplayer or SMplayer 1.1 原因: 很可能是你没有安装 w32codes 1.2 解决方法: (1)下载 w32codes 官方站点 all-20110131.tar.bz2 ...
- 动态规划之插头DP入门
基于联通性的状态压缩动态规划是一类非常典型的状态压缩动态规划问题,由于其压缩的本质并不像是普通的状态压缩动态规划那样用0或者1来表示未使用.使用两种状态,而是使用数字来表示类似插头的状态,因此.它又被 ...
- 由于物化视图定义为on commit导致update更新基表慢的解决方案
由于物化视图定义为on commit导致update更新基表慢的解决方案 以下是模拟和解决测试过程: (模拟update慢的过程) 1.首先基于基表创建物化视图日志: create materiali ...