欢迎访问:常州市武进区嘉泽中心小学网站 !今天是:
栏目列表
您现在的位置是:首页>>教师>>计算机技术>>程序设计>>杂项>>文章内容
实战静态拆分视图(二)
发布时间:2008-11-20   点击:   来源:本站原创   录入者:佚名
 

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

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;

       }


附件:
    关闭窗口
    打印文档
    账号登录
    保持登录 忘记密码?
    账号与武进教师培训平台同步