【问题标题】:Creating TCanvas to measure text width创建 TCanvas 来测量文本宽度
【发布时间】:2021-12-06 02:31:45
【问题描述】:

我想测量 TButton 的文本宽度,以便在文本更改时调整它的大小。如果按钮使用ParentFont,我可以使用Canvas的形式来获取宽度:

int GetButtonTextWidth(TForm* form, TButton* btn)
{
    const int base = form->Canvas->TextWidth(btn->Caption);
    const int margin = 16;
    return base + margin;
}

如果按钮有不同的字体,例如它是粗体,这是不准确的。我尝试创建一个新的TCanvas

int GetButtonTextWidth(TForm* form, TButton* btn)
{
    std::unique_ptr<TCanvas> canvas(new TCanvas);
    canvas->Font = btn->Font;
    const int base = canvas->TextWidth(btn->Caption);
    const int margin = 16;
    return base + margin;
}

这给出了例外:“画布不允许绘图”。如何创建一个TCanvas 以允许测量文本宽度并提供准确的结果?

【问题讨论】:

标签: c++ c++builder vcl


【解决方案1】:

VCL 有一个TControlCanvas 类,用于将 Canvas 与 UI 控件相关联。

int GetButtonTextWidth(TButton* btn)
{
    std::unique_ptr<TControlCanvas> canvas(new TControlCanvas);
    canvas->Control = btn;
    canvas->Font = btn->Font;
    const int base = canvas->TextWidth(btn->Caption);
    const int margin = 16;
    return base + margin;
} 

【讨论】:

    【解决方案2】:

    您必须为画布分配一个句柄才能使用TCanvas::TextWidth()。所以把你的代码改成

    int GetButtonTextWidth(TForm* form, TButton* btn)
    {
        std::unique_ptr<TCanvas> canvas(new TCanvas);
        canvas->Handle = form->Canvas->Handle;
        canvas->Font = btn->Font;
        const int base = canvas->TextWidth(btn->Caption);
        const int margin = 16;
        return base + margin;
    }
    

    应该可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 2013-11-30
      • 1970-01-01
      • 2014-02-22
      • 2015-09-27
      • 1970-01-01
      相关资源
      最近更新 更多