VC++ 6.0中实现三叉切分窗口与多视图现

2016-02-19 18:43 36 1 收藏

关注图老师设计创意栏目可以让大家能更好的了解电脑,知道有关于电脑的更多有趣教程,今天给大家分享VC++ 6.0中实现三叉切分窗口与多视图现教程,希望对大家能有一点小小的帮助。

【 tulaoshi.com - 编程语言 】

  一、引用

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

  切分窗口分为动态切分窗口和静态切分窗口,它们都是由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:一般是由父窗口传递过来,包含窗口的创建信息

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  返回值:如果创建成功,返回非零值(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:列的最小宽度,单位为像素

  本示例的运行结果如下:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  三、总结

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

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

来源:http://www.tulaoshi.com/n/20160219/1618765.html

延伸阅读
概述 管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。匿名管道(Anonymous Pipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信...
在VC++实现数据加密 作者:惠州市东晓电子有限公司 龚辉斌 下载本文示例源代码 为了保证数据的安全性与完整性,常常要对数据进行加密,在数据传输过程进行数据加密可以防止中途非法截获。我们通常称原始数据叫做源文,用约定的加密算法进行加密处理。加密算法的输入是源文与加密键,而输出的则是密文...
三叉神经炎 三叉神经炎如何治疗 三叉神经炎,其主要是因为三叉神经周围感染性炎症疾病所引起的一种疾病。那患上三叉神经炎的时候,会出现哪些症状表现呢?三叉神经炎的治疗方法又有哪些呢?今天图老师小编就来为大家一一介绍一下。感兴趣的朋友就来看一下吧。 三叉神经炎症状 相信大家都知道,患上疾病都会出现...
实现类似VC中可设断点的编辑窗口 作者: cuick 下载本文示例源代码 运行效果图如下: 想做一个跟踪调试工具,于是到网上找类似VC可设置断点的EditView,可惜没找到(呵呵,俺E文不好,没去国外站点找)。那就自己做一个吧!! 唉!!为了这个小东西俺可是...
在Office2000中,就用户界面丰富程度而论,Word以56个工具栏(Toolbar)、50个弹出式菜单(Popup Menu)雄居首位,但Excel(工具栏40个、弹出式菜单51个)和PowerPoint(工具栏43个、弹出式菜单25个)也相差不远。大多数用户可能从来没有见过所有这些工具栏,甚至许多用户不知道Office提供了这么多命令工具。 虽然我们可以用菜单隐藏...

经验教程

388

收藏

76
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部