Как вы определяете подходящий размер при рисовании CheckBox? - PullRequest
3 голосов
/ 16 сентября 2010

Я помогаю кому-то преобразовать огромный беспорядок панелей и 700 дотошно расположенных флажков с чем-то немного более вменяемым.Я планирую реализовать пользовательский элемент управления, который использует класс ControlPaint для рисования флажков вручную;это облегчит работу с данными, и удаление 700 дескрипторов GDI из формы, вероятно, будет хорошей вещью *.

ControlPaint.DrawCheckbox () занимает графика , границы для флажка и ButtonState .Границы казались интересными;Я подумал, что поведение может быть либо:

  • Если я предоставлю слишком много места, я получу флажок, нарисованный по центру в этих границах.
  • Я получу флажок размером с границыЯ указал.

Итак, я протестировал прямоугольник 100x100 для границ и обнаружил, что результатом является флажок 100x100.Интересно!Тем не менее, я просто хочу простой старый флажок, который отображается с размером системы по умолчанию для флажка.Я ожидал, что это будет вызов некоторой функции API, такой как GetSystemMetrics () , но я не уверен, что что-то выделяется как правильный путь.(Возможно, SM_CXMENUCHECK? Кажется, это только случайно).

CheckBoxRenderer рендеринг с правильным размером.Я собираюсь использовать это, но мне не нравится не знать, как что-то сделать.Поэтому я поковырялся с Reflector, чтобы посмотреть, что он делает.Если вы визуализируете с каким-то визуальным стилем, он вызывает GetThemePartSize () , который является довольно сложным вызовом API, но, по крайней мере, отвечает, как я могу получить размер для визуальной темы.Что интересно, если визуальные стили не используются, кажется, что они возвращают жестко заданный размер: 13x13.Является ли размер флажка системы действительно жестко заданным в квадрате 13 пикселей, или это был просто ленивый недосмотр MS?

Смысл этого вопроса не в том, чтобы сказать мне, чтобы просто использовать CheckBoxRenderer .Я уже делаю это.Мне было любопытно, как найти размер самому, и в процессе написания этого использовался Reflector, и теперь мне любопытно, является ли размер на самом деле тем, что нельзя изменить.

* I 'Я осознаю, что иметь 700 на экране что-либо - плохая идея, даже если вы найдете способ, который использует отрицательную память.Шаг 2 этого проекта предлагает более разумный дизайн.DataGridView уже был отклонен как нечто, что просто не выглядело правильно.Я пытаюсь делать что-то одно за раз, и мне также искренне любопытно, есть ли способ определить размер флажка системы.

1 Ответ

1 голос
/ 17 сентября 2010

Существует один надежный способ получения размера.

1, Вы добавляете фактический экземпляр CheckBox к своей Форме. 2. Расположите его так, чтобы его не было видно. Местоположение = (-1000, -1000) 3, установите флажок текст на все, что вы хотите измерить. 4, используйте checkBox1.GetPreferredSize (Size.Empty)

Это тогда дает предпочтительный размер, который является фактическим размером, необходимым для отрисовки этого элемента управления с текущей настройкой текста, которую вы ему дали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...