Wednesday, June 9, 2010

Compact the text to fit in a rectangle

void CompactText(CFont* pFont, CRect rcText, CString& strText)
{
CRect rcClient;
CClientDC clientDC(NULL);
CDC memDC;
CBitmap bmp;
CBitmap* pBmpOld;
CFont* pFontOld;

if(pFont == NULL)
return;

memDC.CreateCompatibleDC(&clientDC);
bmp.CreateCompatibleBitmap(&clientDC, rcText.Width(), rcText.Height());

pBmpOld = memDC.SelectObject(&bmp);
pFontOld = memDC.SelectObject(pFont);

UINT nFlag = DT_NOPREFIX DT_MODIFYSTRING DT_END_ELLIPSIS DT_SINGLELINE;
memDC.DrawText(strText, rcText, nFlag);

if(pBmpOld != NULL)
memDC.SelectObject(pBmpOld);

if(pFontOld != NULL)
memDC.SelectObject(pFontOld);
}
Others API releted to it:
PathCompactPath
CDC::GetTextExtent