CListBox自動換行顯示


需要在ListBox控件中顯示一些信息。
為方便查看,不使用水平滾動條。當要輸出的字符串占用的寬度超過ListBox的寬度時,截斷字符串,剩余的在下一行顯示。

1. 計算ListBox所占的寬度,用GetClientRect。

GetClientRect返回的是客戶區的大小。當ListBox中有垂直滾動條時,那么客戶區的大小會相應調整。GetClientRect返回的是去掉滾動條占用區域后剩余的區域,即完全用來顯示內容的區域的大小。

2. 計算字符串占用的寬度,用GetTextExtent方法。
一開始計算的不正確,明顯比實際占用的值大。
上網查,發現ListBox的ClientDC並沒有包含列表框字體信息。也就是說,對話框創建時所使用字體並沒有“選入”ClientCD。
要獲得字符串真正占用的寬度,應該先調用GetFont獲得列表框的字體信息,然后將此字體選入ClientDC中。

例如:
CFont *pFont = m_List1.GetFont();
CDC *pDC = m_List1.GetDC();

CFont *pOldFont = pDC->SelectObject(pFont);

CSize sz = pDC->GetTextExtent(str);

pDC->SelectObject(pOldFont);

 

3. 源碼

void ShowInfo(CListBox *pListBox, CString infoStr)
{
    CRect clientRect;
    pListBox->GetClientRect(&clientRect);
    int maxWidth = clientRect.Width();

    int len = infoStr.GetLength();

    CFont *pFont = pListBox->GetFont();
    CDC *pDC = pListBox->GetDC();

    CFont *pOldFont = pDC->SelectObject(pFont);    

    CSize sz = pDC->GetTextExtent(infoStr, len);

    while(sz.cx > maxWidth)
    {
        len--;
        sz = pDC->GetTextExtent(infoStr, len);
    }

    pDC->SelectObject(pOldFont);

    pListBox->AddString(infoStr.Left(len));

    int strLen = infoStr.GetLength();
    if(len != strLen)
    {
        ShowInfo(pListBox, infoStr.Right(strLen - len));
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM