須要在ListBox控件中顯示一些信息。
爲方便查看,不使用水平滾動條。當要輸出的字符串佔用的寬度超過ListBox的寬度時,截斷字符串,剩餘的在下一行顯示。字體
1. 計算ListBox所佔的寬度,用GetClientRect。spa
GetClientRect返回的是客戶區的大小。當ListBox中有垂直滾動條時,那麼客戶區的大小會相應調整。GetClientRect返回的是去掉滾動條佔用區域後剩餘的區域,即徹底用來顯示內容的區域的大小。code
2. 計算字符串佔用的寬度,用GetTextExtent方法。
一開始計算的不正確,明顯比實際佔用的值大。
上網查,發現ListBox的ClientDC並無包含列表框字體信息。也就是說,對話框建立時所使用字體並無「選入」ClientCD。
要得到字符串真正佔用的寬度,應該先調用GetFont得到列表框的字體信息,而後將此字體選入ClientDC中。blog
例如:
CFont *pFont = m_List1.GetFont();
CDC *pDC = m_List1.GetDC();字符串
CFont *pOldFont = pDC->SelectObject(pFont);源碼
CSize sz = pDC->GetTextExtent(str);class
pDC->SelectObject(pOldFont);cli
3. 源碼List
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)); } }