mfc窗口分割,MFC视图切换大全总计

By admin in 编程 on 2019年8月27日

MFC视图切换大全总计,mfc视图大全

只有视图之间的切换

单文书档案多视图切换是本身在上学MFC中相见的三个老灾荒难题,在明日终于是逐个破解了。作者认为视图切换分为几个级次,第一是在未切分窗格的意况下切换视图类;第二是在划分窗格的一个窗格内施行视图切换;第三是在分割窗格和未分割之间的切换和视图切换。

在MFC创设SDI的前奏,MFC暗许的视图类是CView,假诺CView满足你的需求,能够直接单击finish,借使您不想让CView成为您的默许视图类,你可以在下图那些地点修改。

倘令你忘记了修改私下认可的视图类那也没提到,大家得以在代码中更动:

在App类里面有个函数叫InitInstance(),当中有一段代码

CSingleDocTemplate* pDocTemplate; 
pDocTemplate = new CSingleDocTemplate( 
IDR_MAINFRAME, 
RUNTIME_CLASS(Cprogram8Doc), 
RUNTIME_CLASS(CMainFrame), 
RUNTIME_CLASS(CView1));
//这里更动你的私下认可视图类,注意不要遗忘包罗头文件哦 
if (!pDocTemplate) 
return FALSE; 
AddDocTemplate(pDocTemplate);

说完了私下认可视图类的改观,大家明日进来正题。

1、首先创造你供给切换的视图类,AddClass步入也许创设一个控件然后AddClass创建控件关联类,前者适用于Form之类的控件。

2、调控之处,比方菜单项单击、单击鼠标什么的,作者是采纳菜单项来切换窗口的

void CMainFrame::OnView1() 

// TODO: Add your command handler code here

SwitchToForm(IDD_FORMVIEW1);

}

void CMainFrame::OnView2() 

// TODO: Add your command handler code here

SwitchToForm(IDD_FORMVIEW2);

}

3、SwitchToForm那么些函数首要用来视图切换

在那么些函数中重要做以下多少个动作:

1、得到当前视图类指针和内需改换的视图类指针,就算是首先次选择必要New四个,并且与文书档案类关联;

2、更改活动视图;

3、展现新视图和遮掩旧视图;

4、设置控件ID;

5、调治框架视图。

void CMainFrame::SwitchToForm(int nForm) 

CView *pOldActiveView=GetActiveView(); //1 
CView *pNewActiveView=(CView*)GetDlgItem(nForm); 
if(NULL==pNewActiveView) 

switch(nForm) 

case IDD_FORMVIEW1: 
pNewActiveView=(CView*)new CView1; 
break; 
case IDD_FORMVIEW2: 
pNewActiveView=(CView*)new CView2; 
break; 
case IDD_FORMVIEW3: 
pNewActiveView=(CView*)new CView3; 
break; 
case IDD_FORMVIEW4: 
pNewActiveView=(CView*)new CView4; 
break; 
default: 
break; 

CCreateContext context; 
context.m_pCurrentDoc=pOldActiveView->GetDocument(); 
pNewActiveView->Create(NULL,NULL,WS_CHILD |
WS_BORDER,CFrameWnd::rectDefault,this,nForm,&context); 
pNewActiveView->UpdateData(); 

SetActiveView(pNewActiveView); //2 
pNewActiveView->ShowWindow(SW_SHOW); //3 
pOldActiveView->ShowWindow(SW_HIDE); 
if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CView1)) //4 
pOldActiveView->SetDlgCtrlID(IDD_FORMVIEW1); 
else if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CView2)) 
pOldActiveView->SetDlgCtrlID(IDD_FORMVIEW2); 
else if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CView3)) 
pOldActiveView->SetDlgCtrlID(IDD_FORMVIEW3); 
else if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CView4)) 
pOldActiveView->SetDlgCtrlID(IDD_FORMVIEW4); 
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST); 
RecalcLayout(); //5 

在看网络其余人的帖子的时候发现在RecalcLayout(); 前边还要加一句delete
pOldActiveView;小编自身感觉这么有个别浪费能源,视图类创立完毕了隐形起来,用的时候重新呈现。那样的办法应该比每便使用都要创立好有的。大哥不才,有商酌的恋人可以沟通作者。

含有分割窗格的视图切换

切换视图第二层正是带有分割窗格的视图切换

分开窗格的视图切换,作者感觉难题是不易于在点滴区域张开视图切换。

1、首先划分窗格,这里我没有多少解释,详细情况看下边链接;

2、再给各种视图二个唯一的ID号;

m_splitter.CreateStatic(this,1,2); 
m_splitter.CreateView(0,0,RUNTIME_CLASS(CTree1),CSize(100,100),pContext); 
m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm1),CSize(100,100),pContext); 
CWnd *pWnd=m_splitter.GetPane(0,1); 
m_pViews[0]=(CView*)m_splitter.GetPane(0,1); 
pWnd->SetDlgCtrlID(IDD_FORM1); 
pWnd->ShowWindow(SW_HIDE); 
m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm2),CSize(100,100),pContext); 
pWnd=m_splitter.GetPane(0,1); 
m_pViews[1]=(CView*)m_splitter.GetPane(0,1); 
pWnd->SetDlgCtrlID(m_splitter.IdFromRowCol(0,1)); 
pWnd->ShowWindow(SW_SHOW); 
RedrawWindow(); 
return true;

注:笔者那边CreateView二个新视图,就覆盖掉前一个视图,最后展现的是终极二个视图,前边的视图只是遮蔽起来,等到运用的时候显得出来就好了。重回值要覆盖再次回到到基类的语句return
CFrameWndEx::OnCreateClient(lpcs, pContext);将那句话表明,然后return
true;

3、在哪个地方激活切换功用谐和设计,笔者利用的是菜单;

4、响应首要回顾上边几个步骤:

1、首先获得窗格中的当前视图;

2、使用IsKindOf剖断这一个类是不是是将在切换来的类;

3、获得框架长度宽度和窗格长度宽度;

CView *pView=(CView*)m_splitter.GetPane(0,1); //1 
m_bTest=pView->IsKindOf(RUNTIME_CLASS(CForm2)); //2 
CRect rcFrame,rcClient; //3 
m_splitter.GetClientRect(&rcClient); 
GetClientRect(&rcFrame);

地点的全方位是计划专业,上边才是真正的切换;

4、删除原有视图

5、创设当前视图

6、调解框架

if(m_bTest) 

m_splitter.DeleteView(0,1); 
m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm1),CSize(rcClient.Width(),rcFrame.Height()),NULL); 
m_splitter.RecalcLayout(); 

else 

m_splitter.DeleteView(0,1); 
m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm2),CSize(rcClient.Width(),rcFrame.Height()),NULL); 
m_splitter.RecalcLayout(); 
}

留神一看,貌似那一个还要比单独视图切换还要轻易一些,那也不可能,CSplitterWnd提供了这么八个便当的措施。

带分割视图与未分割视图之间的切换

这几个是三部曲中本人以为最难的,并非说程序有多么难,只是想到这么些切分方式真正不轻易,明天就把那三部曲的尾声一曲分享给我们,也为互连网做一点进献。

首先说一下顺序的讨论,为划分窗口层特地独立创立三个依照CFrameWnd的类,然后在这里面写分割视图的代码,再与其他未分割的视图类实行切换。

上边大家来看一下落到实处的经过:

1、成立三个根据CFrameWnd的派生类CSplitterFrame;

2、增加要填丰富割窗口的视图类和与区划视图切换的视图类;

3、为那几个派生类重载OnCreateClient函数,构造分割视图

m_Splitter.CreateStatic(this,1,2); 
m_Splitter.CreateView(0,0,RUNTIME_CLASS(CLeftTree),CSize(300,0),pContext); 
m_Splitter.CreateView(0,1,RUNTIME_CLASS(CRightList),CSize(300,0),pContext); 
return true;

这里笔者不说明了,想必大家都很熟知了,这里本人要说一点小编自身犯过的谬误。小编当然想在此处GetClientRect获得窗口大小,但前功尽弃了,费尽脑筋不明了,后来才发掘,那又不是CMainFrame,所以根本不能够博得,若是用API函数。

4、在CMainFrame类里面增加框架和视图类指针变量

CSplitterFrame *m_pSplitterFrame; //分割视图框架指针 
CView *m_pView; //单独视图类,基于CView类 
CView *m_pForm; //单独视图类,基于CFormView类 
int m_nCurrentID; //记录当前视图

5、在CMainFrame类里面重载OnCreateClient函数,创立视图及分割框架

CRect rcClient; 
GetClientRect(&rcClient); 
m_pView=new CViewShow; 
m_pView->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW
&~WS_BORDER,rcClient,this,NULL,pContext); 
m_pView->ShowWindow(SW_SHOW); 
m_pView->SetDlgCtrlID(AFX_IDW_PANE_FIRST); 
pContext->m_pNewViewClass=(CRuntimeClass*)m_pView;
//设置默许视图类 
m_pForm=new CFormShow; 
m_pForm->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW
&~WS_BORDER,rcClient,this,IDD_FORMSHOW,pContext); 
m_pForm->ShowWindow(SW_HIDE); 
m_pSplitterFrame=new CSplitterFrame; 
m_pSplitterFrame->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW
&~WS_BORDER,rcClient,this,NULL,0,pContext); 
m_pSplitterFrame->ShowWindow(SW_HIDE); 
return true;

6、创制视图切换函数

bool CMainFrame::Switch(int nID) 

if(nID==m_nCurrentID) 
return false; 
switch(nID) 

case IDD_FORMSHOW: 
m_pForm->ShowWindow(SW_SHOW); 
m_pForm->SetDlgCtrlID(AFX_IDW_PANE_FIRST); 
m_pView->ShowWindow(SW_HIDE); 
m_pView->SetDlgCtrlID(AFX_IDW_PANE_FIRST+2); 
m_pSplitterFrame->ShowWindow(SW_HIDE); 
m_pSplitterFrame->SetDlgCtrlID(AFX_IDW_PANE_FIRST+1); 
m_nCurrentID=IDD_FORMSHOW; 
break; 
case AFX_IDW_PANE_FIRST+1: 
m_pSplitterFrame->ShowWindow(SW_SHOW); 
m_pSplitterFrame->SetDlgCtrlID(AFX_IDW_PANE_FIRST); 
m_pForm->ShowWindow(SW_HIDE); 
m_pForm->SetDlgCtrlID(IDD_FORMSHOW); 
m_pView->ShowWindow(SW_HIDE); 
m_pView->SetDlgCtrlID(AFX_IDW_PANE_FIRST+2); 
m_nCurrentID=AFX_IDW_PANE_FIRST+1; 
break; 
case AFX_IDW_PANE_FIRST+2: 
m_pView->ShowWindow(SW_SHOW); 
m_pView->SetDlgCtrlID(AFX_IDW_PANE_FIRST); 
m_pForm->ShowWindow(SW_HIDE); 
m_pForm->SetDlgCtrlID(IDD_FORMSHOW); 
m_pSplitterFrame->ShowWindow(SW_HIDE); 
m_pSplitterFrame->SetDlgCtrlID(AFX_IDW_PANE_FIRST+1); 
m_nCurrentID=AFX_IDW_PANE_FIRST+2; 
break; 
default: 
break; 

RecalcLayout(); 
return true; 
}

7、成立调用方法

void CMainFrame::OnForm() 

// TODO: Add your command handler code here 
Switch(IDD_FORMSHOW); 

void CMainFrame::OnView() 

// TODO: Add your command handler code here 
Switch(AFX_IDW_PANE_FIRST+2); 

void CMainFrame::OnSplitter() 

// TODO: Add your command handler code here 
Switch(AFX_IDW_PANE_FIRST+1); 
}

单纯视图之间的切换
单文书档案多视图切换是自己在攻读MFC中蒙受的二个老患难问题,在明天终于是一一破解…

窗口分割,mfc窗口分割

 大家在利用OutLook恐怕NetAnt等工具的时候,一般都会被其复杂的分界面所吸引,在那一个分界面中窗口被细分为多少的区域,真正造成了窗口的自由分割。
那么大家团结如何创建类似的分界面,也促成窗口的私行的分开呢?要消除这些题目,在Visual
C++6.0编制程序中就供给利用到MFC提供的CSplitterWnd类。CSplitterWnd看上去疑似一种极度的框架窗口,每种窗口都被同一的或然区别的视图所填充。当窗口被切分后客商可以行使鼠标移动切分条来调解窗口的相对尺寸。即使VC6.0帮忙从AppWizard中创建分割窗口,可是机关步向的划分条连接无法让咱们满足,由此大家照旧经过手工业扩充代码来领会那一个类。本实例接纳多模板形式,即落到实处了窗口的私行分割,又介绍了逐个视图如何互相通讯。程序编写翻译运营后的分界面效果如图一所示:

图一、窗口大六分割效果图 

  一、完毕格局

  Visual
C++中MFC提供了CSplitterWnd类来完结窗口的分开,它的构造函数主要回顾上面八个:

BOOL Create(CWnd* pParentWnd,int nMaxRows,int nMaxCols,SIZE sizeMin,
CCreateContext* pContext,DWORD dwStyle,UINT nID); 

  该函数用来成立动态切分窗口,参数pParentWnd表示切分窗口的父框架窗口;参数nMaxRows,n马克斯Cols是创办切分窗口的最大列数和行数;sizeMin是窗格的相当小尺寸;参数pContext
大多数状态下传给父窗口;nID是切分窗口的ID号。比方下面的代码将创立2×2的窗格。

m_wndSplitter.Create(this,2,2,CSize(100,100),pContext); 

  动态成立的剪切窗口的窗格数目无法超过2×2,何况对于具备的窗格,都必需分享同叁个视图,所受的界定也正如多,由此大家不将动态创立作为主要。大家的要害精力放在静态分割窗口的制造上。

BOOL CreateStatic(CWnd* pParentWnd,int nRows,int nCols,DWORD
dwStyle,UINT nID) ; 

  该函数用来用来创设切静态分窗口,参数含义同上。

BOOL CreateView (int row,int col,CruntimeClass* pViewClass,SIZE 
sizeinit,CcreateContext* pContext); 

  此函数向静态切分的窗口的网格填充视图。在将视图于切分窗口联系在一齐的时候必需先将切分窗口创设好。参数含义同上。与动态创制比较,静态成立的代码要简明比很多,并且能够最多创建16×16的窗格。区别的窗格大家得以行使CreateView()函数来填充不一样的视图。如若大家要创制类似CuteFtp程序的窗口分割,CuteFtp的细分状态如下:

CCuteFTPView
CView2 CView3
CView4

  那么在开立在此以前大家必须先用AppWizard生成单文书档案CuteFTP,生成的视类为
CCuteFTPView。同有时候在扩展四个视类大概从视类承继而来的派生类CView2,CView3
CView4,然后在CMainfrm.h中加进下边包车型地铁代码:

CSplitterWnd wndSplitter1;
CSplitterWnd wndSplitter2; 

  为了兑现拆分窗口,供给重载CMainFrame::OnCreateClient()函数,具体代码如下:

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

 //成立三个静态分栏窗口,分为三行一列
 if(m_wndSplitter1.CreateStatic(this,3,1)==NULL)
  return FALSE;
 //将CCuteFTPView连接到0行0列窗格上
 m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CCuteFTPView),CSize(100,100),
pContext); 
 m_wndSplitter1.CreateView(2,0,RUNTIME_CLASS(CView4),CSize(100,100),pContext); 
 //将CView4连接到2行0列
 if(m_wndSplitter2.CreateStatic(&m_wndSplitter,1,2,WS_CHILD|WS_VISIBLE,
m_wndSplitter.IdFromRowCol(1, 0))==NULL)
  return FALSE; //将第1行0列再分别1行2列
 //将CView2类连接到第贰个分栏对象的0行0列
 m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),CSize(400,300),pContext);
 //将CView3类连接到第贰个分栏对象的0行1列
 m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CView3),CSize(400,300),pContext);
 return TRUE;

  在应用程序中拆分窗口后,还应该有三个重要的做事就是贯彻各样视图之间的数额通信,有二种艺术消除那几个主题素材,一是行使公用的文书档案;二是行使程序的主框架。为了表明难题,大家让CCuteFTPView、CView2通过文书档案来贯彻通讯,CView3、CView4通过主框架来通讯。对于第一种格局,由AppWizard生成的CCuteFTPView是与文书档案相连的,同不常候我们也让CView2与文书档案相连,由此大家要求修改CCuteFTPApp的InitInstance()函数,扩大下边包车型地铁代码:

AddDocTemplate (new CMultiDocTemplate(IDR_VIEW2TYPE,
RUNTIME_CLASS(CMainDoc),
RUNTIME_CLASS(CMDIChildWnd), RUNTIME_CLASS(CView2))); 

  然后大家重载
CDocument::OnOpenDocument()函数;在该函数中定义如下变量:CCuteFTPView*
pCuteFTPView、CView2* pView2、POSITION pos,并丰硕如下代码:

pos=GetFirstViewPosition( )
while(pos!=NULL)
{
 pView=GetNextView(pos);
 if(pView->IsKindOf(RUNTIME_CLASS(CCuteFTPView))==NULL)
  pCuteFTPView=(CCuteFTPView*)pView;
 else
  pView2=(CView2*)pView; 

  那样咱们在文书档案类中就获的了跟它不独有的兼具的视图的指针。倘诺供给在
CCuteFTPView中调用CView第22中学的二个方法DoIt()则代码如下: 

CCuteFTPDoc* pDoc=GetDocument();
CView2* pView2=pDoc->pView2;
pView3.DoIt(); 

  CView3和CView4都以不与文书档案相关联的。怎么着落到实处他们之间的通讯呢。
正如大家在地方所说的那样,由于在主框架中大家得以访谈放肆的视图,因而大家的机要职责照旧在前后相继中获得主框架的指针。比如上面包车型客车代码完结在CView3中访谈CView4中的方法DoIt()。

CMainFrame*
MainFrame=(CMainFrame*)this->GetParent()->GetParent();
CView4* View4=(CView4*)MainFrame->m_wndSplitter1.GetPane(2,0);
View4->DoIt(); 

  为了更加好地强化读者朋友对上述剧情的知情,本实例通过灵活运用上述拆分窗口的点子,在多文档视图模板的基本功上,完结了窗口的轻巧拆分,举个例子当客商在右臂视图InPutView中输入字符串、选拔颜色后,能马上反映到侧面的CCorlorView、CtextView窗口中。 
  二、编制程序步骤

  1、运维Visual
C++6.0生成多少个多文书档案应用程序Viewex,并加上支持分割的逐一视图类;

  2、修改CViewExApp::InitInstance()函数,为应用程序添增添文书档案视图结构模板的支撑;

  3、加多代码,编写翻译运营程序。

  三、编制程序步骤

////////////////////////////////////////////////
BOOL CViewExApp::InitInstance()
{
 …………………………… 
 // simple text output view
 AddDocTemplate(new CMultiDocTemplate(IDR_TEXTTYPE,
  RUNTIME_CLASS(CMainDoc),
  RUNTIME_CLASS(CMDIChildWnd),
  RUNTIME_CLASS(CTextView)));
 // simple color output view
 AddDocTemplate(new CMultiDocTemplate(IDR_COLORTYPE,
  RUNTIME_CLASS(CMainDoc),
  RUNTIME_CLASS(CMDIChildWnd),
  RUNTIME_CLASS(CColorView)));
 // form view with input
 AddDocTemplate(new CMultiDocTemplate(IDR_INPUTTYPE,
  RUNTIME_CLASS(CMainDoc),
  RUNTIME_CLASS(CMDIChildWnd),
  RUNTIME_CLASS(CInputView)));
 // splitter frame with both simple text output and form input view
 AddDocTemplate(new CMultiDocTemplate(IDR_SPLIT2TYPE,
  RUNTIME_CLASS(CMainDoc),
  RUNTIME_CLASS(CSplitterFrame),
  RUNTIME_CLASS(CTextView)));
 // 3-way splitter frame with form input, text output and color output
views
 AddDocTemplate(new CMultiDocTemplate(IDR_SPLIT3TYPE,
  RUNTIME_CLASS(CMainDoc),
  RUNTIME_CLASS(C3WaySplitterFrame),
  RUNTIME_CLASS(CInputView)));
 CMDIFrameWnd* pMainFrame = new CMDIFrameWnd;
 if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
  return FALSE;
 // Now finally show the main menu
 pMainFrame->ShowWindow(m_nCmdShow);
 pMainFrame->UpdateWindow();
 m_pMainWnd = pMainFrame;
 OnFileNew();
 return TRUE;
}

//////////////////////////////////////////CinputView类的头文件
class CInputView : public CFormView
{
 DECLARE_DYNCREATE(CInputView)
 protected:
编程,  CInputView(); // protected constructor used by dynamic creation
  // Form Data
 public:
  //{{AFX_DATA(CInputView)
   enum { IDD = IDD_INPUTFORM };
   CString m_strData;
   int m_iColor;
  //}}AFX_DATA
  // Attributes
 public:
  CMainDoc* GetDocument()
  {
   ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMainDoc)));
   return (CMainDoc*) m_pDocument;
  }
  // Operations
 public:
  // Implementation
 protected:
  virtual ~CInputView();
  virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV
support
  virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject*
pHint);
  // Generated message map functions
  //{{AFX_MSG(CInputView)
   afx_msg void OnDataChange();
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////// CInputView类落成文件
#include “stdafx.h”
#include “viewex.h”
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CInputView, CFormView)
CInputView::CInputView()
: CFormView(CInputView::IDD)
{
 //{{AFX_DATA_INIT(CInputView)
  m_strData = “”;
  m_iColor = -1;
 //}}AFX_DATA_INIT
}

CInputView::~CInputView()
{}

void CInputView::OnUpdate(CView*, LPARAM, CObject*)
{
 CMainDoc* pDoc = GetDocument();
 m_strData = pDoc->m_strData;
 if (pDoc->m_colorData == RGB(255, 0, 0))
  m_iColor = 0;
 else if (pDoc->m_colorData == RGB(0, 255, 0))
  m_iColor = 1;
 else if (pDoc->m_colorData == RGB(0, 0, 255))
  m_iColor = 2;
 else
  m_iColor = -1;
 TRACE2(“OnUpdate: m_iColor = %d ($%lx)\n”, m_iColor,
pDoc->m_colorData);
 UpdateData(FALSE); // set the data into the controls
}
/* 何问起 hovertree.com */

void CInputView::DoDataExchange(CDataExchange* pDX)
{
 CFormView::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CInputView)
   DDX_Text(pDX, IDC_EDIT1, m_strData);
   DDX_Radio(pDX, IDC_RADIO1, m_iColor);
 //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CInputView, CFormView)
 //{{AFX_MSG_MAP(CInputView)
  ON_EN_CHANGE(IDC_EDIT1, OnDataChange)
  ON_BN_CLICKED(IDC_RADIO1, OnDataChange)
  ON_BN_CLICKED(IDC_RADIO2, OnDataChange)
  ON_BN_CLICKED(IDC_RADIO3, OnDataChange)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CInputView::OnDataChange()// CInputView message handlers
{
 if (!UpdateData())
  return;
 CMainDoc* pDoc = GetDocument();
 COLORREF color = RGB(255 * (m_iColor == 0),
 255 * (m_iColor == 1),
 255 * (m_iColor == 2));
 BOOL bUpdate = FALSE;
 if (m_strData != pDoc->m_strData)
 {
  pDoc->m_strData = m_strData;
  bUpdate = TRUE;
 }
 if (color != pDoc->m_colorData)
 {
  pDoc->m_colorData = color;
  bUpdate = TRUE;
 }
 if (bUpdate)
 {
  // if the document stored data then we would call SetModifiedFlag
here
  pDoc->UpdateAllViews(this);
 }
}
/////////////////////////////////////////////////////simpvw.h文件
class CTextView : public CView
{
 protected: // create from serialization only
  CTextView();
  DECLARE_DYNCREATE(CTextView)
  // Attributes
 public:
  CMainDoc* GetDocument()
  {
   ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMainDoc)));
   return (CMainDoc*) m_pDocument;
  }
  // Operations
 public:
  // Implementation
 public:
  virtual ~CTextView();
  virtual void OnDraw(CDC* pDC); // overridden to draw this view
  // Generated message map functions
 protected:
  //{{AFX_MSG(CTextView)
   afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest,
UINT message);
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
};
class CColorView : public CView
{
 protected: // create from serialization only
  CColorView();
  DECLARE_DYNCREATE(CColorView)
  // Attributes
 public:
  CMainDoc* GetDocument()
  {
   ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMainDoc)));
   return (CMainDoc*) m_pDocument;
  }

  // Operations
 public:
  // Implementation
 public:
  virtual ~CColorView();
  virtual void OnDraw(CDC* pDC); // overridden to draw this view
  virtual void OnActivateView(BOOL bActivate, CView* pActivateView,
  CView* pDeactiveView);
  // Generated message map functions
 protected:
  //{{AFX_MSG(CColorView)
   afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest,
UINT message);
  //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};
////////////////////////////////simpvw.cpp文件;
#include “stdafx.h”
#include “viewex.h”
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////CTextView
IMPLEMENT_DYNCREATE(CTextView, CView)
BEGIN_MESSAGE_MAP(CTextView, CView)
 //{{AFX_MSG_MAP(CTextView)
  ON_WM_MOUSEACTIVATE()
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()
// CTextView construction/destruction
CTextView::CTextView()
{}

CTextView::~CTextView()
{}

void CTextView::OnDraw(CDC* pDC)
{
 CMainDoc* pDoc = GetDocument();
 CRect rect;
 GetClientRect(rect);
 pDC->SetTextAlign(TA_BASELINE | TA_CENTER);
 pDC->SetTextColor(pDoc->m_colorData);
 pDC->SetBkMode(TRANSPARENT);
 // center in the window
 pDC->TextOut(rect.Width() / 2, rect.Height() / 2,
 pDoc->m_strData, pDoc->m_strData.GetLength());
}

int CTextView::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT
message)
{
 // side-step CView’s implementation since we don’t want to activate
 // this view
 return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);
}
////////////////////////// CColorView
IMPLEMENT_DYNCREATE(CColorView, CView)
BEGIN_MESSAGE_MAP(CColorView, CView)
 //{{AFX_MSG_MAP(CColorView)
  ON_WM_MOUSEACTIVATE()
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()
// CColorView construction/destruction
CColorView::CColorView()
{}
CColorView::~CColorView()
{}

void CColorView::OnDraw(CDC* pDC)
{
 CMainDoc* pDoc = GetDocument();
 CRect rect;
 GetClientRect(rect);
 // fill the view with the specified color
 CBrush br(pDoc->m_colorData);
 pDC->FillRect(rect, &br);
}

int CColorView::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT
message)
{
 // side-step CView’s implementation since we don’t want to activate
 // this view
 return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);
}

void CColorView::OnActivateView(BOOL, CView*, CView*)
{
 ASSERT(FALSE); // output only view – should never be active
}
///////////////////////////////////////// splitter.h文件;
// CSplitterFrame frame with splitter/wiper
class CSplitterFrame : public CMDIChildWnd
{
 DECLARE_DYNCREATE(CSplitterFrame)
 protected:
  CSplitterFrame(); // protected constructor used by dynamic
creation
  // Attributes
 protected:
  CSplitterWnd m_wndSplitter;
  // Implementation
 public:
  virtual ~CSplitterFrame();
  virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext*
pContext);
  // Generated message map functions
  //{{AFX_MSG(CSplitterFrame)
  //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};

class CViewExSplitWnd : public CSplitterWnd
{
 DECLARE_DYNAMIC(CViewExSplitWnd)
 // Implementation
 public:
  CViewExSplitWnd();
  ~CViewExSplitWnd();
  CWnd* GetActivePane(int* pRow = NULL, int* pCol = NULL);
};
class C3WaySplitterFrame : public CMDIChildWnd
{
 DECLARE_DYNCREATE(C3WaySplitterFrame)
 protected:
  C3WaySplitterFrame(); // protected constructor used by dynamic
creation
  // Attributes
 protected:
  CViewExSplitWnd m_wndSplitter;
  CViewExSplitWnd m_wndSplitter2; // embedded in the first
  // Implementation
 public:
  virtual ~C3WaySplitterFrame();
  virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext*
pContext);
  // Generated message map functions
  //{{AFX_MSG(C3WaySplitterFrame)
  //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};/* 何问起 hovertree.com */
/////////////////////////////splitter.cpp文件;
#include “stdafx.h”
#include “viewex.h”
#include “splitter.h”
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
// CSplitterFrame
// Create a splitter window which splits an output text view and an
input view
// |
// TEXT VIEW (CTextView) | INPUT VIEW (CInputView)
// |
IMPLEMENT_DYNCREATE(CSplitterFrame, CMDIChildWnd)
CSplitterFrame::CSplitterFrame()
{}

CSplitterFrame::~CSplitterFrame()
{}
BOOL CSplitterFrame::OnCreateClient(LPCREATESTRUCT,
CCreateContext* pContext)
{
 // create a splitter with 1 row, 2 columns
 if (!m_wndSplitter.CreateStatic(this, 1, 2))
 {
  TRACE0(“Failed to CreateStaticSplitter\n”);
  return FALSE;
 }
 // add the first splitter pane – the default view in column 0
 if (!m_wndSplitter.CreateView(0, 0,pContext->m_pNewViewClass,
CSize(130, 50), pContext))
 {
  TRACE0(“Failed to create first pane\n”);
  return FALSE;
 }
 // add the second splitter pane – an input view in column 1
 if (!m_wndSplitter.CreateView(0, 1,RUNTIME_CLASS(CInputView),
CSize(0, 0), pContext))
 {
  TRACE0(“Failed to create second pane\n”);
  return FALSE;
 }
 // activate the input view
 SetActiveView((CView*)m_wndSplitter.GetPane(0,1));
 return TRUE;
}
BEGIN_MESSAGE_MAP(CSplitterFrame, CMDIChildWnd)
 //{{AFX_MSG_MAP(CSplitterFrame)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()
// C3WaySplitterFrame – just like CSplitterFrame except the input view
is
// the first pane, and there are two output views

// | Text View (CTextView)
// INPUT VIEW (CInputView) |————————
// | Color View (CColorView)
IMPLEMENT_DYNCREATE(C3WaySplitterFrame, CMDIChildWnd)
C3WaySplitterFrame::C3WaySplitterFrame()
{}

C3WaySplitterFrame::~C3WaySplitterFrame()
{}

BOOL C3WaySplitterFrame::OnCreateClient(LPCREATESTRUCT
lpcs,CCreateContext* pContext)
{
 // create a splitter with 1 row, 2 columns
 if (!m_wndSplitter.CreateStatic(this, 1, 2))
 {
  TRACE0(“Failed to CreateStaticSplitter\n”);
  return FALSE;
 }
 // add the first splitter pane – the default view in column 0
 if (!m_wndSplitter.CreateView(0, 0,pContext->m_pNewViewClass,
CSize(200, 50), pContext))
 {
  TRACE0(“Failed to create first pane\n”);
  return FALSE;
 }
 // add the second splitter pane – which is a nested splitter with 2
rows
 if (!m_wndSplitter2.CreateStatic(&m_wndSplitter, // our parent
window is the first splitter
2, 1, // the new splitter is 2 rows, 1 column
WS_CHILD | WS_VISIBLE | WS_BORDER, // style, WS_BORDER is needed
m_wndSplitter.IdFromRowCol(0, 1) ))
// new splitter is in the first row, 2nd column of first splitter
{
 TRACE0(“Failed to create nested splitter\n”);
 return FALSE;
}
// now create the two views inside the nested splitter
int cyText = max(lpcs->cy – 70, 20); // height of text pane
if (!m_wndSplitter2.CreateView(0, 0,RUNTIME_CLASS(CTextView), CSize(0,
cyText), pContext))
{
 TRACE0(“Failed to create second pane\n”);
 return FALSE;
}
if (!m_wndSplitter2.CreateView(1, 0,RUNTIME_CLASS(CColorView),
CSize(0, 0), pContext))
{
 TRACE0(“Failed to create third pane\n”);
 return FALSE;
}
// it all worked, we now have two splitter windows which contain
// three different views
return TRUE;
}
BEGIN_MESSAGE_MAP(C3WaySplitterFrame, CMDIChildWnd)
//{{AFX_MSG_MAP(C3WaySplitterFrame)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
IMPLEMENT_DYNAMIC(CViewExSplitWnd, CSplitterWnd)
CViewExSplitWnd::CViewExSplitWnd()
{}

CViewExSplitWnd::~CViewExSplitWnd()
{}

CWnd* CViewExSplitWnd::GetActivePane(int* pRow, int* pCol)
{
 ASSERT_VALID(this);
 // attempt to use active view of frame window
 CWnd* pView = NULL;
 CFrameWnd* pFrameWnd = GetParentFrame();
 ASSERT_VALID(pFrameWnd);
 pView = pFrameWnd->GetActiveView();
 // failing that, use the current focus
 if (pView == NULL)
  pView = GetFocus();
 return pView;
} /* 何问起 hovertree.com */

MFC中接纳CSplitterWnd分割窗口后装置视图大小的主题素材(无效设置)
  1.在对框架窗口举行分割之后要求基于须要设置各样分割窗口的轻重缓急,不过在通过createView(…)设置大小时,往往起不到想要的结果,如下代码并不能够将框架的窗口遵照预设的尺寸来展开分割:

 
 2.那时候,须要在装置了在CreateView后,使用m_wndSplitter.SetRowInfo(….)设置水平划分条的地方,平常能够onSize()函数中举行安装,以达到分割窗口能够基于父窗口的轻重活动调解,代码如下:

CSplitterWnd能够很便利地创立分割器窗口。要潜伏分割器窗口中的有个别视图,只需调用GetPane函数得到视图指针,然后调用ShowWindow函数掩盖窗口。不过如此做只遮掩了视图窗口,未有藏身分割条;当程序框架尺寸变化后,程序会活动调用RecalcLayout函数,进而使得突显效果不正规。CSplitterWnd未有提供设置分割条尺寸的public函数,通过剖判CSplitterWnd的源码得知,它当中有多少个从未了然的受保险的积极分子变量:

m_cxSplitter, m_cySplitter, m_cxBorderShare, m_cyBorderShare,
m_cxSplitterGap, m_cySplitterGap, m_cxBorlder, m_cyBorlder

透过重新构造m_cxSplitterGap,m_cySplitterGap变量的值,就足以兑现转移分割条尺寸的功能。

缓和方案:

1.从CSplitterWnd派生一个新类CMySplitterWnd;

2.在.h文件中增添成员变量和函数如下:

        int m_cx;

        int m_cy;

        void HideSplitter();

        void ShowSplitter();

3.在.cpp文件中增多完成代码如下:

void CMySplitterWnd::HideSplitter()

{

        m_cx=m_cxSplitterGap;//save previous cx

        m_cy=m_cxSplitterGap;//save previous cy

        m_cxSplitterGap=0;

        m_cySplitterGap=0;

}

void CMySplitterWnd::ShowSplitter()

{

        m_cxSplitterGap=m_cx;

        m_cySplitterGap=m_cy;

}

4.接纳新类CMySplitterWnd生元素割器窗口,在急需的时候调用HideSplitter、ShowSplitter函数就可以。

焚薮而田方案2:

//保存分割条的职位

m_wndSplitter1.GetColumnInfo(0,scx,smcx);

//设置分割条在最侧面

m_wndSplitter1.SetColumnInfo(0,0,0);

LeftView->ShowWindow(SW_HIDE);

RightView->ShowWindow(SW_MAXIMIZE);

m_wndSplitter1.HideSplitter();

m_wndSplitter1.RecalcLayout();

3.

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

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

virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass,
SIZE sizeInit, CCreateContext* pContext );

AFX_IDW_PANE_FI奔驰M级ST
是默许nID,用于一层分割时。多层分割供给父窗口调用int IdFromRowCol( int
row, int col ) const;函数得到row行col列的窗口id号。


0

  四、小结

  本实例通过灵活运用CsplitterWnd类,完毕了窗口的私自拆分。其余,需求补充的内容是,在具体行使中得以由此对CSplitterWnd原有办法的掩盖大概扩张新的不二诀窍来扩大CSplitterWnd。大家在此仅举七个方面包车型地铁事例,一是锁定切分条;二是定制本身的切分条。对于锁定切分条,不愿意客商通过拖动切分条来调解窗口的尺寸那些主题素材,最简便的消除措施其实不让CSplitterWnd来拍卖WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_SETCUEvoqueSOTiggo音讯,而是将这个新闻交给CWnd窗口举行拍卖,进而屏蔽掉那个音讯。那么哪些定制自身的切分条呢?通过重载CSplitterWnd的虚方法OnDrawSplitter()和OnInvertTracker()能够完结那样的目标。上边包车型大巴代码生成的作用是分开窗口的界线颜色为革命,分割条的水彩为桃红代码如下:

void CSplitterWndEx::OnDrawSplitter(CDC *pDC, ESplitType nType, const
CRect &rectArg)
{
 if(pDC==NULL)
 {
  RedrawWindow(rectArg,NULL,RDW_INVALIDATE|RDW_NOCHILDREN);
  return;
 }
 ASSERT_VALID(pDC);
 CRect rc=rectArg;
 switch(nType)
 {
  case splitBorder:
   //重画分割窗口边界,使之为湖蓝
   pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0));
   rc.InflateRect(-CX_BORDER,-CY_BORDER);
   pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0));
   return;
  case splitBox:
   pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));
   rc.InflateRect(-CX_BORDER,-CY_BORDER);
   pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));
   rc.InflateRect(-CX_BORDER,-CY_BORDER);
   pDC->FillSolidRect(rc,RGB(0,0,0));
   pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));
   return;
  case splitBar:
   //重画分割条,使之为铁锈棕
   pDC->FillSolidRect(rc,RGB(255,255,255));
   rc.InflateRect(-5,-5);
   pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0));
   return;
  default:
   ASSERT(FALSE);
 }
 pDC->FillSolidRect(rc,RGB(0,0,255));
}
void CSplitterWndEx::OnInvertTracker(CRect &rect)
{
 ASSERT_VALID(this);
 ASSERT(!rect.IsRectEmpty());
 ASSERT((GetStyle()&WS_CLIPCHILDREN)==0);
 CRect rc=rect;
 rc.InflateRect(2,2);
 CDC* pDC=GetDC();
 CBrush* pBrush=CDC::GetHalftoneBrush();
 HBRUSH hOldBrush=NULL;
 if(pBrush!=NULL)
hOldBrush=(HBRUSH)SelectObject(pDC->m_hDC,pBrush->m_hObject);
  pDC->PatBlt(rc.left,rc.top,rc.Width(),rc.Height(),BLACKNESS);
  if(hOldBrush!=NULL)
   SelectObject(pDC->m_hDC,hOldBrush);
   ReleaseDC(pDC);

 

 

推荐:

大家在使用OutLook只怕NetAnt等工具的时候,一般都会被其复杂的分界面所掀起,在那一个分界面中窗口被分开为多少的区域…

源代码: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.       新建一个单文书档案的应用程序,命名字为SplitterWnd德姆o;

2.       插入三个对话框的能源,作为内部三个细分窗口;为对话框增加相应的控件;

2.1装置对话框的质量:将‘样式’设置为‘下层’;取缔行使标题栏;边框接纳‘调解大小’;其余格式临时都不设置;

2.2为对话框创设二个类,类名CLeftView;父类选用为CFormView;

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

CSplitterWnd
m_splitterWnd;

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

[cpp] view
plaincopy

  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. //为第二个窗格发生视图  
  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. //为首个窗格产生视图  
  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”

出于CSplitterWnd德姆oView是应用程序的视图类,在其头文件中添Gavin档类的头文件#include”SplitterWnd德姆oDoc.h”,不然会报错:’CSplitterWnd德姆oDoc’ : 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:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 澳门新葡亰官网app 版权所有