如何做到Spliter左边TreeView右边是FormView(多个)???

zwok 2000-07-21 11:32:00
如何做到Spliter左边TreeView右边是Form View,
点击左边TreeView的项目后能够动态改变右边不同的FormView?
请高手给出简单代码示例。

100分奉送,先到先得,说话算话。
...全文
320 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jackzhu 2000-07-21
  • 打赏
  • 举报
回复
1 创建
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
m_wndSplitter.CreateStatic(this,1,2);
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CYourTree),
CSize(300,0),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CYourView1),
CSize(0,0),pContext);
return TRUE;
}

2 用树更换消息切换view
m_wndSplitter.DeleteView(0, 1);
if (!m_wndSplitter.CreateView(0, 1,
RUNTIME_CLASS(CYourView1), CSize(0, cyText), NULL))
return;
m_wndSplitter.RecalcLayout( );
m_wndSplitter.UpdateWindow( );
dzl 2000-07-21
  • 打赏
  • 举报
回复

刚巧我也在做一个类似的项目,现择录如下:

1.由ClassWizard生成SDI框架,View由CFormView派生。

2.通过Insert/new class定义新类CYourTree,由CTreeView派生。

3.拆分
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
m_wndSplitter.CreateStatic(this,1,2);
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CYourTree),
CSize(300,0),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CYourView),
CSize(0,0),pContext);
return TRUE;
}
当然,要加入相关类的.h文件及定义成员m_wndSplitter。

4.初始化
加入成员
CTreeCtrl* m_pViewTree;
CImageList m_imageList;
加入图标
int CYourTree::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeView::OnCreate(lpCreateStruct) == -1)
return -1;

CTreeCtrl* m_pViewTree=&GetTreeCtrl();
m_pViewTree->ModifyStyle(0,TVS_HASLINES|TVS_LINESATROOT
|TVS_HASBUTTONS|TVS_EDITLABELS);

HICON hIcon[4];
int n;
m_imageList.Create(16,16,0,8,8);
hIcon[0]=AfxGetApp()->LoadIcon(IDI_FOLDER_CLOSE);
hIcon[1]=AfxGetApp()->LoadIcon(IDI_FOLDER_OPEN);
hIcon[2]=AfxGetApp()->LoadIcon(IDI_DOCUMENT);
hIcon[3]=AfxGetApp()->LoadIcon(IDI_DOCUMENT2);
for(n=0;n<4;n++){m_imageList.Add(hIcon[n]);}
m_pViewTree->SetImageList(&m_imageList, TVSIL_NORMAL);

return 0;
}

5.在CYourTree类的OnInitialUpdate函数中向TREE加入Item

void CYourTree::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
// tree structure common values
TV_INSERTSTRUCT tvinsert;
tvinsert.hInsertAfter = TVI_LAST;
tvinsert.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE |
TVIF_TEXT;
tvinsert.item.hItem = NULL;
tvinsert.item.state = 0;
tvinsert.item.stateMask = 0;
tvinsert.item.cchTextMax = 6;
//tvinsert.item.iSelectedImage = 0;
tvinsert.item.cChildren = 0;
tvinsert.hParent = NULL;
tvinsert.item.pszText = "abc";
tvinsert.item.iImage = 1;
tvinsert.item.iSelectedImage = 1;
tvinsert.item.lParam = data_point; //在这里加入指向数据的指针
m_hItem=m_pViewTree->InsertItem(&tvinsert);
//根据需要,加入其他的ITEM
}

6.根据需要编辑IDD_YOUR_FORM对话框

7.当用户选择Tree中的选项时,响应
void CYourTree::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
HTREEITEM m_hItem;
UINT m_nItemID;

if ((m_hItem=m_pViewTree->GetSelectedItem())!=NULL){
m_nItemID=m_pViewTree->GetItemData(m_hItem); //取得指向数据的指针

//由取得的指针获得项目数据,由你自己加

CYourDoc* pDoc=(CYourDoc*)GetDocument();
pDoc->m_name=m_name;//更新文档数据
... ...

pDoc->UpdateAllViews(this);//更新其他View类的显示}
*pResult = 0;
}

8.更新FormView
void CYourView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
CYourDoc* pDoc=(CYourDoc*)GetDocument();
m_name=pDoc->m_name;
... ...
UpdateData(FALSE);
}
zwok 2000-07-21
  • 打赏
  • 举报
回复
感谢两位热情的回答,尤其是dzl
但您差一条没有写出来,就是如何切换不同的VIEW,
所以小弟将高分给JackZhu了。

JackZhu回答的正好切中要害。

非常感谢两位大侠!!!!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧