Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Общие вопросы > TCheckBox.AutoSize |
Автор: shmelina 6.10.2010, 20:01 |
Добрый день. Подскажите, как вычислить ширину TCheckBox? TCheckBox создается динамически и там может быть разный текст. Требуется вычислить ширину контрола и задать ее в соответствии с текстом. Я так понимаю, нужно сложить: ширина квадратика + расстояния между квадратиком и меткой + ширина метки. Пробовал разобраться с исходниками TCheckBox, но ничего не понял. Буду очень признателен, за краткий алгоритм решения этой задачи. Предпочитаю удочку, а не рыбу. Спасибо. |
Автор: aleksh 6.10.2010, 20:05 |
удочку так удочку, есть функции вычисляющие длину слов, размер чекбокса без надписей можно посмотреть в дизайн-тайме, при создании чекбокса брать минимальную ширину + длину текста |
Автор: shmelina 6.10.2010, 20:14 |
По удочкой я понимал - помочь разобраться как происходит отрисовка в исходниках компонента. Я так понимаю, что достаточно найти с какого места (Left) рисуется метка. Функцию вычисления ширины текста можно взять у Canvas, метод TextWidth. Так? Ширину квадратика в дизайне брать как-то не красиво. Не уверен, что при разных обстоятельствах (масштаб, ОС, темы...) она будет одинаковая. Да и расстояние между квадратиком и текстом тоже есть. |
Автор: shmelina 6.10.2010, 22:09 | ||
Точно. Там вроде все что нужно есть. А сложно будет написать компонент-наследник, в котором будет свойство AutoSize? Я просто в исходниках не понял, как там отрисовка происходит. Знаний не хватает. Нет. Я сам в шоке. Я пока пошел простым путем, а там видно будет. Прошу помощи. 1. Нужно ли делать ReleaseDC? Судя по инету - нужно. Но с DC я плохо знаком. 2. Правильно ли я получаю DC? Вернее можно ли его получать вот так. 3. Правильно ли я освобождаю DC? 4. Нужно ли для Canvas указывать шрифт, если я его в CheckBox-е не меняю?
|
Автор: XperT 7.10.2010, 00:49 | ||
А если посмотреть как у TLabel организован AutoSize и адаптировать под чекбокс? Сейчас уже поздно, соображаю плохо, но вроде оно:
|
Автор: shmelina 7.10.2010, 11:00 | ||
Тут больше было дело не в отрисовке, а в определении ширины всего контрола. Ну тут уже подсказали про GetSystemMetrics, так что этот вопрос снят пока. Все еще жду от вас ответов на вопросы по моему исходнику. Спасибо. |
Автор: Frees 7.10.2010, 12:47 |
вряд ли твой исходник будет всегда корректно работать, например ты не учел Align. XperT правельно говорит, посмотри как это реализовано в других контролах. |
Автор: shmelina 7.10.2010, 15:15 | ||||
Align мне не страшен. В моей узкой задаче у этих контролов он не используется. Мне нужно было только правильно рассчитать ширину контролов, чтобы они не наезжали без причины на другие контролы. Прошу прощения, что не рассказал об этом подробнее.
Покопавшись в исходниках CheckBox, я понял, что в этот раз я не осилю эту задачу. Посмотрите, пожалуйста, все ли корректно в исходнике с DC? |
Автор: Frees 7.10.2010, 16:10 |
+ 16 на GetSystemMetrics; (наверняка есть такая метрика) |
Автор: shmelina 7.10.2010, 16:15 |
Хорошо, посмотрю. А Font надо указывать для Canvas? |
Автор: shmelina 7.10.2010, 18:32 | ||
В общем докладываю. Ширину картинки с галочкой нашел быстро, а вот расстояние между галкой и текстом так и не нашел. Перерыл пол-интернета, клянусь! Возможно знание английского недостаточно хорошее. Везде по-разному рекомендуют, где-то Canvas.TextWidth(' '), где-то GetSystemMetrics(SM_CXEDGE) * 2, где-то GetSystemMetrics(SM_CXBORDER) * 4. Методом тыка понял, что подходит число 4. Последние два варианта его же и показывают. Я выше спрашивал про Canvas.Font - его указывать не обязательно, если он совпадает у CheckBox и у DC. Проверил на разных шрифтах - все работает правильно. Масштаб шрифтов проверять нет уже сил. Время поиска решения этой задачи превысило все мыслимые пределы. По этому пока останусь на этом варианте:
Всем спасибо за помощь. Как всегда выручили. |
Автор: zubpost 4.6.2019, 19:54 | ||
Я сделал так - Создал хелпер. Добавляете этот юнит к поекту. И после того как задали текст вызываете процедуру TCheckBox.correctSize.
|