![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать размер текста в произвольном контроле [D7]
MsGuns © (2008-09-20 19:53:00)Это может быть, например, ячейка сетки и шрифт может быть разным в разных ячейках (код в соотв.обработчике).
Узнать надо не внутри OnDrawxxx, а "извне", скажем по кнопке.
Спасибо за ответы
MsGuns (2008-09-21 02:08:00) [21]>Германн © (21.09.08 01:32) [5]
>А если я там в "клиентской части" захочу нарисовать картинку?
Дело в том, что пользователь при всем старании не сможет рисовать картинки - он может лишь вводить текст, изменяя его ширину и/или высоту (при многострочности) - вот их-то мне и надо бы как-то определять.
Конечно, при программномизменении физических параметров текстов (фонта, стиля и т.д.) определить что там реально нарисовано можно, вероятно только так, как описал Юра, но можно же наплевать на "хитрости" и предположить, что фонт един для всего контрола (речь идет о сетках к примеру). В этом случае можно, казалось бы, воспользоваться методами TCanvas так, как это, к примеру, описано у Пачеко, но вся сложность в том, как доступиться до канвы этого самого контрола. Я пробовал делать так, как реализовано в методе TextWidth канвы в самом VCL, используя HDC и WinAPI (саму функцию не помню, помню только что последние 2 символа ее названия '32') - но ширина текста определяется одинаково для разных физических ширин (брал просто два эдита, писал туда один и тот же текст, но в одном делал fsBold, а в другом нет, - код давал одиниковое значение, хотя ширины, естественно, отличались)
Германн (2008-09-21 01:32:00) [22]
> MsGuns © (20.09.08 21:43) [4]
>
> >Юрий Зотов © (20.09.08 20:55) [2]
>
> Собственно, вопрос возник из того, что необходимо иметь
> средство для автоматического изменения размеров клиентской
> части области "рисования" текста в зависимости от его фактической
> ширины и высоты в пикселях (в данный момент это ширина колонки
> грида, но хотелось бы сделать что-то универсальное)
>
А если я там в "клиентской части" захочу нарисовать картинку?
MsGuns (2008-09-20 21:43:00) [23]>Юрий Зотов © (20.09.08 20:55) [2]
Собственно, вопрос возник из того, что необходимо иметь средство для автоматического изменения размеров клиентской части области "рисования" текста в зависимости от его фактической ширины и высоты в пикселях (в данный момент это ширина колонки грида, но хотелось бы сделать что-то универсальное)
guav (2008-09-20 21:40:00) [24]Если можно заставить контрол нарисоваться на своём HDC, нарисовать на метафайле (TMetafileCanvas вроде), из метафайла можно получить всю прорисовку как последовательность GDI комманд.
Юрий Зотов (2008-09-20 20:55:00) [25]> Д С (20.09.08 20:08) [1]
Достаточно даже просто объявить класс, без публикации свойства. И даже без END:
type
TFontedControl = class(TControl);
> MsGuns © (20.09.08 19:53)
Если юзер рисует текст сам и размер "локального" фонта не связан ни с какими свойствами контрола, то как его узнаешь? Он известен только там, где рисуется текст.
Но можно придумать косвенный способ. Например, сканируем ячейку грида по горизонтальным линиям пикселей. Там, где первый раз встретился пиксель с цветом, отличным от цвета фона - там начало высоты текста. А там, где такой пиксель встретился последний раз - там конец высоты текста. Добавляем стандартные зазоры - получаем высоту фонта.
Д С (2008-09-20 20:08:00) [26]type
TFontedControl=class(TControl)
public
property Font;
end;
....
TFontedControl(SomeControl).Font