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

时间:2012-08-12 16:44:26

标签: c++ windows winapi

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

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

我正在考虑在添加垂直滚动条之前如何捕获消息,然后重新调整列的大小以留出足够的空间,但我不知道我需要捕获哪些消息这样做。

修改
是否有人知道在列表视图中的项目被删除后是否有消息发送? LVN_ITEMCHANGED似乎仅在添加项目后发送。仅在删除项目之前LVN_DELETEITEM

2 个答案:

答案 0 :(得分: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;
}

我仍然希望看到更好的解决方案,但现在可以使用。

答案 1 :(得分:1)

您可以将消息:LVM_SETCOLUMNWIDTH发送到listview,并将cx param设置为LVSCW_AUTOSIZE_USEHEADER