Дополнительное поле в 1 пиксель вокруг кнопки, нарисованной с помощью визуальных стилей Windows - PullRequest
3 голосов
/ 31 мая 2019

Один из наших устаревших проектов использует вызовы API для рисования пользовательских элементов управления с использованием текущего визуального стиля ОС (некоторый код можно найти в этот вопрос , который я задал).Мы обнаружили, что классическая кнопка рисуется с отступом в 1 пиксель, а не занимает весь указанный прямоугольник.Например, если нам нужна кнопка 17x17 пикселей:

Push button in Windows 10 (1)

, фактически мы получаем кнопку 15x15 пикселей:

Push button in Windows 10 (3)

Другие подобные элементы управления, такие как кнопка со списком, нарисованы точно с требуемым размером:

Combo button in Windows 10 (3)

Наша цель - нарисовать кнопку, чтобы она занимала весь указанный прямоугольник.Да, я знаю, что если мы рисуем визуальными стилями, это окружающее пространство можно использовать для полупрозрачных эффектов для основного нарисованного элемента управления, но все наши проверки подтверждают, что это 1-пиксельное поле вообще не используется - ни в Windows 10, ни в Windows 10в Windows 7. Самым простым и «грубым» решением было бы указать прямоугольник, накачанный на 1 пиксель, для рисования кнопки, но этот подход может конфликтовать, если что-то изменится в будущей реализации визуальных стилей в Windows.

Таким образом, вопрос заключается в следующем: можем ли мы каким-либо образом программно определить, что кнопка, нарисованная с текущим визуальным стилем, использует поле, и, таким образом, мы можем принять это во внимание, когда указываем прямоугольник для рисования кнопки?

Идея.Возможно, мы можем получить эту информацию из вызовов API, которые запрашивают низкоуровневые свойства элемента визуального стиля, например:

Theme Explorer push button low-level properties


ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ.Вот скриншот комбо-кнопки и обычной кнопки, нарисованной в прямоугольнике 17x17 пикселей в Windows XP с темой Silver Luna:

WinXP Silver Luna Buttons - zoom 1000%

AsВы можете видеть, что обе кнопки нарисованы точно с заданным размером:

Ниже вы видите одинаковые кнопки, нарисованные с одинаковым кодом в Windows 7:

Windows 7 Aero Buttons - zoom 1000%

Теперь кнопка справа занимает прямоугольник 15x15 пикселей.

1 Ответ

0 голосов
/ 14 июня 2019

@ Джонатан Поттер прав. Это визуальный стиль эффекта.

когда включены визуальные стили, вы можете применять разные состояния к разным частям.

Windows рисует определенные части для элементов управления и окон, и эти части делятся на родительскую и дочернюю части. У большинства частей есть состояние - для пример отключен, активен или выбран. Когда вы создаете элемент управления, вы решить, к каким частям элемента управления применить визуальные стили.

См. " Детали и состояния ".

Каков правильный путь? Это зависит от ваших требований.

Для вашей проблемы, если вы не хотите уменьшить размер кнопки, которую вы ожидаете увидеть, вы можете указать идентификатор детали DrawThemeBackground функции до 0, который может быть интерпретирован как "данные, которые являются одинаковыми для всех частей этого элемента".

До Windows 8 визуальный стиль можно было отключить в Control Панель, так что приложение может поддерживать визуальные стили, но не иметь Визуальный стиль применяется в данный момент времени.

В Windows 8 отключить визуальные стили невозможно.

См. " IsAppThemed "

Дополнительные ссылки: " Визуальные стили " " Обзор визуальных стилей " " Использование визуальных стилей с пользовательскими и нарисованными владельцем элементами управления "

...