您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 人事档案/员工关系 > 基于MFC的窗口拆分
1、MFC主要支持两种类型的窗口拆分:静态拆分和动态拆分。动态拆分:动态拆分窗口最多可以有两行两列,但它们可以相互拆分和合并。首先创建一个基于MFC的单文档工程,然后添加下面的代码,运行,就可以看到窗口动态拆分的效果。CSplitterWndm_wndSplitter;BOOLCMainFrame::OnCreateClient(LPCREATESTRUCT/*lpcs*/,CCreateContext*pContext){returnm_wndSplitter.Create(this,2,2,//TODO:调整行数和列数CSize(10,10),//TODO:调整最小窗格大小pContext);}另外,动态拆分也可以在创建工程的时候,在工程向导里面勾选拆分窗口的选项,上面的代码就会自动生成,然后点击菜单视图--拆分,就可以手动拆分。2、静态拆分:静态拆分窗口的行列数在拆分窗口被创建时就设置好了,用户不能更改。但是用户可以缩放各行各列。一个静态拆分窗口最多可以包含16行16列。静态拆分的过程:静态拆分窗口是用CsplitterWnd::CreateStatic而不是CsplitterWnd::Create创建,并且由于MFC不会自动创建静态拆分窗口中显示的视图,所以您要亲自在CreateStatic返回之后创建视图。CsplitterWnd为此提供了名为CreateView的函数。1).在父框架中嵌入一个CSplitterWnd成员变量。2).重载父框架的CFrameWnd::OnCreateClient成员函数。3).从重载的OnCreateClient函数中调用类CSplitterWnd的Create或CreateStatic成员函数,并调用CreateView来创建视图。3、关键函数介绍:BOOLCreateStatic(CWnd*pParentWnd,intnRows,intnCols,DWORDdwStyle=WS_CHILD|WS_VISIBLE,UINTnID=AFX_IDW_PANE_FIRST);函数有5个参数,意义如下:●pParentWnd:切分窗口的父窗口指针●nRows:水平方向分隔窗口的数目●nCols:垂直方向分隔窗口的数目●dwStyle:切分窗口的风格●nID:子窗口的ID值,默认为系统定义的AFX_IDW_PANE_FIRST返回值:如果创建成功,返回非零值(TRUE),否则返回0(FALSE)。m_wndSplitter.CreateStatic(this,2,1);//切分为2行1列virtualBOOLCreateView(introw,intcol,CRuntimeClass*pViewClass,SIZEsizeInit,CCreateContext*pContext);函数有5个参数,意义如下:●row:窗格的行标,从0开始●col:窗格的列标,从0开始●pViewClass:视图的执行期类CRuntimeClass指针,可以用宏RUNTIME_CLASS获得●sizeInit:一个SIZE(或者CSize)类型的数据,指定窗格的初始大小●pContext:一般是由父窗口传递过来,包含窗口的创建信息返回值:如果创建成功,返回非零值(TRUE),否则返回0(FALSE)。m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTest),CSize(190,100),pContext)静态窗口分割实例:新建一个基于MFC的单文档工程,并添加3个基于FormView的MFC视图类CFormView11、CFormView12和CFormView13,并添加CSplitterWndm_wndSplitter;然后添加下面的代码:BOOLCMainFrame::OnCreateClient(LPCREATESTRUCT/*lpcs*/,CCreateContext*pContext){CRectrt;GetClientRect(&rt);//创建切分窗口m_wndSplitter.CreateStatic(this,1,3);//为切分窗口创建视图m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CFormView11),CSize(100,rt.Height()),pContext);m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CFormView12),CSize(500,rt.Height()),pContext);m_wndSplitter.CreateView(0,2,RUNTIME_CLASS(CFormView13),CSize(0,rt.Height()),pContext);m_wndSplitter.SetColumnInfo(0,200,150);m_wndSplitter.SetColumnInfo(1,500,400);//重新显示该分隔器窗口m_wndSplitter.RecalcLayout();returntrue;}运行,就可以看到窗口分割的效果。窗口上的那些控件,可以打开资源视图-Dialog-进行添加,跟基于Dialog添加控件一样。如果你想将上面的某一列的窗口进行二次拆分,添加一个基于FormView的视图窗口类CFormView14,然后添加CSplitterWndm_wndSplitter1;再添加下面的代码m_wndSplitter.DeleteView(0,2);//记住这一句必须要,负责自己试试,呵呵。。。if(!m_wndSplitter1.CreateStatic(&m_wndSplitter,2,1,WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0,2))){returnFALSE;}if(!m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CFormView14),CSize(rt.Width()/2,rt.Height()/2),pContext)){returnFALSE;}if(!m_wndSplitter1.CreateView(1,0,RUNTIME_CLASS(CFormView14),CSize(0,0),pContext)){returnFALSE;}运行,你就可以看到上面的效果图,呵呵。。。是不是很简单。
本文标题:基于MFC的窗口拆分
链接地址:https://www.777doc.com/doc-2570875 .html