1

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

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

我假设我错过了一个标志或没有正确设置一些东西?有小费吗?

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;
4

1 回答 1

2

好的,当然,当我在 SO 上发帖时,我很快就会自己弄清楚!该死。猜猜它有助于谈论它。无论如何,对于下一个人。


我在学习 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);
    }
}

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

树状视图项目状态概述

TVN_ITEMEXPANDED 消息

于 2012-11-29T02:25:14.320 回答