Пользовательская кнопка в С#: как удалить фон при наведении?

Я пытаюсь сделать настраиваемую кнопку для своей формы (у которой FormBorderStyle = none) с помощью Visual Studio 2005. У меня есть изображения кнопок с тремя состояниями в 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";
}

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

Как я могу удалить это?


person Tute    schedule 12.10.2008    source источник


Ответы (7)


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

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

person faulty    schedule 12.10.2008
comment
Спасибо за совет MouseEnter, который решил мою проблему медленности изменения цвета фона! - person TechNyquist; 22.10.2015

Я решил это, используя метку вместо кнопки.

// 
// 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: обратите внимание, что теперь я использую кнопку с двумя состояниями вместо трех. Он предназначен (я знаю, что еще могу использовать три).

person Tute    schedule 12.10.2008

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

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

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

Удачного программирования :)

person Fazil Mir    schedule 20.12.2013

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

base.OnMouseEnter(e)

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

person Ahmed Suror    schedule 23.09.2015

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

  1. Установите FlatStyle кнопки на Flat

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

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

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

person Peck_conyon    schedule 12.03.2016

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

person Robin    schedule 08.05.2014

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

person Sospeter Mong'are    schedule 03.09.2017