1

我有一个列表视图,我想在其中禁用水平滚动条。

基本上,我知道我的所有数据都不会超过单列的宽度,但是如果将足够多的条目添加到列表视图中,则会弹出垂直滚动条,减少可用宽度,从而弹出水平滚动条。

我正在考虑如何在添加垂直滚动条之前捕获一条消息,然后重新调整列的大小以腾出足够的空间,但我不知道我需要捕获什么消息才能做到这一点。

编辑:
有谁知道在列表视图中的项目被删除后是否有消息发送?LVN_ITEMCHANGED似乎只有在添加项目后才会发送。并且LVN_DELETEITEM仅在删除项目之前。

4

2 回答 2

2

您可以将消息: LVM_SETCOLUMNWIDTH 发送到列表视图,其中 cx 参数设置为 LVSCW_AUTOSIZE_USEHEADER

于 2012-08-13T00:01:57.150 回答
1

好吧,我想出了一个解决方案。
但是有一个错误,如果我只删除一个项目,它不会调整列的大小。

case LVN_DELETEITEM:
{
    LPNMLISTVIEW listView = (LPNMLISTVIEW) lParam;

    // After an item is deleted,
    // if there is not a vertical scroll bar and GWL_USERDATA is TRUE,
    // resize the column back to normal.
    if (!(GetWindowLong(listView->hdr.hwndFrom, GWL_STYLE) & WS_VSCROLL) &&
          GetWindowLong(listView->hdr.hwndFrom, GWL_USERDATA) == TRUE)
    {
        const int ColWidth = ListView_GetColumnWidth(listView->hdr.hwndFrom, 0);
        ListView_SetColumnWidth(listView->hdr.hwndFrom, 0, ColWidth + GetSystemMetrics(SM_CXVSCROLL));
        SetWindowLong(listView->hdr.hwndFrom, GWL_USERDATA, FALSE);
    }

    break;
}

case LVN_ITEMCHANGED:
{
    LPNMLISTVIEW listView = (LPNMLISTVIEW) lParam;

    // After an item is added, if there is a horizontal scrollbar,
    // resize the column and set GWL_USERDATA to TRUE.
    if (GetWindowLong(listView->hdr.hwndFrom, GWL_STYLE) & WS_HSCROLL)
    {
        const int ColWidth = ListView_GetColumnWidth(listView->hdr.hwndFrom, 0);
        ListView_SetColumnWidth(listView->hdr.hwndFrom, 0, ColWidth - GetSystemMetrics(SM_CXVSCROLL));
        SetWindowLong(listView->hdr.hwndFrom, GWL_USERDATA, TRUE);
    }

    break;
}

我仍然希望看到一个更好的解决方案,但这目前有效。

于 2012-08-12T18:47:22.317 回答