禁用列表视图中的水平滚动条

Disable horizontal scroll bar in list view

本文关键字:水平 滚动条 视图 列表      更新时间:2023-10-16

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

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

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

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

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

好吧,

我制定了一个解决方案。
不过有一个错误,如果我只删除一个项目,它不会调整列的大小。

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

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