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