1

水平スクロール バーを無効にしたいリスト ビューがあります。

基本的に、データが 1 つの列の幅を超えることはないことはわかっていますが、リスト ビューに十分な数のエントリが追加されると、垂直スクロール バーがポップアップし、使用可能な幅が減り、水平スクロール バーがポップアップします。

垂直スクロールバーが追加される直前にメッセージをキャッチし、列のサイズを変更して十分なスペースを確保する方法について考えていましたが、これを行うためにどのメッセージをキャッチする必要があるかわかりません。

編集:
リスト ビューのアイテムが削除された後に送信されるメッセージがあるかどうかは誰にもわかりませんか? LVN_ITEMCHANGEDアイテムが追加された後にのみ送信されるようです。またLVN_DELETEITEM、アイテムが削除される前のみ。

4

2 に答える 2

2

cx パラメータを LVSCW_AUTOSIZE_USEHEADER に設定して、リストビューに LVM_SETCOLUMNWIDTH というメッセージを送信できます。

于 2012-08-13T00:01:57.150 に答える
1

さて、私は1つの解決策を考え出しました。
ただし、バグがあります。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 に答える