创建 TCanvas 来测量文本宽度

Creating TCanvas to measure text width

我想测量 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;
}

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

您必须为 canvas 分配句柄才能使用 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;
}

应该可以。

VCL 有一个 TControlCanvas class 用于将 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;
}