这是一个TMemo,而不是那应该有所不同。
谷歌搜索表明我可以使用Canvas->TextWidth()
,但这些是Delphi示例,BCB似乎不提供此属性。
我真的想要一些类似memo->Font->Height
宽度的东西。
我意识到并非所有字体都是固定宽度的,因此可以做出很好的估计。
我需要的只是以像素为单位获取TMemo的宽度,并合理猜测它将保留当前字体的字符数。
当然,如果我真的想要懒惰,我可以谷歌的平均身高/宽度比,因为身高已知。请记住,如果准确到达它是一件很棘手的话,那么近似对我来说已经足够了。
http://www.plainlanguagenetwork.org/type/utbo211.htm说:“对于大多数应用,建议宽高比为3:5(0.6)”
答案 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消息到窗口,从结果确定它将保持多少个字符。当然这种方法适用于多行......