2010-09-15 3 views
3

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

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

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

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

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

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

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

ответ

1

Существует один метод доказательства дурака получения размера.

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

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

Смежные вопросы