• 返回字符宽度


    怎样得到任意字体的不同字符宽度---请教~~~~~~~~~折磨我好久了
    就是得到任意一种字体(至少是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);

    其中

    1. TextSize是字体大小,单位是(pt)

    2. GetDeviceCaps(hDC, LOGPIXELSY)是获取屏幕垂直方向的DPI(像素密度)单位是(像素点个数/英寸)

    3. 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+学习及代码总结之------文本与字体

    转载于:https://www.cnblogs.com/HelloGreen/p/11538011.html

  • 相关阅读:
    LVS Nginx和HAproxy的区别,怎么选择最好
    PXE+kickstart自动化安装
    DHCP服务搭建
    自动化安装
    Zabbix trigger(触发器)设置
    Zabbix Agent 安装指南和 Zabbix Server 设置自动发现
    Zabbix Server安装指南
    MariaDB安装
    事件绑定
    事件驱动式
  • 原文地址:https://www.cnblogs.com/marklove/p/16170233.html
Copyright © 2020-2023  润新知