我的主窗体被分成了四部分(左边是两行一列一个TreeView(上)和CView(下),右边也是两行一列ListView(上)和Edit(下))但是我发现当我改变主窗提大小时(例如缩小将主窗体的底部向上拉),改变的窗口只有两个Cview和Edit,当我将主窗体的底部拉的很高时,CView和Edit就缩小的几乎没有了。而TreeView和ListView的大小没有改变。
当扩大窗体时(将主窗体的底部向下拉),而TreeView和ListView的大小没有改变,改变的是CView和Edit。显然这样很不美关,我就想在窗体改变大小时四个窗体是按比例改变的。
我知道是在OnSize中写可是在那一个里写写什么。不要只说简单几句,先谢谢你来关注。再谢谢能帮我解决问题的人。
还有一个问体就是如想将窗体拆分成一边是一个视图(比如RichEdit或者是GrpoupBox)而另一边是多页组件即tabCtrl
可是我好象没发现有TabCtrlView和RichEditView等。我该怎么做啊。
当扩大窗体时(将主窗体的底部向下拉),而TreeView和ListView的大小没有改变,改变的是CView和Edit。显然这样很不美关,我就想在窗体改变大小时四个窗体是按比例改变的。
我知道是在OnSize中写可是在那一个里写写什么。不要只说简单几句,先谢谢你来关注。再谢谢能帮我解决问题的人。
还有一个问体就是如想将窗体拆分成一边是一个视图(比如RichEdit或者是GrpoupBox)而另一边是多页组件即tabCtrl
可是我好象没发现有TabCtrlView和RichEditView等。我该怎么做啊。
■有文档相连的视图之间的通信
由AppWizard生成的CCuteFTPView是与文档相连的,同时我们也让CView2与文档相连,因此我们需要修改CCuteFTPApp的InitInstance()函数,我们将增加下面的部分。
AddDocTemplate (new CMultiDocTemplate(IDR_VIEW2TYPE,
RUNTIME_CLASS(CMainDoc),
RUNTIME_CLASS(CMDIChildWnd),
RUNTIME_CLASS(CView2)));
我们现在来实现CCuteFTPView与CView2之间的通信。由于跟文档类相连的视图类 是不能安全的与除文档类之外的其余的视图类通信的。因此我们只能让他们都与文档 类通信。在文档中我们设置相应的指针以用来获的各个视图。我们重载 CCuteFTPView::OnOpenDocument()函数;
CCuteFTPView* pCuteFTPView;CView2* pView2;
POSITION pos;
CView* pView;
while(pos!=NULL)
{
pView=GetNextView(pos);
if(pView->IsKindOf(RUNTIME_CLASS(CCuteFTPView))==NULL)
pCuteFTPView=(CCuteFTPView*)pView;
else(pView->IsKindOf(RUNTIME_CLASS(CCuteFTPView))==NULL)
pView2=(CView2*)pView;
}
这样我们在文档类中就获的了跟它相连的所有的视图的指针。
如果需要在 CCuteFTPView中调用CView2中的一个方法DoIt()则代码如下:
CCuteFTPDoc* pDoc=GetDocument();CView2* pView2=pDoc->pView3;pView3.DoIt(); ■无文档视图与文档关联视图之间的通信
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的分割。