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,以便于以后用
就是说你传给它一组图标,比如是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的主要内容,如果未能解决你的问题,请参考以下文章