Пользовательская кнопка в C #: Как убрать зависший фон? - PullRequest
8 голосов
/ 12 октября 2008

Я пытаюсь создать пользовательскую кнопку для своей формы (которая имеет FormBorderStyle = нет) с помощью Visual Studio 2005. У меня есть изображения кнопок с 3 состояниями в ImageList, связанном с кнопкой.

this.btnClose.AutoSize = false;
this.btnClose.BackColor = System.Drawing.Color.Transparent;
this.btnClose.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
this.btnClose.FlatAppearance.BorderSize = 0;
this.btnClose.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnClose.ForeColor = System.Drawing.Color.Transparent;
this.btnClose.ImageKey = "Disabled";
this.btnClose.ImageList = this.imageList1;
this.btnClose.Location = new System.Drawing.Point(368, -5);
this.btnClose.Margin = new System.Windows.Forms.Padding(0);
this.btnClose.Name = "btnClose";
this.btnClose.Size = new System.Drawing.Size(31, 31);
this.btnClose.TabIndex = 0;
this.btnClose.UseVisualStyleBackColor = false;
this.btnClose.MouseLeave += new System.EventHandler(this.btnClose_MouseLeave);
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
this.btnClose.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnClose_MouseDown);
this.btnClose.MouseHover += new System.EventHandler(this.btnClose_MouseHover);

private void btnClose_MouseHover(object sender, EventArgs e)
{
    btnClose.ImageKey = "enabled";
}

private void btnClose_MouseDown(object sender, MouseEventArgs e)
{
    btnClose.ImageKey = "down";
}

private void btnClose_MouseLeave(object sender, EventArgs e)
{
    btnClose.ImageKey = "disabled";
}

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

Как мне это убрать?

Ответы [ 8 ]

39 голосов
/ 01 июня 2010
btnClose.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
11 голосов
/ 12 октября 2008

Серый фон обусловлен настройкой «System.Windows.Forms.FlatStyle.Flat», это поведение по умолчанию, так как при наведении курсора на него нужно выделять кнопку Чтобы устранить это, вам, возможно, придется написать собственный класс кнопок, наследовать от исходной кнопки и выполнить некоторую пользовательскую рисование для достижения этого.

Кстати, вместо установки «включена» в MouseHover, вы должны сделать это в MouseEnter. MouseEnter и MouseLeave - это пара, которая указывает, находится ли мышь внутри кнопки или нет, и она срабатывает один раз за вход / выход. Где MouseHover - это огонь, когда мышь перемещается внутри кнопки, что создает незаметную повторяющуюся настройку «enabled».

2 голосов
/ 23 сентября 2015

У меня есть одно предложение. Создайте свою собственную форму получения класса кнопки Button. Затем переопределите в ней событие MouseEnter. Просто удалите код для вызова базовой реализации.

base.OnMouseEnter(e)

PS: Вы не сможете использовать событие MouseEnter вне производного класса (например, проект, использующий этот элемент управления)

2 голосов
/ 21 декабря 2013

create Mouse Enter событие, которое приведено ниже.

private void forAllButtons_MouseEnter(object sender, EventArgs e)
{
    Button b = (Button)sender;
    b.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
}

затем назначьте это событие всем кнопкам.

Счастливого программирования:)

2 голосов
/ 13 октября 2008

Я решил это с помощью метки вместо кнопки.

// 
// imageListButtons
// 
this.imageListButtons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListButtons.ImageStream")));
this.imageListButtons.TransparentColor = System.Drawing.Color.Transparent;
this.imageListButtons.Images.SetKeyName(0, "close_normal");
this.imageListButtons.Images.SetKeyName(1, "close_hover");
// 
// lblClose
// 
this.lblClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.lblClose.BackColor = System.Drawing.Color.Transparent;
this.lblClose.ImageKey = "close_normal";
this.lblClose.ImageList = this.imageListButtons;
this.lblClose.Location = new System.Drawing.Point(381, 7);
this.lblClose.Margin = new System.Windows.Forms.Padding(0);
this.lblClose.Name = "lblClose";
this.lblClose.Size = new System.Drawing.Size(12, 12);
this.lblClose.TabIndex = 0;
this.lblClose.MouseLeave += new System.EventHandler(this.lblClose_MouseLeave);
this.lblClose.MouseClick += new System.Windows.Forms.MouseEventHandler(this.lblClose_MouseClick);
this.lblClose.MouseEnter += new System.EventHandler(this.lblClose_MouseEnter);


private void lblClose_MouseEnter(object sender, EventArgs e)
{
    lblClose.ImageKey = "close_hover";
}

private void lblClose_MouseLeave(object sender, EventArgs e)
{
    lblClose.ImageKey = "close_normal";
}

private void lblClose_MouseClick(object sender, MouseEventArgs e)
{
    this.Close();
}

PS: обратите внимание, что теперь я использую кнопку с двумя состояниями вместо трех. Это предназначено (я знаю, что я все еще могу использовать три).

1 голос
/ 12 марта 2016

Привет, вы просто можете легко применить эти изменения к вашей кнопке, используя эти две строки кодов.

  1. Установите для FlatStyle кнопки значение Flat

    this.btnClose.FlatStyle = FlatStyle.Flat;
    
  2. Установите для MouseOverBackColor кнопки значение Прозрачный

    this.btnClose.FlatAppearance.MouseOverBackColor = Color.Transparent;
    

Надеюсь, это поможет. Спасибо

0 голосов
/ 04 сентября 2017

Чтобы решить эту проблему, установите MouseOverBackColor в прозрачный порядок, чтобы удалить серый фон.

0 голосов
/ 08 мая 2014

Вы также можете остановить изменение цвета кнопки, отменив выбор параметра IsHitTestVisible в Свойствах кнопок> Общие> IsHitTestVisible Может быть, это также может помочь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...