MFC下分割窗口

来源:互联网 发布:mac桌面文件夹被隐藏 编辑:程序博客网 时间:2024/04/28 03:10

1. 在 MainFrm.h 文件中在CMainFrame 类内定义一个成员对象: CSplitterWnd m_wndSplitter;。点击资源视图,在Dialog下插入两个个Dialog窗口用于稍后的分割后的窗 口(一般在新建项目时已经生成一个,只需再添加一个Dialog即可),ID号分别改为“IDD_TIANDITONGXUN_C_FORM_L”和“IDD_TIANDITONGXUN_C_FORM_R”,并分别将这两个对话框的Border设置为None,Style设置为Child。单击ClassView标签,在项目名称上点击右键,选择“添加”,再选择“类”,在新弹出的对话框中单击“MFC类”,直接点击右下方“添加”键,在新弹出的对话框中,类名设置为CTianDiTongXun_CView_R,类选择CFormView,基类选择CFormView,对话框ID选择IDD_TIANDITONGXUN_C_FORM_R,单击完成即可。另一个类一般已自动生成并关联。


2. 在 Class View 类视图中找到CMainFrame 类,右键点击,在右键菜单中选择属性,就会显示属性页,然后在属性页的工具栏上点击“重写”按钮,下面的列表中就列出了能够重载的函数,找到 OnCreateClient 函数后,点击生成重载函数。


3.在 MainFrm.cpp 文件中找到刚重载的OnCreateClient 函数进行修改。在 MainFrm.cpp 文件中添加#include "TianDiTongXun_CView_L.h" 和#include"TianDiTongXun_CView_R.h",在 E TianDiTongXun_CView_L.h文件中添加#include " TianDiTongXun_CViewDoc.h",另一头文件也同理加上(注,TianDiTongXun_CViewDoc.h文件只有一个)。最终 OnCreateClient 函数修改如下:

 

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCTlpcs, CCreateContext* pContext)

{

  CRect rc;

  // 获取框架窗口客户区的CRect 对象

 GetClientRect(&rc);

 

  // 创建静态分割窗口,两行一列

  if(!m_wndSplitter.CreateStatic(this, 2, 1))

 return FALSE;

 

  // 创建上面窗格中的视图

  if(!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CTianDiTongXun_CView_L),CSize(rc.Width(), rc.Height()/2), pContext))

 return FALSE;

 

  // 创建下面窗格中的视图

  if(!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CTianDiTongXun_CView_R),CSize(rc.Width(), rc.Height()/2), pContext))

 return FALSE;

 

 return TRUE;

 

 //return CFrameWndEx::OnCreateClient(lpcs, pContext);

 }

 

说明:1.新开的每一个窗口都是用m_wndSplitter.CreateView函数来设着其大小的。

               如:if (!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CExample34View),CSize(rc.Width(), rc.Height()/2), pContext));中CreateView的第一和第二个参数为当前此句要设计的窗口编号,这里是第2行第1列(是从0开始计数的);CSize函数为设置当前区域的尺寸,其中Height为高度,Width为宽度,如:rc.Width(), rc.Height()/2)意思为宽度为整个客户区,高度为整个客户区的高度的1/2,其中rc为整个客户区。

           2.代码中红色区域为要改的部分。

           3. RUNTIME_CLASS(CTianDiTongXun_CView)中括号内的类名,即为相应对话框ID所关联的类名,注意修改。

           4.下面是3行4列的代码:

 

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext*pContext)

{

     // TODO: 在此添加专用代码和/或调用基类

     CRect rc;

     // 获取框架窗口客户区的CRect 对象

     GetClientRect(&rc);

 

     // 创建静态分割窗口,两行一列

     if(!m_wndSplitter.CreateStatic(this, 3, 4))

              return FALSE;

 

     // 创建上面窗格中的视图

     if(!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CTianDiTongXun_CView),CSize(rc.Width()/4, rc.Height()/3), pContext))

              return FALSE;

 

     // 创建下面窗格中的视图

     if(!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CTianDiTongXun_CView),CSize(rc.Width()/4, rc.Height()/3), pContext))

              return FALSE;

 

     if(!m_wndSplitter.CreateView(0, 2, RUNTIME_CLASS(CTianDiTongXun_CView),CSize(rc.Width()/4, rc.Height()/3), pContext))

              return FALSE;

     if(!m_wndSplitter.CreateView(0, 3, RUNTIME_CLASS(CTianDiTongXun_CView),CSize(rc.Width()/4, rc.Height()/3), pContext))

              return FALSE;

 

     // 创建上面窗格中的视图

     if(!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CTianDiTongXun_CView),CSize(rc.Width()/4, rc.Height()/3), pContext))

              return FALSE;

 

     // 创建下面窗格中的视图

     if(!m_wndSplitter.CreateView(1, 1, RUNTIME_CLASS(CTianDiTongXun_CView),CSize(rc.Width()/4, rc.Height()/3), pContext))

              return FALSE;

 

     if(!m_wndSplitter.CreateView(1, 2, RUNTIME_CLASS(CTianDiTongXun_CView),CSize(rc.Width()/4, rc.Height()/3), pContext))

              return FALSE;

     if(!m_wndSplitter.CreateView(1, 3, RUNTIME_CLASS(CTianDiTongXun_CView),CSize(rc.Width()/4, rc.Height()/3), pContext))

              return FALSE;

     // 创建上面窗格中的视图

     if(!m_wndSplitter.CreateView(2, 0, RUNTIME_CLASS(CTianDiTongXun_CView),CSize(rc.Width()/4, rc.Height()/3), pContext))

              return FALSE;

 

     // 创建下面窗格中的视图

     if(!m_wndSplitter.CreateView(2, 1, RUNTIME_CLASS(CTianDiTongXun_CView),CSize(rc.Width()/4, rc.Height()/3), pContext))

              return FALSE;

 

     if(!m_wndSplitter.CreateView(2, 2, RUNTIME_CLASS(CTianDiTongXun_CView),CSize(rc.Width()/4, rc.Height()/3), pContext))

              return FALSE;

     if(!m_wndSplitter.CreateView(2, 3, RUNTIME_CLASS(CTianDiTongXun_CView),CSize(rc.Width()/4, rc.Height()/3), pContext))

              return FALSE;

 

    

     return TRUE;

 

     //returnCFrameWndEx::OnCreateClient(lpcs, pContext);

}

4. 如果大家想创建在其中某个窗格中再嵌套分割窗口(如下图),那么就需要在 MainFrm.h 文件中为 CMainFrame 类再定义一个成员对象: CSplitterWnd m_wndSplitter2;。即在分割窗口时,只能等行等列的分割,如下图这种两列不同行的分发只能分别定义两个成员变量,左边、右边分别对应一个变量,右边的变量再分割成一个2行1列的窗口。

        

      详细操作过程如下:

     1.定义两个CSplitterWnd类的对象。

     2.新建2个对话框,并关联相应类。

     3.在MainFrm.cpp中加入相应的头文件。

     4.生成OnCreateClient函数。

     5.修改OnCreateClient函数,(未完待续)

  参考文章:

http://blog.sina.com.cn/s/blog_6cc1c52d01011usd.html

http://www.cnblogs.com/fjchenqian/archive/2009/04/08/1431338.html



0 0
原创粉丝点击