2012-08-12 93 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