【发布时间】:2014-05-06 14:59:27
【问题描述】:
我正在尝试使用 Windows API 函数DrawText,但没有得到我期望的结果。也许我在这里做错了什么,但是当我阅读文档时,我真的没有看到问题。我正在使用以下代码。
function GetEllipsisString(Font: TFont; const Text: string;
Width: integer): String;
var
DC: HDC;
SaveFont: HFont;
R: TRect;
begin
DC := GetDC(0);
try
SaveFont := SelectObject(DC, Font.Handle);
R := Rect (0, 0, Width-1, 0);
Result := Text+' ';
Winapi.Windows.DrawtextW (DC, PChar(Result), Length(Result), R,
DT_CALCRECT+DT_LEFT+DT_PATH_ELLIPSIS+DT_MODIFYSTRING);
SelectObject(DC, SaveFont);
finally
ReleaseDC(0, DC);
end;
end;
DT_PATH_ELLIPSIS 似乎什么也没做。我用 DT_END_ELLIPSIS 进行了尝试,这给了我一些结果(参见示例)。当我给参数“Text”一个带有反斜杠(\)的字符串时,它似乎设置了省略号,但该函数忽略了矩形测量值。
示例
Text = 'This text has to many characters to fit.'
DT_END_ELLIPSIS returns 'This text has to m...'#0'characters to fit. '
DT_PATH_ELLIPSIS returns 'This text has to many characters to fit. '
【问题讨论】:
-
您打印的字符串不是路径。您期待什么结果?
-
我期待的是这样的:“这个文本有......适合的字符。”文档说明:“对于显示的文本,用省略号替换字符串中间的字符,以便结果适合指定的矩形。”
-
据我所知,反斜杠之间的路径正在缩短。
-
@MBo:这不是“保持沉默”。常量的名称使用
PATH是有原因的 - 它用于制作包含文件或目录名称的文本,因此是 PATH 一词。 -
我用
DT_PATH_ELLIPSIS做了ownerdraw listbox 并且可以确认它工作正常。 @TLama 绝对正确,DrawText缩短了中间路径组件,保留了前导和尾随。