2015-03-13 86 views

回答

2

你没有指定你是否想要水平和垂直,但我会假设没有。基本上,你需要获得的项目数量和项目的高度和多个它们,然后添加上控制边界的空间(除非控制是无国界的,你可能需要玩这个):

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); 
} 
+0

注意这只适用于单列列表框;如果您使用多列列表框,如您在其他问题中所描述的那样,那么该方法会有所不同。 – 2015-03-13 20:51:57

+0

事实上,我需要这两个大小,因为此列表框可用作文本框的工具提示选项。 – Sakura 2015-03-13 21:10:57

+0

@TuyenTk:你能确认单个或多个列吗? – 2015-03-13 21:16:49