我想实现一个像QQ列表一样的树形结构列表,里边节点总共有4种图标,如图:
我先实现将文件夹排在最前面,接着是彩色图标,最后才是灰色图标,求大牛们指点,给分保证跟上
我先实现将文件夹排在最前面,接着是彩色图标,最后才是灰色图标,求大牛们指点,给分保证跟上
解决方案 »
- VC2008创建的安装程序没有卸载的项?
- 求C或C++ RasDial API 进行pppoe拨号的完整代码,折腾半天没搞定
- 【100】怎么删除对话框默认创建的按钮回车接收属性?
- 如何实现瑞星防火墙界面中TAB contorl的风格?
- 创建命名管道遇到的问题
- 请教:如何通过一个按钮控制 隐藏/显示 对话框的一部分
- 关于CString str_connection=_T("")
- 怎样在atl中自己定制多接口,(显现等待)
- 在Com组件中如何向外输出字符串?
- 请教高手《ATL 开发指南》中的一个问题:做一个COM组件其中有一步是编连并注册Proxy/Stub DLL,出了个问题?
- 鼠标拖动控件边缘,改变其大小的问题!~~
- dll中动态分配的内存大小有限制吗?
怎么上传啊?没弄过这
int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
//把该函数换成自己的规则
CTreeCtrl* pmyTreeCtrl = (CTreeCtrl*)lParamSort;
CString strItem1 = pmyTreeCtrl->GetItemText((HTREEITEM)lParam1);
CString strItem2 = pmyTreeCtrl->GetItemText((HTREEITEM)lParam2); return strItem2.Compare(strItem1);
}TVSORTCB tvs;
tvs.hParent = TVI_ROOT;
tvs.lpfnCompare = MyCompareProc;
tvs.lParam = (LPARAM)&m_TreeCtrl;m_TreeCtrl.SortChildrenCB(&tvs);
这个我也试过,tree item data值我已经使用了,但是lParam1和lParam2是连个节点的data值,怎么才能取到与它们对应的节点呢?
当有新节点时先判断其应在的位置,然后在链表通过序号中找到他前一个节点的句柄
然后用
CTreeCtrl::InsertItem()时将最后一个参数hInsertAfter 设置为前一个节点的句柄就行了
在链表中将其插入进去,前面的节点序号不变 后面的节点序号+1
在SortChildrenCB前遍历树,把每个节点的HTREEITEM句柄当作DWORD值SetItemData,并建立新ItemData到老ItemData的映射(比如用CMap),SortChildrenCB后恢复。当然,更好的办法是,能直接通过你设置的ItemData访问你的数据。例如,树中每个节点都对应一个结构,把该结构的内存指针(或者数组索引)当作ItemData。这样在回调函数中就可以直接根据你的数据进行比较了。
这个办法很好,我照做了,功能也实现了,但是在析构的时候出现问题了,我在析构函数中将我之前new出来的结构体都delete了,但是出错了,好像是我的树形控件对象已经被析构掉了。这是为什么,我应该在哪儿delete这些指针才行呢?
CMonitorDlg::~CMonitorDlg()
{
DeleteAllItemData(m_hRoot);
}void CMonitorDlg::DeleteAllItemData(HTREEITEM hTreeItem)
{
HTREEITEM hTreeItemNext = NULL, hTreeItemChild = NULL; if(hTreeItem == NULL)
return;
TREEITEMDATA *pTreeData = NULL;
pTreeData = reinterpret_cast<TREEITEMDATA *>(m_MyTree.GetItemData(hTreeItem));
if(pTreeData != NULL)
{
TRACE("data = %d\n", pTreeData->iData);
delete pTreeData;
pTreeData = NULL;
} hTreeItemChild = m_MyTree.GetChildItem(hTreeItem);
DeleteAllItemData(hTreeItemChild);
hTreeItemNext = m_MyTree.GetNextItem(hTreeItem,TVGN_NEXT);
DeleteAllItemData(hTreeItemNext);
}上面就是我的析构,运行到
pTreeData = reinterpret_cast<TREEITEMDATA *>(m_MyTree.GetItemData(hTreeItem));
这句就报错了
CTreeCtrl::GetItemDataDWORD GetItemData( HTREEITEM hItem ) const;返回值:
返回一个与由hItem指定的项关联的32位的应用程序指定值。参数: hItem 要获取其数据的项的句柄。 说明:
此成员函数用来获取与指定项关联32位的应用程序指定值。
我感觉你如果执行到
pTreeData = reinterpret_cast<TREEITEMDATA *>(m_MyTree.GetItemData(hTreeItem));
出错 应该是已经m_MyTree已经释放了
你之前DeleteAllItems过么?
看来只能把我自己写的DeleteAllItemData(m_hRoot);放到析构外面实现了