Изображение кнопки слишком далеко от верхней части кнопки; слишком близко к нижней части кнопки - PullRequest
5 голосов
/ 03 февраля 2009

Я работаю над формой Windows в VB.NET 2005, и я хотел бы иметь несколько кнопок с изображениями (я говорю о простой, ванильной System.Windows.Forms.Button). У меня все настроено так, как я хочу, но изображения на кнопке отображаются слишком низко, так что нижняя часть значка находится почти справа от нижней части кнопки, а над изображением остается много места.

Вот скриншот:
Кнопка Скриншот http://www.freeimagehosting.net/uploads/b28a5c63b8.jpg

Посмотрите, как угол значка касается нижней части кнопки?

Моя кнопка имеет высоту 23 пикселя, а изображение представляет собой значок 16 x 16 (преобразуется в растровое изображение, чтобы его можно было присвоить свойству Image кнопки).

Я попытался установить для свойства кнопки Margin.All значение 0 и подтвердил, что для свойства Padding.All установлено значение 0. Я также попытался изменить значение ImageAlign кнопки на TopLeft, MiddleLeft и BottomLeft, но ни один из этих параметров похоже, что-то влияет.

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

Ответы [ 3 ]

9 голосов
/ 30 августа 2010

Я только что столкнулся с подобной проблемой, которую я смог решить, подумав очень серьезно. (Разве эти ситуации не велики?)

Объяснение

Во-первых, важно понимать, что ImageAlign НЕ означает, где на кнопке вы хотите изображение. Это означает, какую точку (пиксель) на изображении следует использовать для позиционирования. Поэтому, если вы выберете «TopLeft», самый верхний левый пиксель изображения будет вертикально центрирован на кнопке.

Проблема возникает, когда у вас есть кнопка с центрированным изображением, у которой ImageAlign установлен вертикально по центру, а размеры равны четному числу пикселей. Ваше изображение 16x16 пикселей - 16 четное число. Средний пиксель теоретически должен быть где-то между пикселем 8 и пикселем 9. Поскольку пикселя 8.5 нет, VB округляется до 8, тем самым используя пиксель 8 в качестве пикселя позиционирования. Это коренная причина вашего нежелательного верхнего поля.

Ваша кнопка имеет нечетную высоту пикселя (23 пикселя), что означает, что она имеет истинный центральный пиксель-пиксель 12. VB пытается расположить центральный пиксель изображения (8) поверх центрального пикселя кнопки (12). Это помещает 8 пикселей изображения ниже центра и 7 пикселей выше центра. Чтобы выровнять ситуацию, над изображением появляется поле размером в 1 пиксель.

Решение

Дополните изображение 1 дополнительным рядом пикселей внизу. Теперь изображение имеет нечетную высоту (17 пикселей), что дает ему истинный центральный пиксель, который может идеально совпадать с центральным пикселем кнопки.

Вот так я решил проблему для себя. Однако более простое возможное решение только что пришло мне в голову. Вероятно, вы могли бы достичь того же результата, назначив для изображения нижнее поле в 1 пиксель. Я не проверял это решение, но оно теоретически эквивалентно первому решению.

Дополнительное примечание: Два объекта ДАЖЕ размеров должны теоретически быть в состоянии выровнять по центру. Но как ни странно, проблема выравнивания возникает, даже если кнопка И изображение ОБА имеют четные размеры. (Очевидно, что компилятор не согласован в том, как он определяет центральный пиксель одного элемента управления по сравнению с другим.) Тем не менее, в этом случае применяется то же решение.

2 голосов
/ 03 февраля 2009

Обычно мы устанавливаем следующие свойства (например, для изображения справа):

ImageAlign: MiddleRight
TextAlign: MiddleLeft

Вы хотите выровнять текст и изображение аналогичным образом. Кроме того, убедитесь, что вы устанавливаете свойство Image, а не свойство BackgroundImage, и убедитесь, что вы правильно выполняете преобразование значка в обычный растровый рисунок. Вы пробовали простой растровый файл?

0 голосов
/ 20 марта 2009

Просто вопрос: вы уверены, что растровое изображение не содержит информации в верхней части изображения заметки? Это случалось со мной не раз, когда кадрирование выглядело правильно в Photoshop и некорректно отображалось в живом коде ...:)

Если бы это было так, ваш код может быть идеальным;)

...