怎样得到任意字体的不同字符宽度---请教~~~~~~~~~折磨我好久了
就是得到任意一种字体(至少是Windows里面自带的所有字体)的大小写英文字符,汉字;也就是全角、半角字符的宽度。
使用GetCharWidth等函数得到的永远不变,不知是否我搞错了。呜呜
procedure TFormRadiusClient.Button1Click(Sender: TObject);
begin
Canvas.Font.Size := 16;
Canvas.Font.Name := '宋体';
Caption := IntToStr(Canvas.TextWidth('你要的是它?'));
end;
procedure TFormRadiusClient.Button1Click(Sender: TObject);
begin
Canvas.Font.Size := 16;
Canvas.Font.Name := '宋体';
Caption := IntToStr(Canvas.TextWidth('你要的是它?'));
end;
用DrawText的DT_CACLRECT
使用api
GetTextExtentPoint32
https://www.cnblogs.com/del/archive/2008/02/09/1066230.html
https://www.cnblogs.com/del/archive/2008/02/09/1066250.html
https://www.cnblogs.com/del/archive/2008/02/18/1072778.html
GetCharABCWidths 返回字符宽度
GetCharABCWidthsFloat 返回字符宽度
GetCharWidth 返回字符宽度
GetCharWidth32 返回字符宽度
GetCharWidthFloat 返回部分字符宽度
LOGFONT lf;
strcpy(lf.lfFaceName,TextFaceName);
lf.lfCharSet=TextCharFormat;
lf.lfWeight=TextWeight;
lf.lfWidth=TextSize;
lf.lfHeight=-MulDiv(TextSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
lf.lfItalic=TextItalic;
lf.lfUnderline=TextUnderline;
lf.lfStrikeOut=TextStrikeOut;
上述代码描述字体的结构体
本文主要研究字体高度的计算。lf.lfHeight=-MulDiv(TextSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
其中
-
TextSize是字体大小,单位是(pt)
-
GetDeviceCaps(hDC, LOGPIXELSY)是获取屏幕垂直方向的DPI(像素密度)单位是(像素点个数/英寸)
-
72是是1pt的值,即1pt=1/72英寸
MulDiv(a,b,c)作用是计算a*b/c
即 TextSize*GetDeviceCaps(hDC, LOGPIXELSY)/72得到字体高度(像素个数)
windows C++如何根据文本字符串计算其绘制需占用宽度
分析
计算某串文本在绘制UI上需要占用的宽度,需要以下几个要素:
字符串本身
所使用的字体
字体会影响所绘制的文字的宽度——那是理所当然的
所使用的GDI或GDI+对象
方法
GDI
::SelectObject(hDC, hFont);
//第四个参数:指向SIZE结构的指针,该结构中字符串的尺寸将被返回。
::GetTextExtentPoint32(hDC, str, StrLen(str), &sizeText);
GDI+
比GDI复杂,需要使用到GDI+对象的APIMeasureString
Gdiplus::RectF rc1(0, 0, 5000, 2000);
Gdiplus::RectF rc2(0, 0, 0, 0);
g.MeasureString(str, -1, pFont, rc1, pStrFormat, &rc2);
return rc2.Width;
其中参数4是Gdiplus::StringFormat,类似的赋值方式如下:
Gdiplus::StringFormat* pStrFormat = new Gdiplus::StringFormat();
pStrFormat->SetAlignment(enHAlign);
pStrFormat->SetLineAlignment(enVAlign);
If_Do(nFormat != 0, pStrFormat->SetFormatFlags(nFormat));
可以参考MSDN上的StringAlignment Enumeration,和StringFormatFlags Enumeration。
举例:SetFormatFlags传入参数StringFormatFlagsNoWrap则禁用换行,否则在矩形内绘制文本时是自动换行的。
还可以使用SetTextRenderingHintAPI设置文本的渲染模式,可参考MSDN中关于TextRenderingHint Enumeration的资料,一般情况下使用默认的TextRenderingHintSystemDefault即可
参考链接
GDI+学习及代码总结之------文本与字体
分析
计算某串文本在绘制UI上需要占用的宽度,需要以下几个要素:
字符串本身
所使用的字体
字体会影响所绘制的文字的宽度——那是理所当然的
所使用的GDI或GDI+对象
方法
GDI
::SelectObject(hDC, hFont);
//第四个参数:指向SIZE结构的指针,该结构中字符串的尺寸将被返回。
::GetTextExtentPoint32(hDC, str, StrLen(str), &sizeText);
GDI+
比GDI复杂,需要使用到GDI+对象的APIMeasureString
Gdiplus::RectF rc1(0, 0, 5000, 2000);
Gdiplus::RectF rc2(0, 0, 0, 0);
g.MeasureString(str, -1, pFont, rc1, pStrFormat, &rc2);
return rc2.Width;
其中参数4是Gdiplus::StringFormat,类似的赋值方式如下:
Gdiplus::StringFormat* pStrFormat = new Gdiplus::StringFormat();
pStrFormat->SetAlignment(enHAlign);
pStrFormat->SetLineAlignment(enVAlign);
If_Do(nFormat != 0, pStrFormat->SetFormatFlags(nFormat));
可以参考MSDN上的StringAlignment Enumeration,和StringFormatFlags Enumeration。
举例:SetFormatFlags传入参数StringFormatFlagsNoWrap则禁用换行,否则在矩形内绘制文本时是自动换行的。
还可以使用SetTextRenderingHintAPI设置文本的渲染模式,可参考MSDN中关于TextRenderingHint Enumeration的资料,一般情况下使用默认的TextRenderingHintSystemDefault即可
参考链接
GDI+学习及代码总结之------文本与字体