本程序是我在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__;  重定义
 
 我就不知道怎么办了,一去掉,程序就会死
 
哪些高人指点一下
    

解决方案 »

  1.   

    原来两个工程单独都是可以运行的,一个是仿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;
    }
      

  2.   

    全部代码已发到:
    http://lw.68ab.com/work/work.rar
      

  3.   

    to: flyelf(空谷清音) ( ) 信誉:150    Blog
     是运行时出现异常?
    -------------------------
    问一下,你说vc编程序会死是怎么一回事啊?有时候我只改一个空格或者其它无关紧要的东西,程序一编译就会死,只能强制结束,重新打开,再编又没有问题,这是哪里出了问题啊????
      

  4.   

    关键是 TreeCtrl没有创建:
    m_wnd.Create(WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS, 
    CRect(0,0,0,0), &wndBar, 1011);
    最好把CTreeView改造成CTreeCtrl,你得程序已经改好,如需要可以发给你
      

  5.   

    希望讲一下原理,
    我按你说的,我这样改:
    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); 不行,我不是很懂,请指点,我还在学习中。。另外.cn,谢谢~~
      

  6.   

    已收到seu07201213(【℡】〖汪洋中的一片叶子〗≈^︵^≈) 给我改的程序,多谢了,不过,还是希望seu07201213(【℡】〖汪洋中的一片叶子〗≈^︵^≈) 能给我讲一下,要修改哪些地方才行,为什么我改了就不行呢?
      

  7.   

    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了.........
      

  8.   

    就是第一步没做好,根据您的指示,我差不多改好了,我不明白一般在文档里面都是用CTreeView类的,为什么你却用CTreeCtrl类呢??