龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

使用VC6.0实现窗口的任意分割(3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
CView3和CView4都是不与文档相关联的。我们现在实现CView3与CView2的通信.正如前面所说,CView2只能安全的与CCuteFTPDoc通信,因此,CView3如果需要跟CView2通信,也

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

  CView3中的代码如下:
CMainFrame* MainFrame=(CMainFrame*)this->GetParent()->GetParent();
         
          CCuteFTPDoc* Doc=(CCuteFTPDoc*)MainFrame->GetActiveDocument();
          if(Doc!=NULL) Doc->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的主窗口的框架并且能够实现他们之间相互通信的框架。 同样的我们可以实现其他的一些流行界面例如NetAnts,Foxmail的分割。

  三、关于对话框的分割

  到目前为止,只有基于文档/视图的程序才能使用CSplitterWnd,而基于对话框的应用程序却不支持CSplitterWnd,但是如果我们在继承类中重载一些虚拟方法,也能使CSplitterWnd 在对话框程序中使用。从MFC的源程序WinSplit.cpp中可以看出,为了获得父窗口的地方程序都调用了虚拟方法GetParentFrame(),因此如果在对话框中使用,我们必须将它改为GetParent();因此我们将CSplitterWnd的下面几个方法重载。


virtual void StartTracking(int ht);
virtual CWnd* GetActivePane(int* pRow = NULL, int* pCol  = NULL);
virtual void SetActivePane( int row, int col, CWnd* pWnd  = NULL );
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
virtual BOOL OnNotify( WPARAM wParam, LPARAM lParam, LRESULT* pResult );
virtual BOOL OnWndMsg( UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult );
  具体实现如下,实现中我将给出原有代码的主要部分以及修改后的代码以作对比。

  在cpp文件中加入下面的枚举类型。


enum HitTestValue
{
                  noHit = 0,//表示没有选中任何对象
                  vSplitterBox = 1,
                  hSplitterBox = 2,
                  bothSplitterBox = 3,
                  vSplitterBar1 = 101,//代表各个方向的水平分割条
                  vSplitterBar15 = 115,
                  hSplitterBar1 = 201,//代表垂直方向的各个分割条
                  hSplitterBar15 = 215,
                  splitterIntersection1 = 301,//代表各个交叉点
                  splitterIntersection225 = 525
};
          CWnd* CxSplitterWnd::GetActivePane(int* pRow, int* pCol)
{

收藏文章
表情删除后不可恢复,是否删除
取消
确定
图片正在上传,请稍后...
评论内容为空!
还没有评论,快来抢沙发吧!
按钮 内容不能为空!
立刻说两句吧! 查看0条评论
精彩图集

赞助商链接