标题: MFC的树形控件怎么添加具有层次性的目录 [打印本页]
作者: bibi 时间: 2015-4-18 20:58
标题: MFC的树形控件怎么添加具有层次性的目录
我用一个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。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |