Один из наших устаревших проектов использует вызовы API для рисования пользовательских элементов управления с использованием текущего визуального стиля ОС (некоторый код можно найти в этот вопрос , который я задал).Мы обнаружили, что классическая кнопка рисуется с отступом в 1 пиксель, а не занимает весь указанный прямоугольник.Например, если нам нужна кнопка 17x17 пикселей:
, фактически мы получаем кнопку 15x15 пикселей:
Другие подобные элементы управления, такие как кнопка со списком, нарисованы точно с требуемым размером:
Наша цель - нарисовать кнопку, чтобы она занимала весь указанный прямоугольник.Да, я знаю, что если мы рисуем визуальными стилями, это окружающее пространство можно использовать для полупрозрачных эффектов для основного нарисованного элемента управления, но все наши проверки подтверждают, что это 1-пиксельное поле вообще не используется - ни в Windows 10, ни в Windows 10в Windows 7. Самым простым и «грубым» решением было бы указать прямоугольник, накачанный на 1 пиксель, для рисования кнопки, но этот подход может конфликтовать, если что-то изменится в будущей реализации визуальных стилей в Windows.
Таким образом, вопрос заключается в следующем: можем ли мы каким-либо образом программно определить, что кнопка, нарисованная с текущим визуальным стилем, использует поле, и, таким образом, мы можем принять это во внимание, когда указываем прямоугольник для рисования кнопки?
Идея.Возможно, мы можем получить эту информацию из вызовов API, которые запрашивают низкоуровневые свойства элемента визуального стиля, например:
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ.Вот скриншот комбо-кнопки и обычной кнопки, нарисованной в прямоугольнике 17x17 пикселей в Windows XP с темой Silver Luna:
AsВы можете видеть, что обе кнопки нарисованы точно с заданным размером:
Ниже вы видите одинаковые кнопки, нарисованные с одинаковым кодом в Windows 7:
Теперь кнопка справа занимает прямоугольник 15x15 пикселей.