用vc++编程时,利用csplitterwnd类实现拆分窗口比较简单,但是对于实现多个窗口的切换,例如应用程序拥有两个面板,一个是命令面板ccommandview,而另一个是显示面板。在显示面板中又可以根据命令面板的参数设置切换蚂扮为不同的显示窗口(cdataview,cpictureview)。应该如何实现呢?
一、建立窗口
1、选择[insert]→[new form]菜单,弹出“new form”对话框。设置好你的窗口类名称(cdataview),基类选择cformview类。如果你的窗口所连接的文档为同一文档,就可以ok了;如果为不同文档,在document template infomation中设置你的文档类名,程序将自动在ctestapp::initinstance()中添加如下代码:
csingledoctemplate* pnewdoctemplate = new csingledoctemplate(
idr-dataview-tmpl,
runtime-class(ctestdoc),
//document class
runtime-class(cmainframe),
//frame class
runtime-class(cdataview));
//view class
);
adddoctemplate(pnewdoctemplate);
2、同样建立另一个窗口cpictureview类。
二、消除程序启动时出现的文档选择对话框
程序启动时一般要新建一个文档开始工作,如果有多个视图/文档,就会弹出一个对话框来询问。修改的方法是不让vc选择新文档类型,即把ctestapp::ctestapp()中的语句
if (!processshellcommand(cmdinfo)) return false;
更改为m_pdoctemplate→opendocumentfile(null),即可。
三、建立拆分窗口
加载cmainframe类的oncreateclient虚函数,代码如下:
bool cmainframe::oncreateclient(lpcreatestruct lpcs, ccreatecontext* pcontext)
{
// todo: add your specialized code here and/or call the base class
橡物敬 if(!m_wndsplitter.createstatic(this,1,2))
return false;
if(!m_wndsplitter.createview(0,0,runtime-class(ccommandview),csize(300,300),pcontext))
return false;
if(!m_wndsplitter.createview(0,1,runtime-class(cdataview),csize(250,250),pcontext))
return false;
return true;
有两种方法拆分窗口,分为静态(createstatic)和动态(create)。上面的即是静态方法。在动态拆分窗口中,视图通常为同样的类;在静态拆分窗口中通常为不同的类,因此作用更为广泛。
四、进行窗口切换
其实在某个面板中从窗口a切换到窗口b很简单,步骤如下:
1、获得面板所在框架的句柄pmainframe;
利用csplitterwnd类进行窗口切换必须在框架中进行。
2、从面板中删除原窗口,使用deleteview()方法;
3、从面板中创建目标窗口,使用createview()方法梁慎;
4、重新布置刷新窗口。
具体代码如下:
ctestapp* myapp=(ctestapp*)afxgetapp();
cmainframe* pmainframe=(cmainframe*)myapp→m_pmainwnd;
pmainframe→m_wndsplitter.deleteview(0,1);
pmainframe→m_wndsplitter.createview(0,1,runtime_class(cpictureview),
csize(50,50),null);
pmainframe→m_wndsplitter.recalc
layout();
根据以上做法,即可顺利完成多窗口的切换。
用CSplitterWnd类实现,单文档可以实现的液厅。参考二楼的代码,当然删除创建或者是用隐藏显示(设顷兄置分窗口大小)都能做雀埋袭到。