簡體   English   中英

如何調整 Win32 列表框的大小以適合其內容?

[英]How to resize a Win32 listbox to fit its content?

有沒有辦法調整 Win32 列表框的大小以適應其內容(顯示其所有內容的最小大小,不需要滾動條),無論何時其項目發生變化?

謝謝!

編輯:我需要調整列表框的寬度和高度。

您沒有指定是否需要水平和垂直,但我假設不是。 基本上,您需要獲取項目數和項目高度並將它們相乘,然后添加控件邊框的空間(除非控件是無邊框的,否則您可能需要玩弄這個):

void AutosizeListBox(HWND hWndLB)
{
    int iItemHeight = SendMessage(hWndLB, LB_GETITEMHEIGHT, 0, 0);
    int iItemCount = SendMessage(hWndLB, LB_GETCOUNT, 0, 0);

    // calculate new desired client size
    RECT rc;
    GetClientRect(hWndLB, &rc);
    rc.bottom = rc.top + iItemHeight * iItemCount;

    // grow for borders
    rc.right += GetSystemMetrics(SM_CXEDGE) * 2;
    rc.bottom += GetSystemMetrics(SM_CXEDGE) * 2;

    // resize
    SetWindowPos(hWndLB, 0, 0, 0, rc.right, rc.bottom, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
}

如果您還想要水平調整大小,則需要將正確的字體選擇到 DC 中,並遍歷所有項目以使用GetTextExtentPoint32計算最大文本長度。

編輯:添加了一個計算水平尺寸的版本。

void AutosizeListBox(HWND hWndLB)
{
    int iItemHeight = SendMessage(hWndLB, LB_GETITEMHEIGHT, 0, 0);
    int iItemCount = SendMessage(hWndLB, LB_GETCOUNT, 0, 0);

    // get a DC and set up the font
    HDC hDC = GetDC(hWndLB);
    HGDIOBJ hOldFont = SelectObject(hDC, (HGDIOBJ)SendMessage(hWndLB, WM_GETFONT, 0, 0));

    // calculate width of largest string
    int iItemWidth = 0;
    for (int i = 0; i < iItemCount; i++)
    {
        int iLen = SendMessage(hWndLB, LB_GETTEXTLEN, i, 0);
        TCHAR* pBuf = new TCHAR[iLen + 1];
        SendMessage(hWndLB, LB_GETTEXT, i, (LPARAM)pBuf);

        SIZE sz;
        GetTextExtentPoint32(hDC, pBuf, iLen, &sz);
        if (iItemWidth < sz.cx) iItemWidth = sz.cx;

        delete[] pBuf;
    }

    SelectObject(hDC, hOldFont);
    ReleaseDC(hWndLB, hDC);

    // calculate new desired client size
    RECT rc;
    SetRect(&rc, 0, 0, iItemWidth, iItemHeight * iItemCount);

    // grow for borders
    rc.right += GetSystemMetrics(SM_CXEDGE) * 2;
    rc.bottom += GetSystemMetrics(SM_CXEDGE) * 2;

    // resize
    SetWindowPos(hWndLB, 0, 0, 0, rc.right, rc.bottom, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM