|
Модераторы: Poseidon, Snowy, bems, MetalFan |
|
shmelina |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Добрый день.
Подскажите, как вычислить ширину TCheckBox? TCheckBox создается динамически и там может быть разный текст. Требуется вычислить ширину контрола и задать ее в соответствии с текстом. Я так понимаю, нужно сложить: ширина квадратика + расстояния между квадратиком и меткой + ширина метки. Пробовал разобраться с исходниками TCheckBox, но ничего не понял. Буду очень признателен, за краткий алгоритм решения этой задачи. Предпочитаю удочку, а не рыбу. Спасибо. |
|||
|
||||
aleksh |
|
|||
Опытный Профиль Группа: Участник Сообщений: 609 Регистрация: 8.7.2008 Репутация: 3 Всего: 13 |
удочку так удочку, есть функции вычисляющие длину слов, размер чекбокса без надписей можно посмотреть в дизайн-тайме, при создании чекбокса брать минимальную ширину + длину текста
|
|||
|
||||
shmelina |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
По удочкой я понимал - помочь разобраться как происходит отрисовка в исходниках компонента. Я так понимаю, что достаточно найти с какого места (Left) рисуется метка.
Функцию вычисления ширины текста можно взять у Canvas, метод TextWidth. Так? Ширину квадратика в дизайне брать как-то не красиво. Не уверен, что при разных обстоятельствах (масштаб, ОС, темы...) она будет одинаковая. Да и расстояние между квадратиком и текстом тоже есть. |
|||
|
||||
Frees |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 9 Всего: 54 |
GetSystemMetrics; а разве у TCheckBox нет AutoSize? -------------------- Кольцов Виктор Владимирович |
|||
|
||||
shmelina |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Точно. Там вроде все что нужно есть. А сложно будет написать компонент-наследник, в котором будет свойство AutoSize? Я просто в исходниках не понял, как там отрисовка происходит. Знаний не хватает. Нет. Я сам в шоке. Я пока пошел простым путем, а там видно будет. Прошу помощи. 1. Нужно ли делать ReleaseDC? Судя по инету - нужно. Но с DC я плохо знаком. 2. Правильно ли я получаю DC? Вернее можно ли его получать вот так. 3. Правильно ли я освобождаю DC? 4. Нужно ли для Canvas указывать шрифт, если я его в CheckBox-е не меняю?
Это сообщение отредактировал(а) shmelina - 6.10.2010, 22:38 |
|||
|
||||
XperT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 2 Всего: 4 |
А если посмотреть как у TLabel организован AutoSize и адаптировать под чекбокс?
Сейчас уже поздно, соображаю плохо, но вроде оно:
|
|||
|
||||
shmelina |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Тут больше было дело не в отрисовке, а в определении ширины всего контрола. Ну тут уже подсказали про GetSystemMetrics, так что этот вопрос снят пока. Все еще жду от вас ответов на вопросы по моему исходнику. Спасибо. |
|||
|
||||
Frees |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 9 Всего: 54 |
вряд ли твой исходник будет всегда корректно работать, например ты не учел Align. XperT правельно говорит, посмотри как это реализовано в других контролах. Это сообщение отредактировал(а) Frees - 7.10.2010, 12:47 -------------------- Кольцов Виктор Владимирович |
|||
|
||||
shmelina |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Align мне не страшен. В моей узкой задаче у этих контролов он не используется. Мне нужно было только правильно рассчитать ширину контролов, чтобы они не наезжали без причины на другие контролы. Прошу прощения, что не рассказал об этом подробнее.
Покопавшись в исходниках CheckBox, я понял, что в этот раз я не осилю эту задачу. Посмотрите, пожалуйста, все ли корректно в исходнике с DC? |
||||
|
|||||
Frees |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 9 Всего: 54 |
+ 16 на GetSystemMetrics; (наверняка есть такая метрика) -------------------- Кольцов Виктор Владимирович |
|||
|
||||
shmelina |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
||||
|
||||
shmelina |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
В общем докладываю. Ширину картинки с галочкой нашел быстро, а вот расстояние между галкой и текстом так и не нашел. Перерыл пол-интернета, клянусь! Возможно знание английского недостаточно хорошее. Везде по-разному рекомендуют, где-то Canvas.TextWidth(' '), где-то GetSystemMetrics(SM_CXEDGE) * 2, где-то GetSystemMetrics(SM_CXBORDER) * 4. Методом тыка понял, что подходит число 4. Последние два варианта его же и показывают.
Я выше спрашивал про Canvas.Font - его указывать не обязательно, если он совпадает у CheckBox и у DC. Проверил на разных шрифтах - все работает правильно. Масштаб шрифтов проверять нет уже сил. Время поиска решения этой задачи превысило все мыслимые пределы. По этому пока останусь на этом варианте:
Всем спасибо за помощь. Как всегда выручили. |
|||
|
||||
zubpost |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 15.3.2018 Репутация: нет Всего: нет |
Я сделал так - Создал хелпер.
Добавляете этот юнит к поекту. И после того как задали текст вызываете процедуру TCheckBox.correctSize.
Это сообщение отредактировал(а) zubpost - 4.6.2019, 19:58 |
|||
|
||||
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |