Форум: "Основная";
Текущий архив: 2004.02.02;
Скачать: [xml.tar.bz2];
ВнизТекст в таблице с фиксированными размерами ячеек. Найти похожие ветки
← →
Lony (2004-01-21 14:30) [0]Есть таблица с фиксированными размерами столбцов и строк. Как сделать, чтобы текст вмещался в границы ячеек посредством уменьшения шрифта? Может кто-нибудь с этим сталкивался...
← →
YuRock (2004-01-21 14:41) [1]В API есть ф-ция GetTextExtentPoint32, которая отдает высоту/длину текста в заданном контексте. С помощью нее (и изменения размера шрифта) можно подобрать минимально допустимый размер шрифта.
P.S. У TCanvas есть соответствующие методы - TextWidth и TextHeight
← →
Lony (2004-01-21 16:01) [2]Не могу разобраться с функцией GetTextExtentPoint32.
HDC зачем нужен, т.е. понятно, зачем он нужен, как его использовать?
lpString - это наша строка?
cbString - определяет число символов в строке?
lpSize - размер прямоугольника текста? А какого он типа, TPoint?
← →
Тимохов (2004-01-21 16:06) [3]Почитай второй абзац сообщения YuRock © (21.01.04 14:41) [1]
← →
YuRock (2004-01-21 16:13) [4]Все ответы верны, кроме первого (его нет):
HDC нужен ф-ции для того, чтобы получить текущий шрифт, установленый на Вашем контексте.
Получить его можно с помощью GetDC(hWindow), где hWindow - хендл вашего окна (таблицы).
В крайнем случае можно использовать DC "нулевого" окна. Пример:
var
DC: HDC
begin
DC := GetDC(0);
... // Здесь можно как-то использовать DC
ReleaseDC(0, DC);
end;
← →
Тимохов (2004-01-21 16:20) [5]YuRock © (21.01.04 16:13) [4]
Вопрос Вам.
ReleaseDc обязательно делать?
← →
YuRock (2004-01-21 16:25) [6]> Тимохов © (21.01.04 16:20) [5]
Ну, как вам сказать...
Если в 95/98/ME можно и сделать, и потом может поработань некоторое время программа,
а вот в NT/2k/XP/03 надо обязательно - иначе в лучшем случае чудеса начнутся
← →
Тимохов (2004-01-21 16:28) [7]YuRock © (21.01.04 16:25) [6]
В свое время мне лень было читать MSDN по этому вопросу, так что стал пользоваться TControlCanvas.
Спавибо за ответ - буду знать.
← →
Lony (2004-01-21 16:30) [8]А для структуры SIZE надо создавать новый тип?
Т.е.
type
NewType = record
w: Integer;
h: Integer;
end;
var
d: NewType;
a: PChar;
c: Integer;
begin
GetTextExtentPoint32(GetDC(Edit1.Handle),a,c,d);
end.
Просто ошибку пишет "types of actual and formal var parameters must be identical".
← →
Тимохов (2004-01-21 16:32) [9]Открой модуль graphics
По строке поиска "GetTextExtentPoint32" найди интересующие тебя места - все вопросы сами отпадут.
← →
Lony (2004-01-21 16:36) [10]А, всё, понял. TSize! Спасибо за помощь!
← →
Тимохов (2004-01-21 16:37) [11]И вообще как ты при такой GetTextExtentPoint32(GetDC(Edit1.Handle),a,c,d) записи собараешься вызывать ReleaseDc?
← →
YuRock (2004-01-21 16:42) [12]> А для структуры SIZE надо создавать новый тип?
Не обязательно. Есть TSize.
> пример кода
1. Что такое a? Кто память будет выделять под нее?
2. Чему равно с? Оно должно быть равно длине строки a!
3. Как Вы собираетесь делать ReleaseDC?..
В общем, вот рабочий вариант (пример):
var
DC: HDC;
sz: TSize;
begin
DC := GetDC(Edit1.Handle);
GetTextExtentPoint32(DC, PChar(Edit1.Text), Length(Edit1.Text), sz);
ShowMessage(IntToStr(sz.cx) + " : " + IntToStr(sz.cy));
ReleaseDC(Edit1.Handle, DC);
end.
или (намного проще, но делает то же самое (только дольше)):
begin
ShowMessage(Edit1.Canvas.TextWidth(Edit1.Text) + " : " + Edit1.Canvas.TextHeight(Edit1.Text));
end.
← →
Lony (2004-01-21 16:46) [13]Огромное спасибо. Теперь всё понял.
← →
Lony (2004-01-21 17:27) [14]Что я опять неправильно делаю? При любом размере шрифта в TEdit выдаются одни и те же значение длины. Почему?
← →
YuRock (2004-01-21 17:43) [15]А как Вы делаете? Если в точности, как в [12], то так и должно быть, ведь текущий шрифт - совсем не тот, который у текста эдита.
Легко через канвас, к сожалению, не получится, но так работать будет:
var
DC: HDC;
sz: TSize;
OldFont: HFONT;
begin
DC := GetDC(Edit1.Handle);
OldFont := SelectObject(DC, Edit1.Font.Handle);
GetTextExtentPoint32(DC, PChar(Edit1.Text), Length(Edit1.Text), sz);
SelectObject(DC, OldFont);
ReleaseDC(Edit1.Handle, DC);
ShowMessage(IntToStr(sz.cx) + " : " + IntToStr(sz.cy));
end.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.02;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.018 c