更改树视图状态图像

Changing treeview state images

本文关键字:图像 视图状态      更新时间:2023-10-16

我(仍然)试图弄清楚如何将树视图的状态图像从默认的 +/- 更改为我选择的图像。 我正在取得进展,但我碰壁了。

我只是想在扩展分支时更改图像。 当我使用以下代码时,有时它会改变,有时不会。 它仅在我来回弹跳几次时才按预期运行,而不是第一次。

假设我缺少标志或没有正确设置某些内容? 有什么提示吗?

case WM_NOTIFY:
    if (wParam == IDC_TVWFILELIST) {
        LPNMTREEVIEW nmtv = (LPNMTREEVIEW) lParam;
        if (nmtv->hdr.code == TVN_ITEMEXPANDED) {
            TVITEM item = nmtv->itemNew;
            item.state = INDEXTOSTATEIMAGEMASK(4);
            TreeView_SetItem(pnl_tree.GetTreeview(), &item);
        }
    }
    break;

好的,当然,当我在SO上发帖时,我很快就自己弄清楚了! 缝补。 猜猜说会有所帮助。无论如何,对于下一个人。


我在其他地方学习 winapi 时也遇到了同样的问题,尤其是树视图 - 如果我忽略设置结构的某个成员,我会得到奇怪的行为。

在这种情况下,事实证明item.stateMask = TVIS_STATEIMAGEMASK;需要重新设置。

显然,它不会在 TreeView_SetItem() 中持久化(它非常简洁地指出"TreeView_SetItem宏设置树视图项的部分或全部属性")。

对我来说,工作代码具有扩展/折叠处理程序的奖励(现在我正在用gas做饭):

if (wParam == IDC_TVWFILELIST) {
    LPNMTREEVIEW nmtv = (LPNMTREEVIEW) lParam;
    if (nmtv->hdr.code == TVN_ITEMEXPANDED) {
        TVITEM item = nmtv->itemNew;
        item.stateMask = TVIS_STATEIMAGEMASK;
        if (nmtv->action == TVE_COLLAPSE) {
            item.state = INDEXTOSTATEIMAGEMASK(4);
        }
        else if (nmtv->action == TVE_EXPAND) {
            item.state = INDEXTOSTATEIMAGEMASK(5);
        }
        TreeView_SetItem(pnl_tree.GetTreeview(), &item);
    }
}

未来树视图图像状态新手的其他一些链接,不适用于这个问题,但帮助我慢慢弄清楚了这件事:

树视图项状态概述

TVN_ITEMEXPANDED消息