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

Posted 视图

篇首语:知识可羡,胜于财富。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 VC++ 6.0中实现三叉切分窗口与多视图相关的知识,希望对你有一定的参考价值。

VC++ 6.0中实现三叉切分窗口与多视图  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

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

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

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

  二 实例

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

  实现步骤:

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

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

  CinfoView 基类为列表视图类ClistView

  CLineView 基类为表单视图类CFormView

  CMyEditView 基类为编辑视图类CEditView

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

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

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

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

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

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

  WS_CHILD | WS_VISIBLE UINT nID = AFX_IDW_PANE_FIRST );

  函数有 个参数 意义如下:

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

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

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

  ● dwStyle:切分窗口的风格

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

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

  m_wndSplitter CreateStatic(this ); // 切分为 行 列

   使用CreateView产生每个视图窗口

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

  函数有 个参数 意义如下:

  ● row:窗格的行标 从 开始

  ● col:窗格的列标 从 开始

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

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

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

  返回值:如果创建成功 返回非零值(TRUE) 否则返回 (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_wndSplitter CreateStatic(this //父窗口指针

   // 切分的行数

   ); // 切分的列数

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

  m_wndSplitter CreateView( // 窗格的行 列序数

  RUNTIME_CLASS(CTestView) //视图类

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

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

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

  m_wndSplitter CreateView(

  RUNTIME_CLASS(CMyEditView)

  CSize(rect Width() rect Height()/ )

  pContext);

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

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

   

  在这里需注意 点:

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

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

  #include TestView h

  #include MyEditView h

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

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

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

  代码如下:

  

  int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)

  

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

  return ;

  // TODO: Add your specialized creation code here

  CRect rect;

  GetClientRect(&rect);

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

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

  //产生二次静态切分

  m_wndSplitter CreateStatic(this );

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

  m_wndSplitter CreateView( // 窗格的行 列序数

  RUNTIME_CLASS(CLineView) //视图类

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

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

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

  m_wndSplitter CreateView(

  RUNTIME_CLASS(CInfoView)

  CSize( )

  pContext);

  return ;

  

 

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

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

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

  

  void CTestView::SwitchView()

  

  CRect rect;

  GetClientRect(&rect);

  int cx = rect Width();

  int cy = rect Height();

  m_wndSplitter MoveWindow( cx cy+ );

  m_wndSplitter SetColumnInfo( cx/ );

  m_wndSplitter SetColumnInfo( cx cx/ );

  m_wndSplitter RecalcLayout();

   

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

  由 个参数 意义如下:

  ● col:切分窗口的列标识

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

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

  本示例的运行结果如下:

  三 总结

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

cha138/Article/program/net/201311/13984

相关参考

知识大全 用VC 6.0实现串行通信的三种方法

用VC6.0实现串行通信的三种方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!中国科学院王颖  

知识大全 我想下一个vc 6.0 找不到下载地址 向大神们求助

我想下一个vc6.0找不到下载地址向大神们求助你要的文件如下:我想下载那个视频能在网上看,但是找不到下载地址。有什么方法找到下载地址啊将那个视频的地址复制到这个网站解析一下看能不能获得下载地址。:fl

知识大全 使用VC6.0实现窗口的任意分割

使用VC6.0实现窗口的任意分割  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  使用VC实现窗口

知识大全 VC++.NET开发环境整合技巧

VC++.NET开发环境整合技巧  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  主窗口内的每一个

知识大全 用JavaScript实现字符串切分功能

用JavaScript实现字符串切分功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishix

知识大全 word2003 为何只能打开一个文档

word2003为何只能打开一个文档?打开新的文档后原先打开的为何文档窗口就没了工具--选项--视图--显示,启动任务窗格,去勾,任务栏中的窗口,勾选wps能打开word2003文档吗可以的,wps必

下列视图方式中,可以显示出页眉页脚的是

下列视图方式中,可以显示出页眉页脚的是_____。A、普通视图B、Web视图C、大纲视图D、页面视图答案:D解析:页眉页脚只在页面视图模式下显示,故选D。

知识大全 视图刷新过程中出现的约束冲突问题

  本文中我们通过实例的方法来帮助您理解物化视图刷新过程中出现的约束冲突问题  即使将物化视图的约束建立和基表完全一致由于物化视图的刷新机制也会产生约束冲突的现象  以下是一个简单的示例    SQL

知识大全 理解物化视图刷新过程中出现的约束冲突

  本文通过实例的方法来帮助您理解物化视图刷新过程中出现的约束冲突问题  即使将物化视图的约束建立和基表完全一致由于物化视图的刷新机制也会产生约束冲突的现象  一个简单的例子  >  上面构造了一个简

知识大全 查看视图中哪里字段是允许更新的直接方法

  前言  之前曾经编写过一篇关于多表可更新视图的文章而事实上ORACLE并不是要求所有的可更新视图都需要带触发器  只要要求更新的字段属于同一张数据表(简称更新表而且其它表与更新表是正常的关联关系则