2012-08-12 56 views
1

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

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

我在想如何在垂直滚动条被添加之前捕捉消息,然后重新调整列的大小以便留出足够的空间,但是我不知道需要做什么消息才能执行这个。

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

+0

为什么你不只是不停的最后一列的宽度有限?那么你肯定知道水平滚动条不会显示出来...... – demorge 2012-08-12 18:36:45

+0

因为我只有一个列,并且列分隔符看起来很丑。出于多种原因,它必须处于报告模式。 – Josh 2012-08-12 18:39:39

+0

也许你可以使用'LVM_ISITEMVISIBLE'来检查第一个OR最后一项是否不可见。那么你应该减少列的宽度。并检查每次添加项目或调整大小。 – demorge 2012-08-12 18:44:40

回答

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

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

+0

您也可以观察WM_STYLECHANGED消息,并在WS_VSCROLL更改时调整列的大小。不过,我认为没有任何方法可以调整列的手动调整大小。 – 2012-08-12 22:35:17

1

你可以发送邮件:LVM_SETCOLUMNWIDTH与CX参数组列表视图来LVSCW_AUTOSIZE_USEHEADER