中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 综合文章
实战静态拆分视图(二)
作者:未知 时间:2005-07-10 12:12 出处:Blog 责编:chinaitpower
              摘要:暂无

下面以一个单文档程序为例,说明静态拆分视图的实现过程:

1.  首先建立一个单文档应用程序SplitWnd,视图CSplitWndView类型为列表视图。利用CSplitWndView ::OnInitialUpdate初始化列表视图。

2.  为该工程新增一个树型视图类CMyTreeView,并在该类中添加HTREEITEM类型的成员变量m_hSubTree[2],该成员变量用来保存树型视图的子树句柄。利用CMyTreeView ::OnInitialUpdate初始化树型视图,为该树型视图添加一个树根,两个子树,参考代码如下:

HTREEITEM hRoot = GetTreeCtrl().InsertItem(_T("树根"), 。。。, 。。。, TVI_ROOT);

m_hSubTree[0] = GetTreeCtrl().InsertItem(_T("子树1"), 。。。, 。。。, hRoot);  

m_hSubTree [1] = GetTreeCtrl().InsertItem(_T("子树2"), 。。。, 。。。, hRoot);

3.  在框架类中添加一个CSplitterWnd 类型的成员变量m_wndSplitter1,并重载OnCreateClient函数来拆分视图,代码如下:

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

{

if(!(m_wndSplitter1.CreateStatic(this, 1, 2) ) ||

              !(m_wndSplitter1.CreateView(0, 1, RUNTIME_CLASS(CSplitWndView), CSize(0,0), pContext) ) ||

              !(m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CMyTreeView), CSize(180 ,0), pContext) )

       {

              return FALSE;

       }

       return TRUE;

}

如果你设计的程序需要更多的拆分视图,可以再在框架类中添加CSplitterWnd 类型的成员变量m_wndSplitter2,再次利用CreateStatic拆分视图,代码如下:

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

{if(!(m_wndSplitter1.CreateStatic(this, 2, 1) ) ||

              !(m_wndSplitter1.CreateView(1, 0, RUNTIME_CLASS(CMyListView), CSize(0,0), pContext) ) ||

              !(m_wndSplitter2.CreateStatic(&m_wndSplitter1, 1, 2, WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0,0)) ) ||

              !(m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CMyTreeView), CSize(180 ,0), pContext) ) ||

              !(m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(CSplitWndView), CSize(0,0), pContext) )

       )

{

              return FALSE;

       }

       m_wndSplitter1.SetRowInfo(0, 350, 0);  //重新设置行宽

       m_wndSplitter1.RecalcLayout();

 

return TRUE;

}

现在基本的界面就建立好了,有关初始化列表视图的代码要根据具体情况来添加。另外,别忘记在框架.cpp中包含视图类的头文件。

为了视类之间的通讯,我们让这些视类共用一个文档类,现在来编写视图之间通讯的代码:

1.在文档类中添加int  m_nViewType,表示要显示的类型。当用户单击“子树1”或“子树2”时改变其值。

2.  建立树型视图通知TVN_SELCHANGED响应函数OnSelchanged,添加如下代码:

CSplitWndDoc* m_pDoc = (CSplitWndDoc*)GetDocument();

HTREEITEM hTmp = GetTreeCtrl().GetSelectedItem();  //得到当前选中的子树句柄

 

//m_pDoc->m_nViewType复位

m_pDoc->m_nViewType = 1000;

 

if(hTmp == m_hSubTree [0] && m_pDoc)

{

       m_pDoc->m_nViewType = 0;       //将显示类型设置为子树1

}

if(hTmp == m_hSubTree [1] && m_pDoc)   

{

m_pDoc->m_nViewType = 1;  //将显示类型设置为子树2

}

//在改变子树的情况下才刷新CSplitWndView视图

if(hTmp == m_hSubTree [0] || hTmp == m_hSubTree [1] && m_pDoc)

{

       //通知视图更新CSplitWndView

       m_pDoc->UpdateAllViews(this);

}

3.在CSplitWndView中重载OnUpdate函数,响应UpdateAllViews

CSplitWndDoc* pDoc = GetDocument();

GetListCtrl().DeleteAllItems();            //删除列表视图中的项

       switch(pDoc->m_nViewType)        //查看视图类型

       {

       case 0:

              //将与子树1相关的项添加到列表视图中

              break;

       case 1:

              //将与子树2相关的项添加到列表视图中

              break;

       }

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有