单文档视图分割实现了,但是视图间通信不成功!希望高手指点视图间的通信实现方式!
视图被我成功分割为3块,但是视图间的通信失败!无法实现相互访问成员函数和成员变量!!希望高手给出详细的实现方式!!
目前我在一个视图中的成员函数使用网上介绍的方式
void CLineView::OnBtnTree()
{
// TODO: Add your control notification handler code here
CMainFrame* pMainFrame = (CMainFrame*)this->GetParent();
CInfoView* pView = (CInfoView*)pMainFrame->m_wndSplitter1.GetPane(0,0);
pView->Test();
}
结果运行到获取pView的指针时错误!希望高手指点错误的原因或者详细可行的实现方式!
视图被我成功分割为3块,但是视图间的通信失败!无法实现相互访问成员函数和成员变量!!希望高手给出详细的实现方式!!
目前我在一个视图中的成员函数使用网上介绍的方式
void CLineView::OnBtnTree()
{
// TODO: Add your control notification handler code here
CMainFrame* pMainFrame = (CMainFrame*)this->GetParent();
CInfoView* pView = (CInfoView*)pMainFrame->m_wndSplitter1.GetPane(0,0);
pView->Test();
}
结果运行到获取pView的指针时错误!希望高手指点错误的原因或者详细可行的实现方式!
解决方案 »
- vc与数据库问题 帮个忙谢谢了
- 前段时间在灌水区玩的太多了,要回来重新学点东西了,顺便放点分
- 求助,XML中cloneNode方法的问题
- CPropertySheet接收什么消息后关闭自己?如何屏蔽?
- 关于 *.dsp 的问题,请指教!谢谢!在线等!
- win32 SDK 下怎么改变 Dialog 中 static text 的字体
- 在vc++中是不是所有的类的实例都可以作为对象返回?我自己做的CAdoRecordSet怎么就返回不哪?
- installshield developer 7.02 + east language pack 制作的安装程序中文就巨丑,字体太大了(英文的就很好),怎么解决?分数最多给两人
- 你觉得我国共享软件开发有什么问题?欢迎参加我们的讨论http://times-china.51.net
- delphi好还是vc好,或者说哪个应用更广泛~~
- 如何制作圆角窗口?
- 怎样实现xp干干净净的重启?
主框架中定义:CSplitterWnd m_wndSplitter;
定义两个View类:CView1、CView2
框架类中重载:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT, CCreateContext* pContext)
{
VERIFY(m_splitter.CreateStatic(this,2,1)); //分割成两行一列
VERIFY(m_splitter.CreateView(0,0,RUNTIME_CLASS(CView1),CSize(100,100),pContext));
VERIFY(m_splitter.CreateView(1,0,RUNTIME_CLASS(CView2),CSize(100,100),pContext));
return TRUE;
}
获取分割视图指针CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
CView1* pView1 = (CView1*) pMainFrame->m_wndSplitter.GetPane(0,0);
CView2* pView2 = (CView2*) pMainFrame->m_wndSplitter.GetPane(1,0);
* 标 题 : 使用VC6.0实现窗口的任意分割 *
* 用 途 : *
* 整 理 人: ffww *
* 整理日期: 2006-12-11 9:18:42 *
* 附 注: ★★★ *
*************************************************/
一、关于CSplitterWnd类
1、用来创建动态切分窗口
BOOL Create(CWnd* pParentWnd,int nMaxRows,int nMaxCols,SIZE sizeMin,CCreateContext* pContext,DWORD dwStyle,UINT nID);
2、用来创建静态切分窗口
BOOL CreateStatic(CWnd* pParentWnd,int nRows,int nCols,DWORD dwStyle,UINT nID)
3、为静态切分的窗口的网格填充视图
BOOL CreateView (int row,int col,CruntimeClass* pViewClass,SIZE sizeinit,CcreateContext* pContext);
4、参数说明
pParentWnd 切分窗口的父框架窗口。
nMaxRows,nMaxCols是创建的最大的列数和行数。
sizeMin是窗格的现实大小。
pContext 大多数情况下传给父窗口。
nID是字窗口的ID号.
二、创建嵌套分割窗口
1、动态分割窗口
动态分割窗口使用Create方法,例:m_wndSplitter.Create(this,2,2,CSize(100,100),pContext); 但是一般不使用动态分割,不实用
2、静态分割窗口(适用于SDI、MDI程序)
1)创建单文档ww,生成的视类为CWwView,从CFormView继承,在增加3个视类或者从视类继承而来的派生类CView2、CView3
2)在框架类CMainFrame的.cpp文件中加入头文件,并在CWwView类定义前加上class CWwDoc;
#include "view2.h"
#include "view3.h"
#include "wwView.h" //注意这里,必须在CWwView类定义前加上class CWwDoc;否则编译3条错误
3)在框架类CMainFrame中增加成员:
CSplitterWnd m_wndSplitter1;
CSplitterWnd m_wndSplitter2;
4)利用ClassWizard重载CMainFrame::OnCreateClient()函数
//----------------------------------------------------------------------------------------------
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
//创建一个1行2列
m_wndSplitter1.CreateStatic(this,1,2);
//将CWwView连接到0行0列窗格上
m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CWwView),CSize(100,100),pContext);
//将窗口右边再分开2行1列
m_wndSplitter2.CreateStatic(&m_wndSplitter1,2,1,WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0, 1));
m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),CSize(100,100),pContext);
m_wndSplitter2.CreateView(1,0,RUNTIME_CLASS(CView3),CSize(100,100),pContext); return TRUE;
}
//----------------------------------------------------------------------------------------------
注意:
① 必须为每个静态切分窗格创建视图窗口,不能漏掉一个;
② 如果从一个CformView类继承的视类,此对话框要作如下设置
style=Child
Border=None
Visible=不选中
② 若在CWwView窗口上放入一TreeCtrl,为了在改变窗口时随窗口大小而改变(类似CB中的居中),可以在CWwView类的WM_SIZE中添加代码如下:
//------------------------------------------------------------
void CWwView::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if (GetSafeHwnd())
{
CRect rect;
GetClientRect(&rect);
if (m_TreeCtrl.GetSafeHwnd())
m_TreeCtrl.MoveWindow(&rect);
}
}
//------------------------------------------------------------
//在WM_ONINITALUPDATE消息中,添加初始化数据
void CWwView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
//上面的代码不用管,是啥就是啥,
m_TreeCtrl.InsertItem("ListCtrl View", 1, 1);
m_TreeCtrl.InsertItem("EditCtrl View", 2, 2);}三、实现各个分割区域的通信
点击Button1按钮,在CView2中显示文字
1、在CWwView的.cpp文件中加入:
#include "view2.h"
#include "MainFrm.h"
2、添加按钮代码:
//----------------------------------------------------------------------------------------------
void CWwView::OnButton1()
{
//得到一SplitterView的指针
CView2 *pView=(CView2*)(((CMainFrame*)AfxGetMainWnd())->m_wndSplitter2.GetPane(0,0));
//定义View的DC
CClientDC dc(pView);
dc.MoveTo(10,10);
dc.LineTo(10,100);
dc.TextOut(10,10,"m_wndSplitter2的0行0列就是CView2");
}
//----------------------------------------------------------------------------------------------