注册通行证 用户名 密码
  • 文章投稿
  • 博客
  • 论坛
  • 设为首页
  • 加入收藏
jztop.com网络技术
  • 首页
  • | iT新闻
  • | 操作系统
  • | 组网建网
  • | 网络安全
  • | 程序开发
  • | 办公一族
  • | 工具软件
  • | 网页制作
  • | 多媒体制作
  • | 网吧技术
  • | 服务器
  • | 专题教程
Vista | 软件评测 | 系统备份 | 优化 | 进程 | 聊天 | 病毒 | Linux | 黑客 | 防火墙 | 数据库 | Web开发 | Java | Word | 游戏 | 32位开发 | 移动开发
当前位置:首页 > 程序开发 > 微软开发专栏 > VC.NET 内容正文:VC++ 6.0中实现三叉切分窗口与多视图现

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

发布时间:2006-09-01 11:58:47 来源:未知 网友评论 0 条

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

  一、引用

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

  切分窗口分为动态切分窗口和静态切分窗口,它们都是由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下调试通过。

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

相关文章
    无相关信息
【评论】【收藏本文】【打印】【关闭】
上一篇文章:漫谈Visual C#的组件设计方法
下一篇文章:在VC中实现画任意方向椭圆
讨论区
查看
已有 0 位对此新闻感兴趣的网友发表了看法
匿名发表
注册通行证 登陆
图文阅读推荐
用VC获取其它程序的命令行参数
用VC获取其它程序的命令行参数
用Visual C++设计QQ群管理工具
用Visual C++设计QQ群管理工具
推荐阅讯
  • VC.NET实现清爽便利的Windows游戏窗口
  • Visual C++ 2005图像编程之属性设置栏
  • Visual C#程序员面试基础问题和答案
  • 漫谈Visual C#的组件设计方法
  • Visual C# 诠释常用排序算法
  • VC++实现工具栏上添加平面组合框控件
  • Visual C++2003中DLL初学者指南
  • Visual C++ 2005图像编程之工具栏
  • VC中用DAO实现树型控件的数据库访问
  • VC中回调函数使用的变身大法
阅读排行
  • 1.VC++编程实现广告窗口自动关闭
  • 2.深入浅出VC++串口编程之基于控件
  • 3.解读VC++编程中的文件操作API和CFile类
  • 4.利用Visual C#实现ICMP网络协议
  • 5.深入浅出VC++串口编程之第三方类
  • 6.掀起你的盖头来——谈VC++对象模型
  • 7.Visual C#中用WMI控制远程计算机
  • 8.深入浅出VC++串口编程之基于Win32 API
  • 9.Visual C++2005中开发自定义绘图控件
  • 10.深入浅出VC++串口编程之基本概念
专题教程
  • 大话G游 专题:手机病毒揭密
  • ARP攻击防范与解决方案 路由故障处理手册
  • Picasa中文版_Picasa教程 专题:清除流氓软件
  • Firefox专题 seo搜索引擎优化专区
  • 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
  • 杀毒软件反被病毒杀 连"救命"都不能喊
  • 金山ARP防火墙
  • 还原卡神话破灭“机器狗”病毒来势汹汹
  • cctv经济半小时:你的手机现在安全吗?
  • 新挂马方式开始流行 ARP挂马称雄局域网
  • 木马和病毒清除的通用解法
  • IP地址不再冲突 查找ARP攻击者元凶
  • 教你几招识别和防御Web网页木马
  • 分析:封杀BT只是暂时的止痛药
  • QQ爆危险漏洞,“QQ游戏邀请大盗”邀请你玩病
关于我们 | 诚聘英才 | 联系我们 | 版权声明 | 网站大事 | 网站地图 | 意见建议
CopyRight 2005-2007 Jztop.Com 版权所有 未经许可 请勿转载