65,209
社区成员
发帖
与我相关
我的任务
分享HDC hdc = label.getDC();
TEXTMETRIC tm;
int ret=GetTextMetrics(hdc,&tm);
//QMessageBox::warning(this,tr("High"),QString::number(tm.tmHeight-tm.tmInternalLeading));
return tm.tmHeight-tm.tmInternalLeading;void CFontView::OnDraw(CDC* pDC)
{
CFontDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int i,j=0;
int h []={6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,22,23,24,25,26,27,28,
29,30,32,34,36,40,42,48,52,56,60,65,72,76,96,120,144,288};
CFont font;
TEXTMETRIC tm;
font.CreatePointFont (i,_T("arial"),pDC);
CFont *pfontOld = pDC->SelectObject (&font);
font.DeleteObject ();
LOGFONT lf;
TCHAR *fontname = _T("arial");//lf.lfFaceName
pfontOld->GetLogFont(&lf);
pDC->SelectObject (pfontOld);
CString str;
str=_T("设置高度:<=================================>获取高度: ");
pDC->TextOut (10,0,str);
pDC->TextOut (600+10,0,str);
str=_T("设置高度值,大概高度值<====>字体高度,外部头高,内部头高,真实高度");
pDC->TextOut (10,30,str);
pDC->TextOut (600+10,30,str);
int lines =sizeof(h)/sizeof(h[0]);
int ypos= 30;
for(i =h[j]*10;j<lines;)
{
font.CreatePointFont (i,fontname,pDC);
pDC->SelectObject (&font);
pDC->GetTextMetrics(&tm);
pDC->SetTextColor (RGB(100,200,200));
ypos += (j%4==0)? tm.tmHeight:0;
pDC->TextOut((j%4)*240,lines*20/2+20+ +ypos,_T("arial"));
pDC->SetTextColor (RGB(0,0,0));
pDC->SelectObject (pfontOld);
font.DeleteObject ();
CString info;
info.Format (_T("%12d%12d%12s%16d%16d%16d%16d"),
i ,( i / 10 * 3 + 1) / 2, _T("") ,
tm.tmHeight,
tm.tmExternalLeading,
tm.tmInternalLeading,
tm.tmHeight - tm.tmInternalLeading - tm.tmDescent - tm.tmExternalLeading);
pDC->TextOut (600*(j%2)+10,20*(j/2)+50,info);
j++;
i = h[j]*10;
}
}你没看字体大小的单位吧,刚刚才想到,
字体大小,设置方式为高度 h *10 ; 得到的 高度大约为 (h*3+1) /2;
设置的高度:获取的高度 ~= 2:3
其中,还有许多复杂内情在里面。
具体看MSDN
代码是OK的。看来是我的字体生成或者是CDC出问题了,我现在还要把代码移植到Qt底下使用,谢谢
上面是 arial 字体的情况 下面是具体的例子: 在MFC文档视图程序中设置,并获取字体高度。void CFontView::OnDraw(CDC* pDC) { CFontDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); int i,j=0; int h []={6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,22,23,24,25,26,27,28, 29,30,32,34,36,40,42,48,52,56,60,65,72,76,96,120,144,288}; CFont font; TEXTMETRIC tm; font.CreatePointFont (i,_T("arial"),pDC); CFont *pfontOld = pDC->SelectObject (&font); font.DeleteObject (); LOGFONT lf; TCHAR *fontname = _T("arial");//lf.lfFaceName pfontOld->GetLogFont(&lf); pDC->SelectObject (pfontOld); CString str; str=_T("设置高度:<=================================>获取高度: "); pDC->TextOut (10,0,str); pDC->TextOut (600+10,0,str); str=_T("设置高度值,大概高度值<====>字体高度,外部头高,内部头高,真实高度"); pDC->TextOut (10,30,str); pDC->TextOut (600+10,30,str); int lines =sizeof(h)/sizeof(h[0]); int ypos= 30; for(i =h[j]*10;j<lines;) { font.CreatePointFont (i,fontname,pDC); pDC->SelectObject (&font); pDC->GetTextMetrics(&tm); pDC->SetTextColor (RGB(100,200,200)); ypos += (j%4==0)? tm.tmHeight:0; pDC->TextOut((j%4)*240,lines*20/2+20+ +ypos,_T("arial")); pDC->SetTextColor (RGB(0,0,0)); pDC->SelectObject (pfontOld); font.DeleteObject (); CString info; info.Format (_T("%12d%12d%12s%16d%16d%16d%16d"), i ,( i / 10 * 3 + 1) / 2, _T("") , tm.tmHeight, tm.tmExternalLeading, tm.tmInternalLeading, tm.tmHeight - tm.tmInternalLeading - tm.tmDescent - tm.tmExternalLeading); pDC->TextOut (600*(j%2)+10,20*(j/2)+50,info); j++; i = h[j]*10; } }
上面是 arial 字体的情况 下面是具体的例子: 在MFC文档视图程序中设置,并获取字体高度。void CFontView::OnDraw(CDC* pDC) { CFontDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); int i,j=0; int h []={6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,22,23,24,25,26,27,28, 29,30,32,34,36,40,42,48,52,56,60,65,72,76,96,120,144,288}; CFont font; TEXTMETRIC tm; font.CreatePointFont (i,_T("arial"),pDC); CFont *pfontOld = pDC->SelectObject (&font); font.DeleteObject (); LOGFONT lf; TCHAR *fontname = _T("arial");//lf.lfFaceName pfontOld->GetLogFont(&lf); pDC->SelectObject (pfontOld); CString str; str=_T("设置高度:<=================================>获取高度: "); pDC->TextOut (10,0,str); pDC->TextOut (600+10,0,str); str=_T("设置高度值,大概高度值<====>字体高度,外部头高,内部头高,真实高度"); pDC->TextOut (10,30,str); pDC->TextOut (600+10,30,str); int lines =sizeof(h)/sizeof(h[0]); int ypos= 30; for(i =h[j]*10;j<lines;) { font.CreatePointFont (i,fontname,pDC); pDC->SelectObject (&font); pDC->GetTextMetrics(&tm); pDC->SetTextColor (RGB(100,200,200)); ypos += (j%4==0)? tm.tmHeight:0; pDC->TextOut((j%4)*240,lines*20/2+20+ +ypos,_T("arial")); pDC->SetTextColor (RGB(0,0,0)); pDC->SelectObject (pfontOld); font.DeleteObject (); CString info; info.Format (_T("%12d%12d%12s%16d%16d%16d%16d"), i ,( i / 10 * 3 + 1) / 2, _T("") , tm.tmHeight, tm.tmExternalLeading, tm.tmInternalLeading, tm.tmHeight - tm.tmInternalLeading - tm.tmDescent - tm.tmExternalLeading); pDC->TextOut (600*(j%2)+10,20*(j/2)+50,info); j++; i = h[j]*10; } }
目的是为了获取不同字号下面的tm.tmHeight-tm.tmInternalLeading;但是无论怎么改字号,控件的字体已经变了,但是获得的tm结构体里面的所有值都不变 改字号??SelectObject(hdc,&font)???
改字号??SelectObject(hdc,&font)???