CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

关于多视图的切换。

楼主FlyingHero(雁翔工作室)2001-01-29 09:51:00 在 VC/MFC / 基础类 提问

我用CSplitterWnd将CMainFrame切换成两个窗口。如果我要再创建一个视图将原来右边的视图替换掉,我应该怎样做? 问题点数:50、回复次数:5Top

1 楼Fesd(傻蛋)回复于 2001-01-29 10:41:00 得分 0

CSplitterWnd恐怕无法切割CMainFrame吧?Top

2 楼dusj(小兔乖乖)回复于 2001-01-29 11:04:00 得分 0

建立第二个document/view/frame模板Top

3 楼No15(十五号)回复于 2001-01-29 11:13:00 得分 50

这篇文章也许对你有帮助。  
   
  怎   样   在   一   个Pane   中   显   示   多   种View   ?    
  河   南   大   学   数   学   系   祁   文   文    
  ----   在MS   Windows   中,   一   个   窗   口   可   以   分   割   成   若   干   个   子   窗   口,   每   一   个   子   窗   口   称   作   一   个   窗   片(pane),   每   个   窗   片   可   以   独   立   控   制,   这   给   界   面   设   计   提   供   了   很   大   的   方   便。    
   
  ----   利   用VC   可   以   很   方   便   地   实   现   分   割   窗   口。   分   割   的   方   法   有   两   种:   动   态   和   静   态。   动   态   分   割   时   可   以   根   据   用   户   的   需   要   分   割   成   数   目   不   同   的   窗   片,   但   所   有   窗   片   的   属   性   和   父   窗   口   都   是   一   样   的;   而   静   态   分   割   的   窗   片   的   数   目   在   程   序   中   指   定,   运   行   时   是   固   定   的,   但   每   个   窗   片   可   以   有   各   自   不   同   类   型   的   视(View),   因   此   其   使   用   范   围   更   为   广   泛。   本   文   所   讨   论   的   问   题   仅   限   于   静   态   分   割。    
   
  ----   窗   片   中   视   的   类   型   大   多   是   在   主   窗   口   的   创   建   过   程   中   指   定   的。   这   也   就   意   味   着,   一   个   窗   片   虽   然   可   以   显   示   任   意   类   型   的   视,   但   是   这   种   类   型   一   旦   确   定,   在   程   序   运   行   过   程   中   就   难   以   改   变。    
   
  ----   一、   我   要   的   是   这   样   的   !    
   
  ----   但   是   我   们   有   时   确   实   需   要   改   变   一   个   窗   片   所   显   示   的   视   的   类   型,   也   就   是   说,   需   要   让   一   个   窗   片   显   示   多   种   类   型   的   视。   例   如   一   个   窗   口   被   分   割   成   两   部   分,   一   边   是   命   令   窗   口,   另   一   边   是   工   作   窗   口,   根   据   命   令   窗   口   中   发   出   的   不   同   命   令,   需   要   变   换   不   同   的   工   作   类   型,   这   就   需   要   工   作   窗   口   中   能   够   显   示   多   种   类   型   的   视   窗,   那   么,   如   何   做   到   这   一   点   呢   ?    
   
  ----   二、   你   可   以   这   样   做   !    
   
  ----   从   图1   中   可   以   看   到,   本   程   序   共   有   三   个   视   类,   分   别   是:    
   
  ----   ?   命   令   视   类CCmdView:   用   来   控   制   右   边   窗   片   中   不   同   视   的   显   示;    
   
  ----   ?   选   项   按   钮   视   类CRdiView:   显   示   在   右   窗   片   中   的   选   项   视   类;    
   
  ----   ?   检   查   按   钮   视   类CChkView:   显   示   在   右   窗   片   中   的   检   查   视   类。    
   
  ----   这   三   个   视   类   都   是CFormView   的   子   类。    
   
  ----   下   面   我   们   来   看   如   何   在   右   窗   片   内   进   行   两   类   视   间   的   切   换。   实   际   上,   由   视A   切   换   到   视B   的   原   理   很   简   单,   那   就   是:    
   
  ----   1.   从   窗   片   中   删   除   视A;    
   
  ----   2.   往   窗   片   中   添   加   视B。    
   
  ----   步   骤1   的   实   现   非   常   简   单,   仅   用   一   条   语   句   即   可:    
   
  ----   m_wndSplitter.DeleteView(0,   1);    
   
  ----   但   它   是   必   不   可   少   的,   因   为   你   不   能   让   一   个   窗   片   同   时   包   含   两   个   视。   我   本   来   希   望   往   一   个   窗   片   中   添   加   新   的   视   时,VC   会   自   动   将   原   来   的   视   删   掉,   可   是   它   不   干。    
   
  ----   我   们   来   看   如   何   实   现   步   骤2,   当   一   个   窗   片   是   空   的   时   候,   怎   样   往   里   面   添   加   一   个   视   呢   ?   其   实   这   样   的   功   能   在   程   序   里   我   们   已   经   用   过   了,   看   下   面   的   语   句:    
   
  BOOL   CMainFrame::OnCreateClient  
  (LPCREATESTRUCT   lpcs,   CCreateContext*   pContext)    
  {  
    …   …  
  if   (!m_wndSplitter.CreateView(0,   0,    
  pContext->m_pNewViewClass,    
  size,    
  pContext))  
    …   …  
  }  
   
  ----   是   的,   用   的   就   是CSplitterWnd::CreateView(),   要   注   意   的   是   它   共   有   五   个   参   数,   其   中   前   两   个   用   来   指   定   分   割   窗   口   的   窗   片,   第   三   个   用   来   指   定   视   的   类   型,   第   四   个   指   定   视   的   大   小。   最   后   的   一   个   我   们   暂   时   用   不   上,   用   空   值NULL   就   可   以   了。    
   
  ----   这   样   我   们   就   可   以   编   写   视   切   换   的   代   码   了。   因   为   视   切   换   要   操   纵m_wndSplitter,   而   它   是   主   窗   口   的   成   员,   因   此   切   换   过   程   最   好   设   计   为   主   窗   口   的   成   员   函   数。   但   是   切   换   命   令   是CCmdView   接   受   的,   因   而   可   以   让CCmdView   接   受   到   视   更   改   消   息   后,   将   消   息   传   给   主   窗   口,   由   主   窗   口   完   成   视   更   改。   具   体   的   代   码   是   这   样   的:    
   
  ----   命   令   视   类   中   的   消   息   映   射:    
   
  BEGIN_MESSAGE_MAP(CCmdView,   CFormView)  
    …   …  
  ON_BN_CLICKED(IDC_CHECK,   OnSwitchToCheckView)  
  ON_BN_CLICKED(IDC_RADIO,   OnSwitchToRadioView)  
    …   …  
  END_MESSAGE_MAP()  
   
    命   令   视   类   中   的   消   息   响   应:  
  void   CCmdView::OnSwitchToCheckView()    
  {  
  AfxGetApp()->m_pMainWnd->  
  SendMessage(WM_COMMAND,   ID_CHECK);  
  }  
   
  void   CCmdView::OnSwitchToRadioView()    
  {  
  AfxGetApp()->m_pMainWnd->  
  SendMessage(WM_COMMAND,   ID_RADIO);  
  }  
   
    主   窗   口   中   的   消   息   映   射:  
  BEGIN_MESSAGE_MAP(CMainFrame,   CFrameWnd)  
    …   …  
  ON_COMMAND(ID_CHECK,   OnSwitchToCheckView)  
  ON_COMMAND(ID_RADIO,   OnSwitchToRadioView)  
    …   …  
  END_MESSAGE_MAP()  
   
    主   窗   口   中   的   消   息   响   应:  
  void   CMainFrame::OnSwitchToCheckView()    
  {  
  m_wndSplitter.DeleteView(0,   1);  
  m_wndSplitter.CreateView(0,   1,    
  RUNTIME_CLASS(CChkView),    
  CSize(0,   0),    
  NULL);  
  m_wndSplitter.RecalcLayout();  
  }  
   
  void   CMainFrame::OnSwitchToRadioView()    
  {  
  m_wndSplitter.DeleteView(0,   1);  
  m_wndSplitter.CreateView(0,   1,  
  RUNTIME_CLASS(CRdiView),  
  CSize(0,   0),    
  NULL);  
  m_wndSplitter.RecalcLayout();  
  }  
   
  ----   好   啦,   运   行   一   下   这   个   程   序,   感   觉   是   否   不   错   ?   看   来   大   功   告   成   了,   可   是   …   …    
   
  ----   三、   还   有   一   个   问   题    
   
  ----   在   运   行   我   们   辛   辛   苦   苦   编   出   来   的   程   序   时,   回   头   看   看VC   的   调   试   窗   口,   你   会   发   现   有   很   多   行   这   样   的   话:    
   
  ----   Create   view   without   document.    
   
  ----   这   是   说   我   们   创   建   了   视,   可   是   没   有   相   应   的   文   档。   好   在   这   只   是   警   告   信   息,   不   是   什   么   错   误,   如   果   你   不   需   要   相   应   的   文   档,   就   完   全   不   用   去   管   它。   可   是,VC   中   一   种   很   重   要   的   结   构   就   是   文   档-   视   结   构,   利   用   这   种   结   构,   对   数   据   操   纵   起   来   非   常   方   便。   如   果   需   要   建   立   与   视   相   对   应   的   文   档,   应   该   怎   么   办   呢   ?    
   
  ----   这   就   涉   及   到VC   中   文   档-   视   结   构   的   知   识,   不   过   不   用   怕   麻   烦,   与   本   文   有   关   的   就   只   有   这   么   两   点   而   已:    
   
  ----   1.   利   用VC   创   建   的   应   用   程   序   一   般   都   会   管   理   一   些   文   档   模   板(Document   Template),   文   档   类   和   视   类   的   对   应   关   系   就   是   在   文   档   模   板   里   描   述   的。    
   
  ----   2.   一   个   文   档   可   以   有   多   个   视,   创   建   视   的   时   候,   需   要   根   据   文   档   和   视   的   对   应   关   系,   给   出   它   所   依   附   的   文   档。    
   
  ----   怎   样   实   现   上   述   第   一   点   呢   ?    
   
  ----   首   先   建   立   相   应   的   文   档   类:CRdiDoc   和CChkDoc。    
   
  ----   其   次   是   定   义   相   应   的   文   档   模   板,   这   是   应   用   类   的   成   员   变   量。   因   为   在   别   的   类   中   要   使   用   它   们,   我   们   将   之   定   义   为   公   共   类   型:    
   
  class   CViewSwitcherApp   :   public   CWinApp  
  {  
    …   …  
  public:  
  CSingleDocTemplate*   m_pRdiDocTemplate;  
  CSingleDocTemplate*   m_pChkDocTemplate;  
    …   …  
  }  
    然   后   创   建   这   两   个   文   档   模   板,   并   加   入   到   模   板   列   表   中:  
  BOOL   CViewSwitcherApp::InitInstance()  
  {  
    …   …  
  m_pRdiDocTemplate   =   new   CSingleDocTemplate(  
  IDR_MAINFRAME,  
  RUNTIME_CLASS(CRdiDoc),  
  RUNTIME_CLASS(CMainFrame),  
  RUNTIME_CLASS(CRdiView));  
  AddDocTemplate(m_pRdiDocTemplate);  
   
  m_pChkDocTemplate   =   new   CSingleDocTemplate(  
  IDR_MAINFRAME,  
  RUNTIME_CLASS(CChkDoc),  
  RUNTIME_CLASS(CMainFrame),  
  RUNTIME_CLASS(CChkView));  
  AddDocTemplate(m_pChkDocTemplate);  
    …   …  
  }  
   
  ----   至   于   第   二   点,   是   在   创   建   视   时   完   成   的。   还   记   得   创   建   视   的   情   况   么   ?   当   时   有   一   个   叫   做pCreateContext   的   参   数,   我   们   将   之   置   为   空,   这   里   就   要   用   到   它   了。    
   
  ----   pCreateContext   是   一   个   指   向   被   称   作"   创   建   上   下   文"(CreateContext)   结   构   的   指   针,   这   个   结   构   中   保   存   一   些   与   创   建   视   相   关   的   内   容。   在   创   建   主   窗   口   时,   系   统   会   构   造   这   样   一   个   结   构,   并   将   它   作   为   参   数   传   递   到   与   创   建   视   有   关   的   函   数   中。   但   现   在   我   们   不   创   建   主   窗   口,   因   此   不   得   不   自   己   构   造   这   样   一   个   结   构。   实   际   上,   该   结   构   中   我   们   所   要   使   用   的   字   段   只   有   三   个:    
   
  ----   1.   新   视   所   属   的   文   档   模   板m_pNewDocTemplate;    
   
  ----   2.   新   视   的   类   型m_pNewViewClass;    
   
  ----   3.   新   视   所   属   的   文   档m_pCurrentDoc;    
   
  ----   其   中   仅   有   第   三   项   需   要   新   建,   前   两   项   都   是   已   知   的,   只   要   指   定   即   可。   以   切   换   到   选   项   视   为   例,   修   改   后   的   代   码   是:    
   
  void   CMainFrame::OnSwitchToRadioView()    
  {  
  m_wndSplitter.DeleteView(0,   1);  
   
  CCreateContext   createContext;    
  //   定   义   并   初   始   化CreateContext  
  //   获   取   新   视   所   属   的   文   档   模   板  
  CSingleDocTemplate*   pDocTemplate   =    
  ((CViewSwitcherApp*)AfxGetApp())-> m_pRdiDocTemplate;  
  //   创   建   新   文   档   并   初   始   化  
  CDocument*   pDoc   =   pDocTemplate->CreateNewDocument();  
  pDoc->OnNewDocument();  
   
  //   设   置CreateContext   相   关   字   段  
  createContext.m_pNewViewClass   =   RUNTIME_CLASS(CChkView);  
  createContext.m_pCurrentDoc   =   pDoc;  
  createContext.m_pNewDocTemplate   =   pDocTemplate;  
   
  m_wndSplitter.CreateView(0,   1,  
    RUNTIME_CLASS(CRdiView),  
    CSize(0,   0),  
    &createContext);  
   
  m_wndSplitter.RecalcLayout();  
  }  
   
  ----   四、   最   后   的   修   改    
   
  ----   为   了   使   这   个   程   序   更   符   合   要   求,   我   们   还   要   做   一   些   与   更   换   视   无   关   的   修   改。   在   这   个   程   序   中   我   们   一   共   定   义   了   三   种   类   型   的   文   档,   程   序   启   动   时   一   般   要   新   建   一   个   文   档   开   始   工   作,   可   是   它   不   知   道   要   选   择   哪   一   种,   就   弹   出   一   个   对   话   框   来   询   问。   而   这   是   我   们   不   希   望   看   到   的。   修   改   的   方   法   是   不   让VC   选   择   新   文   档   类   型,   而   我   们   指   定   创   建   哪   一   种   类   型   的   文   档,   即   把CViewSwitcherApp::CViewSwitcherApp()   中   的   语   句    
   
  ----   if   (!ProcessShellCommand(cmdInfo))   return   FALSE;    
   
  ----   更   改   为    
   
  ----   m_pDocTemplate->OpenDocumentFile(NULL)。   Top

4 楼stzhou(阿毛)回复于 2001-01-29 11:46:00 得分 0

嗯,不错Top

5 楼daydream(瞳孔)回复于 2001-05-18 09:11:00 得分 0

我需要这个程序Top

相关问题

  • 单文档多视图中视图切换的问题
  • 怎么切换多种类型视图的显示??? ???
  • 单文档创建多视图并切换问题!
  • 视图切换问题
  • ======如何切换视图======
  • 视图切换的问题。
  • 请问怎样在多视图中进行切换,及如何判断视图已建立?
  • 关于切换视图的方法:)
  • 视图切换的问题,急急!!
  • 如何实现视图的切换?

关键词

  • 视图
  • runtime
  • createcontext
  • wndsplitter
  • 口
  • 文档
  • ccmdview
  • 程序
  • 创建
  • cviewswitcherapp

得分解答快速导航

  • 帖主:FlyingHero
  • No15

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo