如何将一个TreeView类插入到另外一个视图中?

cheng19long 2006-11-07 10:54:34
本程序是我在VC知识库上看到的([ 本文属于第18期, 适合初级读者 ])
,仿OutLook的界面类CGfxOutBarCtrl,
这里是CGfxOutBarCtrl类成员函数:

int CGfxOutBarCtrl::AddFolderBar(const char * pFolder, CWnd * pSon, const DWORD exData)
{
CBarFolder * pbf = new CBarFolder(pFolder, exData);
ASSERT(pbf);
pbf->pChild = pSon;

arFolder.Add((void *)pbf);

return arFolder.GetSize() - 1;
}


CGfxOutBarCtrl wndBar;

在主框架类里面有以下代码:

wndBar.AddFolder( _T("查看"), 0);
wndBar.AddFolderBar( _T("注册表"), &wndTree); //这里是一个TreeList
wndBar.AddFolderBar( _T("文件"), &m_wnd); //这里的m_wnd是我要添加的TreeView类成员
----------------------------------------------------------
实现添加三个像QQ一样可以拉动的页面:
查看,
注册表
文件
-------------
我新建一个工程,做成一个资源管理器的样子,想把它添加进去,我是这样做的:
1。把资源管理器那个类(CDriveBrowser)加进去,
2。在那个资源管理器那个类(CDriveBrowser)里添加:
friend class MainFrm;
3. 在MainFrm里声明
CDriveBrowser m_wnd;
4. wndBar.AddFolderBar( _T("文件"), &m_wnd); //这里的m_wnd是我要添加的TreeView类成员

编译,错误如下:
static char THIS_FILE[] = __FILE__; 重定义

我就不知道怎么办了,一去掉,程序就会死

哪些高人指点一下



...全文
278 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheng19long 2006-11-11
  • 打赏
  • 举报
回复
就是第一步没做好,根据您的指示,我差不多改好了,

我不明白一般在文档里面都是用CTreeView类的,为什么你却用CTreeCtrl类呢??
折腾_苏州 2006-11-11
  • 打赏
  • 举报
回复
1. 首先 把CDriveBrowser改造成继承 自CTreeCtrl ,这里要去掉CTreeView的东西
2. 其次创建
m_wnd.Create(WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS,
CRect(0,0,0,0), &wndBar, 1011);

主要是第一步做好就OK了.........
cheng19long 2006-11-07
  • 打赏
  • 举报
回复
to: flyelf(空谷清音) ( ) 信誉:150 Blog
是运行时出现异常?
-------------------------
问一下,你说vc编程序会死是怎么一回事啊?有时候我只改一个空格或者其它无关紧要的东西,程序一编译就会死,只能强制结束,重新打开,再编又没有问题,这是哪里出了问题啊????
cheng19long 2006-11-07
  • 打赏
  • 举报
回复
全部代码已发到:
http://lw.68ab.com/work/work.rar
cheng19long 2006-11-07
  • 打赏
  • 举报
回复
原来两个工程单独都是可以运行的,

一个是仿outlook界面,另一个是资源管理器界面

头文件没有问题,我都加了,两个类不存在重复调用的问题,因为后面加进去的类在另一个工程中是可以运行的,不会调用第一个类

我新声明的m_wnd是加进去的:CDriveBrowser的成员函数,因为考虑到MainFrm类会调用m_wnd,我将MainFrm类声明为CDriveBrowser类的友元类

我在上面都说明了。

我把CDriveBrowser.cpp发上来吧,
=====================================================

BOOL CDriveBrowser::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
cs.style |= TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES;
return CTreeView::PreCreateWindow(cs);
}

void CDriveBrowser::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();

// TODO: Add your specialized code here and/or call the base class

CWinApp* pApp = AfxGetApp();

// ASSERT(m_pImageList != NULL); // serious allocation failure checking
m_pImageList.Create(16, 16, ILC_COLOR8 | ILC_MASK, 9, 9);

//加载图标
m_pImageList.Add(pApp->LoadIcon(ICO_CDDRV));
m_pImageList.Add(pApp->LoadIcon(ICO_CLSDFLD));
m_pImageList.Add(pApp->LoadIcon(ICO_DRIVE));
m_pImageList.Add(pApp->LoadIcon(ICO_FLOPPYDRV));
m_pImageList.Add(pApp->LoadIcon(ICO_MYCOMP));
m_pImageList.Add(pApp->LoadIcon(ICO_OPENFLD));
m_pImageList.Add(pApp->LoadIcon(ICO_TEXTFILE));


GetTreeCtrl().SetImageList( &m_pImageList , TVSIL_NORMAL);

HTREEITEM hParent = GetTreeCtrl().InsertItem(MYCOMPUTER, ILI_MYCOMP, ILI_MYCOMP);
InitTreeView(hParent);
GetTreeCtrl().Expand(hParent, TVE_EXPAND);

}
void CDriveBrowser::InitTreeView(HTREEITEM hParent)
{

int nPos = 0;
UINT nCount = 0;
CString strDrive = "?:\\";

DWORD dwDriveList = ::GetLogicalDrives ();

CString cTmp;

while (dwDriveList)
{
if (dwDriveList & 1)
{
cTmp = strDrive;
strDrive.SetAt (0, 0x41 + nPos);
if (AddDrives(strDrive , hParent))
{
nCount++;
}
}
dwDriveList >>= 1;
nPos++;
}
return;
}

yzcurry 2006-11-07
  • 打赏
  • 举报
回复
你有没有加你想要条用的类的头文件啊?有没有在两个类之间重复调用的问题存在?建议查一下,还有就是表达的还有点问题,说的再清楚点
flyelf 2006-11-07
  • 打赏
  • 举报
回复
是运行时出现异常?
cheng19long 2006-11-07
  • 打赏
  • 举报
回复
上面那个邮箱地址#改为@
cheng19long 2006-11-07
  • 打赏
  • 举报
回复
希望讲一下原理,
我按你说的,我这样改:
class friend MainFrm;
然后在MainFrm类里加入:

CDriveBrowser m_wnd;


在....
加入:
m_wnd.Create(WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS,
CRect(0,0,0,0), &wndBar, 1011);

wndBar.AddFolderBar( _T("文件"), &m_wnd);

不行,我不是很懂,请指点,我还在学习中。。另外我的邮箱:cheng19long#yahoo.com.cn,谢谢~~
折腾_苏州 2006-11-07
  • 打赏
  • 举报
回复
关键是 TreeCtrl没有创建:
m_wnd.Create(WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS,
CRect(0,0,0,0), &wndBar, 1011);
最好把CTreeView改造成CTreeCtrl,你得程序已经改好,如需要可以发给你。。。

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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