BCB:如何获得给定TFont中角色的(近似)宽度?

时间:2010-03-08 03:23:16

标签: c++builder

这是一个TMemo,而不是那应该有所不同。

谷歌搜索表明我可以使用Canvas->TextWidth(),但这些是Delphi示例,BCB似乎不提供此属性。

我真的想要一些类似memo->Font->Height宽度的东西。

我意识到并非所有字体都是固定宽度的,因此可以做出很好的估计。

我需要的只是以像素为单位获取TMemo的宽度,并合理猜测它将保留当前字体的字符数。


当然,如果我真的想要懒惰,我可以谷歌的平均身高/宽度比,因为身高已知。请记住,如果准确到达它是一件很棘手的话,那么近似对我来说已经足够了。

http://www.plainlanguagenetwork.org/type/utbo211.htm说:“对于大多数应用,建议宽高比为3:5(0.6)”

2 个答案:

答案 0 :(得分:5)

实际上你的谷歌搜索并没有完全关闭。您确实需要访问画布对象,或者至少需要访问DC对象的句柄。通常,在搜索有关VCL类的帮助时,搜索delphi示例通常是值得的,因为这些更常见。

无论如何要计算字符串的大小,你可以查看TextExtent函数,它是TCanvas类的函数。只需传递要测试的宽度字符,返回值为TSize构造。但是,还有TextWidth函数以及TextHeight函数。你也可以使用它们。实际上这些在内部调用TextExtent

你必须注意一件事,函数使用TCanvas对象的当前字体,更具体地说是绑定到画布使用的DC的字体。因此,首先指定要测试的字体,然后传递字符。

我有一些旧代码可以计算字符串的宽度,如下所示:

// This canvas could be the form canvas: canvas = Form1->Canvas or the 
// memo canvas which will probably be what you want.
canvas->Font->Assign(fontToTest);
int textwidth = TextWidth(textToTest);

如果您想要更多地控制要做什么,您也可以使用Windows API执行此操作,这基本上是VCL为您所做的事情,在这种情况下,以下示例将如下所示:

// This canvas could be the form canvas: canvas = Form1->Canvas
canvas->Font->Assign(fontToTest);
// The initial size, this is really important if we use wordwrapping. This is 
// the text area of the memo control.
TRect rect = ClientRect; 
// This is the font format we wish to calculate using, in this example our text
// will be left aligned, at the top of the rectangle.
fontformat = DT_LEFT | DT_TOP;
// Here we calculate the size of the text, both width and height are calculated
// and stored in the rect variable. Also note that we add the DT_CALCRECT to the
// fontformat variable, this makes DrawTextEx calculate the size of the text,
// without drawing it.
::DrawTextEx(canvas->handle, 
            textToTest.c_str(), 
            textToTest.Length(), 
            &rect, 
            fontformat | DT_CALCRECT, 
            NULL);
// The width is:
int width = rect.Width();

fontformat是一个参数,它指定了如何对齐和布局文本的不同选项,如果您计划绘制文本,最好查看它提供的不同可能性:DrawTextEx Function [1]

编辑:再次阅读您的问题,让我感到震惊的是您可能正在搜索的功能是:GetTextExtentExPoint Windows API文档说明了有关此功能的以下内容:

  

GetTextExtentExPoint 功能   检索中的字符数   一个适合的指定字符串   在指定的空间内并填写   具有每个文本范围的数组   那些人物。 (文本范围是   开头之间的距离   空间和将要的角色   适合这个空间。)这个信息是   对于自动换行计算非常有用。

您可以在此处找到有关GetTextExtentExPoint功能的更多信息:GetTextExtentExPoint Function [2]

[1] http://msdn.microsoft.com/en-us/library/dd162499%28VS.85%29.aspx
[2] http://msdn.microsoft.com/en-us/library/dd144935%28VS.85%29.aspx

答案 1 :(得分:1)

如果您有权访问Win32 API函数,您可以创建一个与TMemo窗口大小相同的RichEdit窗口,将文本放在RichEdit窗口中,发送EM_FORMATRANGE消息到窗口,从结果确定它将保持多少个字符。当然这种方法适用于多行......