新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 C/C++编程思想 』 → 如何通过VC++来实现三叉切分窗口与多视图? 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 3706 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 如何通过VC++来实现三叉切分窗口与多视图? 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     葛靖青001 美女呀,离线,快来找我吧!水瓶座1984-2-14
      
      
      等级:大三(研究MFC有点眉目了!)
      文章:168
      积分:595
      门派:XML.ORG.CN
      注册:2010/11/2

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给葛靖青001发送一个短消息 把葛靖青001加入好友 查看葛靖青001的个人资料 搜索葛靖青001在『 C/C++编程思想 』的所有贴子 点击这里发送电邮给葛靖青001 引用回复这个贴子 回复这个贴子 查看葛靖青001的博客楼主
    发贴心情 如何通过VC++来实现三叉切分窗口与多视图?

    【转自互联网】
    一、引用

      当用户需要同时对文当的不同部分进行编辑时,常常会用到切分窗口;这些窗口可以都是相同的视,或者一个窗口为列表视,而另一个为树型视图。应用程序框架有多种方式来表示多视图,切分窗口是其中的方式之一。

      切分窗口分为动态切分窗口和静态切分窗口,它们都是由CsplitterWnd类(MFC类库)来实现的,在这两种表示方式中,创建同一视图类的对象是比较容易的(Cview),而在同一应用程序使用两个或更多的视图类(如:ClistView、CtreeView等),相对来说则要困难一些。

      动态切分功能多应用在编辑文本类的软件中,在实际的开发中,我们经常要用到的是静态切分功能。静态切分窗口是指在窗口创建时,切分窗口的窗格就已经创建好了,且窗格的数量和顺序不会改变,窗格为一个分隔条所分隔,用户可以拖动分隔条调整相应窗格的大小。静态切分窗口最多支持16行?16列的窗格,而且不同的窗格往往使用不同的视图类。本文主要阐述静态切分窗口。

      二、实例

      以单文档SDI应用程序为例,在框架客户区实现三叉切分窗口,且每个窗格使用不同的视图 。

      实现步骤:

      1、 利用VC++6.0 的AppWizard创建一个单文档SDI应用程序,项目名为Test。

      2、 使用New Class对话框添加新的视图类:

      CinfoView 基类为列表视图类ClistView

      CLineView 基类为表单视图类CFormView

      CMyEditView 基类为编辑视图类CEditView

      要点:在添加ClineView之前,需要先创建一个对话模板资源,ID为IDD_FORMVIEW,

      3、 在框架窗口类CMainFrame中声明一个CsplitterWnd类的成员变量m_wndSplitter1,用于第一次切分。

      4、 使用ClassWizard为框架窗口类添加OnCreateClient函数。

      注意:OnCreateClient函数的调用在OnCreate函数之后,在构造视图对象和产生视图窗口之前。

      5、 在OnCreateClient函数中调用CsplitterWnd::CreateStatic,产生静态切分。该函数的原形如下:

      BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle =

      WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST );

      函数有5个参数,意义如下:

      ● pParentWnd:切分窗口的父窗口指针

      ● nRows:水平方向分隔窗口的数目

      ● nCols:垂直方向分隔窗口的数目

      ● dwStyle:切分窗口的风格

      ● nID:子窗口的ID值,默认为系统定义的AFX_IDW_PANE_FIRST

      返回值:如果创建成功,返回非零值(TRUE),否则返回0(FALSE)。

      m_wndSplitter1.CreateStatic(this, 2,1); // 切分为2行1列

      6、 使用CreateView产生每个视图窗口

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

      函数有5个参数,意义如下:

      ● row:窗格的行标,从0开始

      ● col:窗格的列标,从0开始

      ● pViewClass:视图的执行期类CRuntimeClass指针,可以用宏RUNTIME_CLASS获得

      ● sizeInit:一个SIZE(或者CSize)类型的数据,指定窗格的初始大小

      ● pContext:一般是由父窗口传递过来,包含窗口的创建信息

      返回值:如果创建成功,返回非零值(TRUE),否则返回0(FALSE)。

      OnCreateClient函数的全部代码:

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

      {

      // TODO: Add your specialized code here and/or call the base class

      CRect rect;

      GetClientRect(&rect);

      //产生第一次静态切分

      m_wndSplitter1.CreateStatic(this, //父窗口指针

      2, // 切分的行数

      1); // 切分的列数

      //为第一个窗格产生视图

      m_wndSplitter1.CreateView(0,0, // 窗格的行、列序数

      RUNTIME_CLASS(CTestView),//视图类

      CSize(rect.Width(),rect.Height()-rect.Height()/5),//初始化大小

      pContext);//父窗口的创建参数

      //为第二个窗格产生视图

      m_wndSplitter1.CreateView(1,0,

      RUNTIME_CLASS(CMyEditView),

      CSize(rect.Width(),rect.Height()/5),

      pContext);

      return TRUE;//不再调用基类的OnCreateClient函数

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

      }

      在这里需注意3点:

      ① 必须为每个静态切分窗格创建视图窗口,不能漏掉一个;

      ② 必须包含相应的类的头文件,在MainFrm.cpp文件的开始包含一下头文件:

      #include "TestView.h"

      #include "MyEditView.h"

      ③产生静态切分后,就不能调用默认的基类的OnCreateClient函数。

      7、 在视图窗口类CTestView中声明一个CsplitterWnd类的成员变量m_wndSplitter2,用于第二次切分。

      8、 使用ClassWizard为视图窗口类CTestView添加OnCreate函数,在该函数中调用CreateStatic函数和CreateView函数,类似CMainFrame::OnCreateClient函数中的调用

      代码如下:

      int CTestView::OnCreate(LPCreateSTRUCT lpCreateStruct)

      {

      if (CView::OnCreate(lpCreateStruct) == -1)

      return -1;

      // TODO: Add your specialized creation code here

      CRect rect;

      GetClientRect(&rect);

      //获得窗口的创建信息指针

      CCreateContext *pContext = (CCreateContext*) lpCreateStruct->lpCreateParams;

      //产生二次静态切分

      m_wndSplitter2.CreateStatic(this,1, 2);

      //为第一个窗格产生视图

      m_wndSplitter2.CreateView(0,0,// 窗格的行、列序数

      RUNTIME_CLASS(CLineView),//视图类

      CSize(rect.Width()/4,rect.Height()),//初始化大小

      pContext);//父窗口的创建参数

      //为第二个窗格产生视图

      m_wndSplitter2.CreateView(0,1,

      RUNTIME_CLASS(CInfoView),

      CSize(1,1),

      pContext);

      return 0;

      }

      注意:二次切分的父窗口是第一次切分的第一个窗格,其视图类是CTestView

      9、使用ClassWizard为视图窗口类CTestView添加OnSize函数,在该函数中调用子函数

      SwitchView(),子函数的代码如下:

      void CTestView::SwitchView()

      {

      CRect rect;

      GetClientRect(&rect);

      int cx = rect.Width();

      int cy = rect.Height();

      m_wndSplitter2.MoveWindow(-2,-2,cx,cy+3);

      m_wndSplitter2.SetColumnInfo(0, cx/4,0);

      m_wndSplitter2.SetColumnInfo(1, cx-cx/4, 0);

      m_wndSplitter2.RecalcLayout();

      }

      该子函数主要用于设置二次切分后的各列信息,通过CSplitterWnd::SetColumnInfo函数实现,原型为:void SetColumnInfo( int col, int cxIdeal, int cxMin );

      由3 个参数,意义如下:

      ● col:切分窗口的列标识

      ● cxIdeal:列的实际宽度,单位为像素

      ● cxMin:列的最小宽度,单位为像素

      本示例的运行结果如下:

      三、总结

      切分窗口的形式和每个窗格所使用的视图类可以根据实际需要来确定,以满足程序的不同应用。本示例使用了三叉切分,视图类使用了列表视图类CListView、表单视图类CFormView、编辑视图类CEditView,在VC++6.0下调试通过。

      三叉切分的方法并不唯一,本文实例是我在实际开发中总结的一种方法,读者可以通过本例举一反三,掌握切分窗口与多视图相结合的精髓所在。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    ---人之所以能,是相信能!!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/11/29 10:27:00
     
     GoogleAdSense水瓶座1984-2-14
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 点击这里发送电邮给Google AdSense 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/12/22 1:14:14

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    62.012ms