在MFC下运行此函数,
AAAA,BBBB情况下与抓图比较,差异比较大,CCCC最接近,可能绘图最好
void CCoolTabCtrl::GetTextSize(LPCTSTR lpszText, int nCount, CSize &size)
{
size.cx = 0;
size.cy = 0;
/*AAAA*********************************************
/*CString ss("Customized Split Size (0.00 MB)");
CClientDC dc(this);
int nSave = dc.SaveDC();
CFont font;
font.CreateStockObject(SYSTEM_FONT);
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
font.GetLogFont(&lf);
lf.lfWidth = 6;
lf.lfHeight = 8;
strcpy(lf.lfFaceName, "宋体");
dc.SelectObject(font);
size = dc.GetTextExtent( lpszText, nCount );
CRect rc(0,0,0,0);
dc.DrawText(ss, &rc, DT_CALCRECT);
CSize s = dc.GetTextExtent("Customized Split Size (0.00 MB)");
CSize c;
GetTextExtentPoint32(dc,"Customized Split Size (0.00 MB)",31, &c);
dc.RestoreDC(nSave);
//宽度:0xd1
*/
/*BBBB*********************************************
HDC hdc=::GetDC(*this);
TEXTMETRIC tm;
LPCTSTR szString = "Customized Split Size (0.00 MB)";
::GetTextMetrics(hdc,&tm);
::GetTextExtentPoint32(hdc, szString, lstrlen(szString),&size);
int cx=size.cx;//宽度
int cy=tm.tmHeight+tm.tmExternalLeading;//高度
宽度:0xd1
*/
/*CCCC*********************************************/
CClientDC dc(this);
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(NONCLIENTMETRICS);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0);
CRect rc(0,0,0,0);
CFont font;
font.CreateFontIndirect(&ncm.lfMessageFont);
// 将字体选进DC
CFont* pOldFont = dc.SelectObject(&font);
// 计算文本大小
CString str("Customized Split Size (0.00 MB)");
dc.DrawText(str, rc, DT_CALCRECT);
// 回复旧字体-这是必须的
dc.SelectObject(pOldFont);
// 宽度:0x96 与抓图下的象素值最接近
}
文章出处:http://www.diybl.com/course/3_program/c++/cppjs/2008717/133429.html