-
Здравствуйте.
Есть задача выставлять ширину RadioButton'а в runtime, т.к. текст заранее (т.е. в designtime) не известен.
Как узнать сколько занимает места по горизонтали RadioButton с учетом белого кружочка для точки? Т.е. как расчитать ширину, чтобы тект полностью влезал?
Например для размеров стрелов в ScrollBar'е есть GetSystemMetrix. Есть ли что-то подобное для RadioButton'а?
-
есть такие методы Canvas.TextWidth и Canvas.TextHeight. ширина_кружка_от_радиобатона := радио.Width - (Canvas.TextWidth(радио.Text)); думаю что то вроде того, только с тем какой именно кэнвас надо определиться.
-
> только с тем какой именно кэнвас надо определиться.
точнее тут проще будет работать напрямую через API функции, предварительно получив HDC.
-
Кхе-кхе.
Собсно в твоем уравнении 2 неизвесных - ширин_кружка и радио.width.
Мне как раз нужно выставить общую ширину.
Я в общем уже понял, что задача не является решаемой строго.
-
> [3] тимохов (09.10.08 22:16)
мда, что то я не приметил, что ширина не автоматом выставляется у радиобатонов. тогда делать примерно и с запасом )
-
Для чекбокса эмпирически (проверкой на разных ОС, dpi, шрифтах, темах) получено следующее: Ширина = 17 + ширина пробела + ширина текста.
Текст врапится или нет - в зависимости от стиля окна. Подозреваю для радиобаона так же.
-
Я в общем уже понял, что это эмпирика :(
Вообще странно, почему создатели виндовс не засунули эту инфу в getsystemmetrics.
-
Я думаю, что для тем таки засунули, там куча разных метрик. Что касается контролов до тем, то там многие размеры хард-кодятся уже давно и вряд ли они поменяются (типа, размер самой копки чекбокса/радиобаттона - 13х13) Не советую сильно заморачиваться. Код использующий меджик "17 плюс ширина пробела" работает точно. Чтобы совсем успокоится, можно например глянуть что с этими чекбоксами делают в TCheckListBox.DrawCheck из CheckLst при рисовании без тем с Flat = true. Там рисуют плоскую рамку прямо поверх стандартной, зная что стандартная занимает 2 пикселя.
-
Я вообще никогда не заморачивался по этому поводу - у меня всегда была константа 25 (пробел я не учитывал). Но тут, когда пришлось в очередной раз писать рантайм (а я только им и пользуюсь в 95 процентов случаев - дизайнтайм использую только для простейших форм, присутствующих в единственном экземпляре) я подумал, что как-то это по новичковски выглядит использовать константу. Порыл МСДН, друзей поспрошал.
В общем остался на импирике. Только метрики немного изменились (17+пробел)
Ок. Спасибо за подтверждение своей правоты
-
> тимохов (10.10.08 00:11) [8]
А я очень часто использую лэйблы для капшонов радиобатонов и чекбоксов. Очень удобно в отличии от стандартного капшона. ИМХО. :) Только вот с "темами" я не пробовал.
-
> [9] Германн © (10.10.08 01:22)
И клик по лейблу работает ? И Focus Rect рисуется ? И с темами при наведении курсора на лейбл чекбокс подсвечивается ? И клавиатурный акселератор привязывается ? Нет, отдельный лейбл не удобно. про 17 плюс пробел показать легко: включить WordWrap, тогда для любого шрифта, etc враппинга не будет, но он проявится, если заменить 17 на 16. PS: А ещё можно GUI на HTML делать, тогда высчитывать пикселя самому не надо, и для "динамики" подходит хорошо. Пробовал не в делфи правда http://www.terrainformatica.com/htmlayout/
-
> guav © (10.10.08 09:35) [10] > > > [9] Германн © (10.10.08 01:22) > > И
"И" работают. Те, которые я считаю нужными. Про "темы" я уже сказал.
|