找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3983|回复: 0
打印 上一主题 下一主题
收起左侧

MFC的树形控件怎么添加具有层次性的目录

[复制链接]
跳转到指定楼层
楼主
ID:77367 发表于 2015-4-18 20:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用一个access数据库来管理图片资源,需要对这些图片进行归门别类,开始在网上Google了很久都没找到什么什么资料出来,不过自己整理出思路来了。。贴在这可以给需要的人看看。

一、设计数据库
这里设计了两张表tbCategores、tbPictures,如下图所示

图1 表tbCategores,IDCat是主键,自动编号,ParentID是目录Categores的父目录ID,为0表示没有父目录




图2 表tbPictures存储相应下的图片,有IDCat(外键)表明当前图片(IDpict)属于哪个目录


图3 两张表的关系

二、代码
这里给出怎么将表tbCategores填充到Treectrl的代码,其他代码可以自行发挥!!

void CGalleryDlg::InitTree()
{

        CMedicalApp *pApp = (CMedicalApp *)AfxGetApp();
        m_treeImages.Create(16,16,ILC_MASK |ILC_COLOR32,3,3);

        m_treeImages.Add(pApp->LoadIcon(IDI_DB ));
        m_treeImages.Add(pApp->LoadIcon(IDI_FOLDER_YELLOW ));
        m_treeImages.Add(pApp->LoadIcon(IDI_FOLDER_YELLOW_OPEN ));
        m_treeFolder.SetImageList(&m_treeImages,TVSIL_NORMAL);

        ADOConn m_AdoConn;
        m_AdoConn.OnInitADOConn();
        CString sDBName = m_AdoConn.GetDBName();

        int i=sDBName.ReverseFind('\\');
        CString nFileText = _T("[") + sDBName.Mid(i+1) + _T("]");

        //insert item
        long                lItemTitle;
        CString                sItemTitle;
       
        // item created
        HTREEITEM        tiTestNode;
        HTREEITEM        tiParentNode;

        //insert root item
        TVINSERTSTRUCT tvInsert;
        tvInsert.hParent = NULL;
        tvInsert.hInsertAfter = NULL;
        tvInsert.item.mask = TVIF_TEXT;
        tvInsert.item.pszText = nFileText.GetBuffer();

        m_treeFolder.DeleteAllItems();
        HTREEITEM h_root=m_treeFolder.InsertItem(&tvInsert);


        //add categroes
        CString  sql;
        sql.Format(_T("select * from tbCategores order by No desc"));
        _RecordsetPtr   pRecordset;
        pRecordset = m_AdoConn.GetRecordset((_bstr_t)sql);

        while(!m_AdoConn.m_pRecordset->adoEOF)
        {
                _variant_t vIDCat, vCategores, vParentID;
                vIDCat = pRecordset->GetCollect("IDCat");
                vCategores= pRecordset->GetCollect("Categores");
                vParentID = pRecordset->GetCollect("ParentID");
               
                sItemTitle = (TCHAR*)(_bstr_t)vCategores;
                lItemTitle = vIDCat.lVal;

                // insert the node
                if(vParentID.vt != VT_NULL)
                        tiParentNode = FindItem((long)(vParentID.lVal));  //查找父节点

                if(vIDCat.lVal==0)
                {
                        tiTestNode = m_treeFolder.InsertItem(sItemTitle,1,2,h_root);
                        m_treeFolder.SetItemData(tiTestNode,lItemTitle);
                }
               
                //for the other nodes
                if( tiParentNode )
                {
                        tiTestNode = m_treeFolder.InsertItem(sItemTitle,1,2, tiParentNode);
                        m_treeFolder.SetItemData(tiTestNode, lItemTitle);
                }

                pRecordset->MoveNext();
        }

        m_treeFolder.Expand(m_treeFolder.GetRootItem(), TVE_EXPAND);

        m_treeFolder.EnableMultiSelect(FALSE);
        m_AdoConn.ExitConnect();
}

//查找某一个节点

HTREEITEM CGalleryDlg::FindItem(long lItemData)
{
        // the tree object
        // the current item
        HTREEITEM    tiItem= m_treeFolder.GetNextItem(TVGN_ROOT,TVGN_ROOT);
        long             lCurrentData;

        while (tiItem)
        {
                m_treeFolder.Expand(tiItem,TVE_EXPAND);

                lCurrentData = (long)m_treeFolder.GetItemData(tiItem);

                if( lCurrentData == lItemData )
                        return tiItem;
                tiItem= m_treeFolder.GetNextItem(tiItem,TVGN_NEXTVISIBLE);
        }

        return NULL;

}

下图是填充目录后的Treectrl。







分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表