笑看风云淡

宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒
posts - 96, comments - 48, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 ::  :: 聚合  :: 管理

关于窗口的分割

Posted on 2009-01-12 11:48 天之骄子 阅读(568) 评论(1)  编辑 收藏 引用
一、CSplitterWnd的创建函数主要有下面三个:
    //功能描述:该函数用来创建动态切分窗口。
    
//参数含义:pParentWnd 切分窗口的父框架窗口。
    
//nMaxRows,nMaxCols是创建的最大的列数和行数。
    
//sizeMin是窗格的现实大小。
    
//pContext 大多数情况下传给父窗口。
    
//nID是子窗口的ID号. 
    BOOL Create(CWnd* pParentWnd,int nMaxRows,int nMaxCols,SIZE sizeMin,
        CCreateContext
* pContext,DWORD dwStyle,UINT nID);
    
    
//功能描述:用来创建静态切分窗口。 参数含义同上。 
    BOOL CreateStatic(CWnd* pParentWnd,int nRows,int nCols,DWORD dwStyle,UINT nID);
    
    
//功能描述:为静态切分的窗口的网格填充视图
    
//在将视图于切分窗口联系在一起的时候必 须先将切分窗口创建好。
    BOOL CreateView (int row,int col,CruntimeClass* pViewClass,
        SIZE sizeinit,CcreateContext
* pContext);

二、创建动态拆分窗口
        创建动态拆分窗口用Create()方法,对于所有的窗格,都必须共享同一个视图,所受的限制也比较多,因此我们不将动态创建作为重点。

三、创建静态拆分窗口
        与动态创建相比,静态创建的代码要简单许多,而且可以最多创建16x16的窗格。不同的窗格我们可以使用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);

    
//将CView4连接到0行2列
    m_wndSplitter1.CreateView(2,0,RUNTIME_CLASS(CView4),CSize(100,100),pContext); 

    
//将第1行0列再分开1行2列 
    if(m_wndSplitter2.CreateStatic(&m_wndSplitter,1,2,WS_CHILD|WS_VISIBLE, 
        m_wndSplitter.IdFromRowCol(
10))==NULL) 
        
return FALSE;

    
//将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; 
}

四、实现各个分割区域的通信 

        ■有文档相连的视图之间的通信

  由AppWizard生成的CCuteFTPView是与文档相连的,同时我们也让CView2与文档相连,因此我们需要修改CCuteFTPApp的InitInstance()函数,我们将增加下面的部分。
AddDocTemplate (new CMultiDocTemplate(IDR_VIEW2TYPE, 
                
                RUNTIME_CLASS(CMainDoc), 
                RUNTIME_CLASS(CMDIChildWnd), 
                RUNTIME_CLASS(CView2)));
        我们现在来实现CCuteFTPView与CView2之间的通信。由于跟文档类相连的视图类 是不能安全的与除文档类之外的其余的视图类通信的。因此我们只能让他们都与文档 类通信。在文档中我们设置相应的指针以用来获的各个视图。
        首先在CCuteFTPDoc.h文件中定义视图类的指针变量
CCuteFTPView* m_pCuteFTPView;
CView2
* m_pView2;
       
        然后,我们重载CCuteFTPDoc::OnOpenDocument()函数
POSITION pos;
CView
* pView;
while(pos!=NULL)
{
    pView
=GetNextView(pos); 
    
if(pView->IsKindOf(RUNTIME_CLASS(CCuteFTPView))==NULL) 
        m_pCuteFTPView
=(CCuteFTPView*)pView; 
    
else(pView->IsKindOf(RUNTIME_CLASS(CCuteFTPView))==NULL) 
        m_pView2
=(CView2*)pView; 
}
        这样我们在文档类中就获的了跟它相连的所有的视图的指针。

  如果需要在 CCuteFTPView中调用CView2中的一个方法DoIt()则代码如下:
CCuteFTPDoc* pDoc=GetDocument();
CView2
* pView2=pDoc->m_pView2;
pView2.DoIt();

        ■无文档视图与文档关联视图之间的通信

        CView3和CView4都是不与文档相关联的。我们现在实现CView3与CView2的通信,正如前面所说,CView2只能安全的与CCuteFTPDoc通信,因此,CView3如果需要跟CView2通信,也必须借助于文档类。因此程序的关键是如何在CView3中获得文档的指针。视图类中没有这样的类成员可以用来直接访问文档类。但是我们知道在主窗口类MainFrame中我们可以获得程序的任意窗口类的指针。因此我们只要获得了程序主窗口的指针,就可以解决问题了。下面代码实现在CView3中访问CView2中的DoIt()方法。
CMainFrame* MainFrame=(CMainFrame*)this->GetParent()->GetParent(); 

CCuteFTPDoc
* pDoc=(CCuteFTPDoc*)MainFrame->GetActiveDocument();
if(pDoc!=NULL) pDoc->DoIt();

        CCuteFTPDoc中的相应的处理函数DoIt()代码如下:
CView2* pView2; 
POSITION pos; 
CView
* pView; 
while(pos!=NULL) 

    pView
=GetNextView(pos);
    
if(pView->IsKindOf(RUNTIME_CLASS(CView2))==NULL) 
        pView2
=(CView2*)pView; 
}
 
pView2
->DoIt();

        ■无文档关联视图之间的通信

        CView3和CView4都是不跟文档相连的,如何实现他们之间的通信呢。 正如我们在上面所说的那样,由于在主框架中我们可以访问任意的视图,因此我们的主要任务还是在程序中获得主框架的指针。下面代码实现在CView3中访问CView4中的方法DoIt()。
CMainFrame* MainFrame=(CMainFrame*)this->GetParent()->GetParent(); 

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

        到现在我们已经实现了CuteFTP的主窗口的框架并且能够实现他们之间相互通信的框架。

Feedback

# re: 关于窗口的分割  回复  更多评论   

2009-07-09 14:35 by 沙漠之音
AddDocTemplate函数能不能在解释清点?CMainDoc,CMDIChildWnd,IDR_VIEW2TYPE 看的很晕。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理