Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Button, ShowDialog & Button Border (Flat style)


Автор: Kefir 9.6.2006, 23:04
Есть кнопка FlatStyle = Flat. BorderSize = 0. У неё прозрачный фон и натянут ПНГ в прозрачностью по краям. На клик повешен обработчик:
Код

        private void buttonLanguage_Click(object sender, EventArgs e)
        {
            language_popup lang = new language_popup(); // это форма типа меню (см. аттач справа)
            lang.Location = new Point(((Button)sender).Location.X, ((Button)sender).Location.Y + 100); // тут указывается где форма должна появится
            lang.ShowDialog(); // ну тут ясное дело форма показывается
            this.currentLanguage = lang.language; // из формы достаётся иднтификатор выбранного языка (см. скрин в аттаче и поймёте при чём тут язык %))
            lang.Dispose(); // подметаем
            this.changeLanguage(); // это не влияет на ситуацию, но для полноты картины скажу - ф-ция "переводит" надписи на контролах на выбранный язык
            ((Button)sender).BackgroundImage = global::ERD.Properties.Resources.button2a; // смена картинки кнопки с "нажатого" состояние на обычное
        }

На проблему можно посмотреть в аттаче - там скрин до нажатия кнопки и после. Как видно на картинке - сразу после нажатия на кнопку (== после появления фромы lang) вокруг кнопки появляется странный беленький бордер, который нигде не описан и не определён. Если закомментировать строку lang.ShowDialog(); то рамка не появляется.
Где рамку отключить? Она мне всю малину портит. 

PS Цвет появляющейся рамки равен Flatprance.BorderColor (now that's strange), но ведь BorderSize = 0!!!  

Автор: -ser- 10.6.2006, 09:32
любая кнопка имеет не одно, а два или три состояния (например, нажатая, в фокусе, отжатая). т.е. идея такова, что тебе надо проверить проперти каждого состояния кнопки. BorderSize = 0 это размер рамки кнопки в отжатом состоянии и не в фокусе, но к твоей задаче это никакого отношения не имеет.

в твоем случае рамка перестанет появляться, если установить проперть
Код

buttonLanguage.FlatAppearance.BorderColor = //твой фон


BorderSize можно вообще не трогать.

 

Автор: Kefir 10.6.2006, 11:33
Насчёт того, что кнопки имеют много состояний я знаю. У меня на MouseEnter, MouseLeave, MouseDown & MouseUp повешены события (смена фонового изображения). Вот пример:
Код

        private void buttonDown_MouseUp(object sender, MouseEventArgs e)
        {
            ((Button)sender).BackgroundImage = global::ERD.Properties.Resources.arrow4b;
        }

Что касается проверки каждого состояния - должно быть всё нормального, т.к. это не единственная кнопка у меня... однако это единственная кнопка в открытием другой формы. На всех остальных кнопках точно такой-же код, но рамки нет... хотя на всякий случай я перепроверю.

Установить BorderColor к сожалению не представляется возможным из-за фона формы (т.е. фон - это картинка, а значит там нет единого цвета - там раные разводы и рюшечки, которые наваял дизайнер). Первая мысль у меня была - поставить прозрачный цвет, однако BorderColor такой возможности не поддерживает...

Если надо могу запостит InitializeComponent... 

Автор: -ser- 12.6.2006, 14:16
да, с обычной кнопкой я тоже все перепробовал, так ничего и не вышло.

но вышло не с обычной, а именно, вместо Button используй CheckBox. Только поставь его Appearance в Button.

проверил, работает так как ты хочешь. 

наверно, я даже рад больше чем ты, Kefir smile   

Автор: Kefir 12.6.2006, 18:08
ура! работает! благодарю покорнейше за совет.

(и всё равно не понимаю почему эта рамочка там ызает, но это не важно уже...) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)