源代码: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);
三.自定义的消息;
分享到:
相关推荐
单文档多视图拆分窗口,mfc单文档,有treeview,formview,listview
一个MFC拆分窗口的示例,将一个单文档拆分为两个 点击左边的窗口可以为右边窗口加入图片
写了一个窗口分割的例子。是在单文档中,分割为一个视图,一个对话框,还有一个Edit。
使用VS2015写的MFC子窗口与父窗口之间消息的传递,可以直接执行
运用MFC框架 在主框架中一分为二,其中一个窗口用于显示列表信息,是一个基于listview的视窗,该视窗还可以进行排序
创建好静态的拆分视图窗口后,就可能需要通过在左边的区域来实施右边区域的视图切换,来显示不同的操作界面.
基于单文档的窗口拆分。使用CSplitterWnd类。 将客户区拆分为2个窗口,双击中间的拆分栏实现显示或隐藏的功能。
MFC实现窗口查看器 MFC实现窗口查看器MFC实现窗口查看器 MFC实现窗口查看器
MFC下完成子窗口与父窗口之间的额数据传递,MFC版本vs2017
实现功能:将单文档的MFC项目窗口,划分分左右两个部分,左侧为可视化控件窗口,右侧为绘图窗口 运行环境:Windows10 64位,VC++6.0,MFC架构 使用方法:将其中的Test02文件夹整个解压到某一目录下,双击打开其中的...
[罗振辉]MFC中类与类之间参数交换方式[罗振辉]MFC中类与类之间参数交换方式[罗振辉]MFC中类与类之间参数交换方式
MFC父窗口嵌子窗口实现垂直滚动条,子窗口超过客户区时自动添加滚动条
MFC编程,一个对话框程序,多线程之间通过消息传递数据。
MFC和Java之间的数据交换,相当有用哦,哈哈
mfc窗口固定大小
本代码 根据两个BMP位图 建立了一个 自定义的MFC窗口, 程序运行后 只显示一架漂亮的直升机(镂空的), 鼠标点击直升机区域能拖动窗口, 下载绝不后悔!
TeamGoMfc_MFC异形窗口_mfc异形窗口VC++关键代码_MFC异性窗口_zerou3j_源码.rar
此工程实现了MFC窗口控件随窗口大小进行自适应,封装了WidgetResize类用来调整控件大小位置,非常好用。