更改树视图状态图像

时间:2012-11-29 02:09:29

标签: c++ winapi treeview

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

我只是在分支扩展时尝试更改图像。当我使用下面的代码时,有时它会改变,有时不会改变。当我来回反复几次时,它只会按预期运行,而不是第一次。

我认为我错过了一面旗帜或者没有正确设置?有什么提示吗?

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;

1 个答案:

答案 0 :(得分:2)

好的,当然,当我发布消息时,我很快就会把它弄清楚!该死。猜猜它有助于谈论它。无论如何,对于下一个人。


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

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

显然它不会持续TreeView_SetItem()(它非常简洁地说明“TreeView_SetItem宏设置了一些或所有树视图项的属性”)。

工作代码,对我来说,还有扩展/折叠处理程序(现在我正在用汽油烹饪):

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);
    }
}

未来树视图图像状态新手的一些其他链接,特别不适用于此问题,但帮助我慢慢解决这个问题:

Treeview Item States Overview

TVN_ITEMEXPANDED message