C++ 使用WIN32 API(C/C+;+;)的特定于颜色的树视图项
我想创建一个树状视图,其中特定项目具有不同的背景和文本颜色。 我确实在互联网上找到了以下解决方案:,但在这里,他们根据每个项目的级别给每个项目上色。 这接近于我想要的,但我只想给特定的treeview项目上色,不管它的级别如何,比如说通过它的TVITEM句柄或它的HTREEITEM 是否可以使用C++ 使用WIN32 API(C/C+;+;)的特定于颜色的树视图项,c++,c,winapi,treeview,common-controls,C++,C,Winapi,Treeview,Common Controls,我想创建一个树状视图,其中特定项目具有不同的背景和文本颜色。 我确实在互联网上找到了以下解决方案:,但在这里,他们根据每个项目的级别给每个项目上色。 这接近于我想要的,但我只想给特定的treeview项目上色,不管它的级别如何,比如说通过它的TVITEM句柄或它的HTREEITEM 是否可以使用NM\u CUSTOMDRAW消息执行此操作? 如果没有,我怎么能做这样的事 编辑: 我一直试图使用项目的lParam来识别treeview项目,但由于某些原因,这些项目仍然不可见。 以下是我的函数,该函
NM\u CUSTOMDRAW
消息执行此操作?
如果没有,我怎么能做这样的事
编辑:
我一直试图使用项目的lParam
来识别treeview项目,但由于某些原因,这些项目仍然不可见。
以下是我的函数,该函数用于处理自定义绘图:
/*
This function will custom draw a tree view
Input: (LRESULT*) res = To store the result (by reference, to be stored)
(HWND) window = The handled window
(LPNMTVCUSTOMDRAW) item = The item to draw
(TVITEM) tvItem = The tv item that should be custom drawn
Output: (BOOL) TRUE if should use the stored value, otherwise FALSE
*/
BOOL customDrawTreeView(LRESULT* res, HWND window, LPNMTVCUSTOMDRAW item, TVITEM tvItem)
{
switch (item->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*res = CDRF_NOTIFYITEMDRAW;
return TRUE;
break;
case CDDS_ITEMPREPAINT:
if (tvItem.lParam == item->nmcd.lItemlParam)
{
item->clrTextBk = 0x383838;
item->clrText = RGB(255, 255, 255);
*res = CDRF_SKIPDEFAULT;
return TRUE;
}
break;
}
return FALSE;
}
对。您可以使用
TVITEM::lParam
成员将信息附加到树项。此值与NMTVCUSTOMDRAW
结构的nmcd.lItemlParam
成员中的NM\u CUSTOMDRAW
消息一起发送。您可以根据需要绘制树视图。那么,是什么阻止了你做你想做的事情呢?这看起来是一个完美的解决方案,但我似乎有另一个问题:我的switch语句中的CDDS_ITEMPREPAINT案例似乎永远无法实现。你知道为什么会发生这种情况吗?CDDS_PREPAINT案例始终是已经到达的案例,即使树视图中确实包含要处理的项目,但它仍然不能满足我的要求。由于某种原因,树视图仍然为空,即使到达“我的代码”并且设置了clrTextBk
&clrText
,这些项目仍然不可见。你能看一下我问题的编辑吗?我设法弄明白了(在两种切换情况下我都必须使用SetWindowLongPtr函数)。非常感谢你的帮助。