MFC中的CTreeCtrl

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC中的CTreeCtrl相关的知识,希望对你有一定的参考价值。

CTreeCtrl::InsertItem("",1,2,hTreeItem);
但在函数OnTvnSelchangedTreeGroup中pNMTreeView->itemNew.iImage得不到1????
pNMTreeView->itemNew.iSelectedImage总是0
在此借用image和selectedimage分别记录两个ID号到数据库里查询数据
我没用图,只是用这两个属性来记录数据而已

我只是用来存储显示文字所对应的ID,再来查询ID所对应的东西,如何记录树中节点显示的文字所对应的ID,以便于以后用

参考技术A 1.CTreeCtrl 是通过 SetImageList 来设置图标的
就是说你传给它一组图标,比如是16*64的16*16的四个图标
SetItemImage后两个参数是图标的所引值,
比如你设定的是1,2 则该成员未被选择时显示第二个图标,选择时显示第三个图标

2.就是说一个图标分级的,比如C盘下有program files目录,C就是父项,program files就是子项,TVN_SELCHANGED消息是选择改变消息,例子里使用两个变量保存更改项的信息。

ListCtrl,TreeCtrl算是比较复杂的控件了,好好学吧!
如果要例子,我半小时大概可以写一个。
参考技术B 要使用iImage,请确保在这之前使用
TVIF_IMAGE才能使IImage数据用效!
示例
TVINSERTSTRUCT tvItem;
tvItem.hParent = NULL;//表示它为根
tvItem.hInsertAfter = TVI_LAST;
tvItem.item.mask = TVIF_TEXT | TVIF_IMAGE |TVIF_SELECTEDIMAGE;
tvItem.item.pszText = (LPTSTR)(LPCTSTR)chArrTreeContent[0];//也可以_T("")
tvItem.item.iImage = 0;
tvItem.item.iSelectedImage =3;
hItem0 = m_treeDemo.InsertItem(&tvItem);本回答被提问者采纳
参考技术C 说的太抽象了,能不能具体点?前面的插入图像代码呢?看看那里有没有错误 参考技术D 是不是你压根就还没有将IMAGE导入进去啊

暂停渲染/绘图 CTreeCtrl (MFC)

【中文标题】暂停渲染/绘图 CTreeCtrl (MFC)【英文标题】:Pause Rendering/Drawing CTreeCtrl (MFC) 【发布时间】:2013-07-03 13:11:38 【问题描述】:

在展开/折叠树中的所有节点等昂贵操作期间,有没有办法暂停 CTreeCtrl 或其 CTreeView 的渲染?如果没有像 PauseRendering(TRUE) 或类似的函数,是否有可能截获绘图消息,并且仅在未调用我的 ExpandAll 方法时将其转发到树?

【问题讨论】:

听起来像是线程的工作。 可能是真的,但我对 C++ 还很陌生,对 MFC 完全陌生,所以我不确定这是否是一个好主意,因为我有一个截止日期。 【参考方案1】:

您可以使用WM_SETREDRAW 消息:当使用wParam 发送到FALSE 时,会阻止窗口接收WM_PAINT 消息;当用wParam 发送到TRUE 时,它将被设置为正常。

完成后不要忘记手动重新绘制窗口,因为它不是自动完成的:

RedrawWindow(hWnd, NULL, NULL, RDW_ERASE|RDW_FRAME|RDW_INVALIDATE|RDW_ALLCHILDREN);

【讨论】:

谢谢!我用Tree->SendMessage(WM_SETREDRAW, FALSE)Tree->SendMessage(WM_SETREDRAW, TRUE) 包围了对我的ExpandAll 方法的调用,它大大加快了它的速度。我会注意到CWnd::RedrawWindow 方法在从 CTreeView(无 hWND)调用时只需要 3 个参数。 RedrawWindow(NULL, NULL, RDW_ERASE|RDW_FRAME|RDW_INVALIDATE) 为我工作。再次感谢您的帮助。 我现在唯一的问题是树视图的垂直滚动条在整个过程中仍然绘制(它看起来很跳跃,因为ExpandAll 方法是递归的)。但这是一个 UI 问题,而不是速度问题。 我遇到同样的问题很久了,即使SetRedraw为false,垂直滚动条也会出现和消失,所以我终于决定做点什么!解决方案出奇的简单(我的类是直接从CTreeCtrl派生的):CMyTreeCtrl::DisableRedraw() SetRedraw(FALSE); ModifyStyle(NULL, TVS_NOSCROLL); CMyTreeCtrl::EnableRedraw() ModifyStyle(TVS_NOSCROLL, NULL); SetRedraw(TRUE); RedrawWindow( NULL, NULL, RDW_NOCHILDREN | RDW_UPDATENOW | RDW_INVALIDATE ); 不知道为什么我几年前没有想到这个:-) @JohnC 你做得很好,谢谢。我认为这是 Win32 TreeCtrl 中的一个错误。在我的代码中进行测试后,您的方法还可以阻止控件的边框刷新(闪烁)。

以上是关于MFC中的CTreeCtrl的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++/MFC 和 C# 中的插件扩展 C++/MFC 应用程序

单独线程中的 MFC 表单

MFC 中的 OLE Overridables 是啥?

MFC 中的消息循环

缩放模式,缩放宽度,mfc中的缩放高度

关于MFC中的tree控件