2009-02-03 3 views
3

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

Вот скриншот:
Button Screenshot http://www.freeimagehosting.net/uploads/b28a5c63b8.jpg

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

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

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

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

ответ

2

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

ImageAlign: MiddleRight 
TextAlign: MiddleLeft 

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

+0

Я использую Image, а не BackgroundImage (я попробовал BackGroundImage, чтобы увидеть, будет ли это работать, но это не так). Мы используем собственный метод .NET Icon.ToBitmap() для преобразования; Я дам это простое растровое изображение. – Patrick

0

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

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

+0

Это хороший момент, но я не думаю, что здесь проблема. У меня есть 7 других кнопок рядом с этим с разными изображениями, и все они имеют такую ​​же проблему. Это значок, преобразованный в растровое изображение, поэтому, возможно, процесс преобразования добавляет информацию в начало изображения. – Patrick

7

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

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

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

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

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

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

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

+3

Настройка Значение заполнения для «0; 0; 1; 1» помогло. Спасибо за решение и объяснение! – Codeguard

+0

ImageAlign = ContentAlignment.MiddleCenter; – Engineer