如何调整Win32列表框的大小以适合其内容?

问题描述 投票:0回答:1

只要项目更改,是否有任何方法可以调整Win32列表框的大小以适合其内容(将显示其所有内容的最小大小,不需要滚动条?

谢谢!

编辑:我需要同时调整列表框的宽度和高度。

c++ winapi listbox autoresize
1个回答
4
投票

您没有指定要水平还是垂直,但是我假设不是。基本上,您需要获取项目数和项目高度并将它们相乘,然后添加控件边框的空间(除非控件是无边界的,您可能需要尝试一下):

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.