zoukankan      html  css  js  c++  java
  • VS2010-MFC(文档、视图和框架:分割窗口)

    转自:http://www.jizhuomi.com/software/226.html

    上一节讲了文档、视图和框架结构中各对象之间的关系,本节主要讲讲在MFC中如何分割窗口。

          分割窗口概述

          分割窗口,顾名思义,就是将一个窗口分割成多个窗格,在每个窗格中都包含有视图,或者是同一类型的视图,或者是不同类型的视图。

           MFC分割窗口的方式有两种,动态分割和静态分割。

           动态分割窗口通常用于创建同一个文档对应的多个视图,而且这些视图一般都是同一类型的视图,能够在用户编辑文档的不同部分时提供方便。

           大家看下Word里的动态分割窗口就很明白了,以Word 2007文档为例,在菜单中点击“视图”->“拆分”,就可以看到一条随鼠标移动的分隔条,当我们在文档中某个位置按下鼠标左键时,分割条就固定了下来,生成了上下两个分割窗格,通过滚动每个窗格中的垂直滚动条可以看到,两个窗格中的内容相同,这就是所说的对应同一个文档的同一类视图。

           动态分割窗口最多可以有两行两列。

           静态分割窗口比较常见。我们经常能看到某个软件打开后,界面窗口默认被分割成了几个窗格,这就是静态分割窗口。

           静态分割窗口指在窗口创建时,分割的窗格就已经生成了,而且用户不能改变窗格的数量和顺序。静态分割窗口最多支持16行16列。通常静态分割窗口的每个窗格中包含不同类的视图,当然也可以是同一类的视图。

           CSplitterWnd类

           MFC中的分割窗口类-CSplitterWnd类提供了分割窗口的功能。CSplitterWnd类中包含一个分割器窗口,该分割器窗口就是一个包含多个窗格的窗口。我们分割窗口时就是直接在此分割器窗口中分割的。

           下面介绍三个最常用的成员函数:

    C++代码
    virtual BOOL Create(   
       CWnd* pParentWnd,   
       int nMaxRows,   
       int nMaxCols,   
       SIZE sizeMin,   
       CCreateContext* pContext,   
       DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT,   
       UINT nID = AFX_IDW_PANE_FIRST    
    );  

           创建动态分割窗口。参数pParentWnd为分割器窗口的父框架窗口;参数nMaxRows为分割器窗口的最大行数,不能超过2;参数nMaxCols为分割器窗口的最大列数,也不能超过2;参数sizeMin为窗格能显示的最小尺寸,如果窗格尺寸小于sizeMin则不显示;参数pContext为指向CCreateContext结构的指针,大多数情况下可以赋值为父框架窗口的pContext;参数dwStyle指定窗口风格;参数nID为分割窗口的ID,除非分割器窗口嵌入到另一个分割器窗口中,否则可以取值AFX_IDW_PANE_FIRST。

    C++代码
    virtual BOOL CreateStatic(   
       CWnd* pParentWnd,   
       int nRows,   
       int nCols,   
       DWORD dwStyle = WS_CHILD | WS_VISIBLE,   
       UINT nID = AFX_IDW_PANE_FIRST    
    ); 

           创建静态分割窗口。参数pParentWnd、dwStyle和nID同上;参数nRows为行数,不能超过16;参数nCols为列数,同样不能超过16。

    C++代码
    virtual BOOL CreateView
    (   
       int row,   
       int col,   
       CRuntimeClass* pViewClass,   
       SIZE sizeInit,   
       CCreateContext* pContext    
    ); 

           为静态分割窗口创建窗格视图。参数row指定分割器窗口中放置新视图的行;参数col指定放置新视图的列;参数pViewClass指定新视图的CRuntimeClass对象;参数sizeInit指定新视图的初始大小;参数pContext为指向CCreateContext结构的指针,通常可以赋值为传递给父框架窗口的重载函数CFrameWnd::OnCreateClient的pContext参数值。

           动态分割窗口

           创建动态分割窗口的步骤为:

           1. 在父框架类中定义一个CSplitterWnd类型的成员对象。

           2. 重载父框架类的CFrameWnd::OnCreateClient成员函数。

           3. 在重载的CFrameWnd::OnCreateClient函数中调用CSplitterWnd成员对象的Create函数。

           下面给大家演示一个实例。同样以VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)中创建Example34工程为例,我们要实现在主框架窗口的客户区中创建两行两列的动态分割窗口。以下是创建动态分割窗口的具体步骤:

           1. 在MainFrm.h文件中为CMainFrame类添加成员对象:CSplitterWnd m_wndSplitter;。

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

           3. 在MainFrm.cpp文件中找到刚重载的OnCreateClient函数修改如下:

    C++代码
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)   
    {   
     // TODO: Add your specialized code here and/or call the base class   
     // 创建动态分割窗口,两行两列   
     return m_wndSplitter.Create(this,2, 2, CSize(10, 10), pContext);   
      
     //return CFrameWndEx::OnCreateClient(lpcs, pContext);   
    }  
     

           4. 在Resource View资源视图中,打开Menu下的IDR_MAINFRAME菜单,在View下添加一个菜单项,Caption设为Splitter Window,ID设为(一定要设为)ID_WINDOW_SPLIT。这样在运行结果界面中点击此菜单项时MFC会执行一些操作显示动态分割窗口。

           5. 运行程序,点击菜单中的View->Splitter Window菜单项,创建动态分割窗口后效果如下:

     

     

     

           静态分割窗口

           创建静态分割窗口的步骤为:

           1. 在父框架类中定义一个CSplitterWnd类型的成员对象。

           2. 重载父框架类的CFrameWnd::OnCreateClient成员函数。

           3. 在重载的CFrameWnd::OnCreateClient函数中调用CSplitterWnd成员对象的CreateStatic成员函数,然后可以调用CSplitterWnd成员对象的CreateView成员函数为每个窗格创建视图。 

           下面仍通过Example34工程给大家一个实例,目的是在主框架窗口中的客户区创建一个两行一列的静态分割窗口。如果已经试验过动态分割窗口的创建,那么麻烦撤销那些修改吧。创建静态分割窗口的具体步骤如下:

           1. 在MainFrm.h文件中为CMainFrame类添加成员对象:CSplitterWnd m_wndSplitter;。

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

           3. 在MainFrm.cpp文件中找到刚重载的OnCreateClient函数进行修改。因为鸡啄米没有新建其他视图类,所以上下两个窗格的视图都是CExample34View。为了能识别CExample34View类,还需在MainFrm.cpp文件中添加#include "Example34View.h",在Example34View.h文件中添加#include "Example34Doc.h"。最终OnCreateClient函数修改如下:

    C++代码
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)   
    {   
        // TODO: Add your specialized code here and/or call the base class   
        CRect rc;   
      
        // 获取框架窗口客户区的CRect对象   
        GetClientRect(&rc);   
      
        // 创建静态分割窗口,两行一列   
        if (!m_wndSplitter.CreateStatic(this, 2, 1))   
            return FALSE;   
      
        // 创建上面窗格中的视图   
        if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext))   
            return FALSE;   
      
        // 创建下面窗格中的视图   
        if (!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext))   
            return FALSE;   
      
        return TRUE;   
      
        //return CFrameWndEx::OnCreateClient(lpcs, pContext);   
    }  
     

           4. 运行程序,在结果界面中关掉其他面板后效果如下:

     

     

     

           如果大家想创建在其中某个窗格中再嵌套分割窗口,那么就需要再定义一个CSplitterWnd对象,以父窗格所在的CSplitterWnd对象为父框架窗口创建分割窗口即可。

  • 相关阅读:
    1094. Car Pooling
    121. Best Time to Buy and Sell Stock
    58. Length of Last Word
    510. Inorder Successor in BST II
    198. House Robber
    57. Insert Interval
    15. 3Sum java solutions
    79. Word Search java solutions
    80. Remove Duplicates from Sorted Array II java solutions
    34. Search for a Range java solutions
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/9471466.html
Copyright © 2011-2022 走看看