C#中的自定义按钮:如何删除悬停背景?

C#中的自定义按钮:如何删除悬停背景?,c#,.net,winforms,button,C#,.net,Winforms,Button,我正在尝试使用VisualStudio2005对我的表单(FormBorderStyle=none)执行自定义按钮。我在链接到按钮的图像列表中有我的3个状态按钮图像 this.btnClose.AutoSize = false; this.btnClose.BackColor = System.Drawing.Color.Transparent; this.btnClose.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Cent

我正在尝试使用VisualStudio2005对我的表单(FormBorderStyle=none)执行自定义按钮。我在链接到按钮的图像列表中有我的3个状态按钮图像

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";
}
一切都在运作,但有一个陷阱。每当我移动鼠标并将鼠标悬停在按钮上时,我都会看到一个令人讨厌的灰色背景


如何删除该选项?

灰色背景是由于设置了“System.Windows.Forms.FlatStyle.Flat”,这是默认行为,因为在悬停时需要突出显示按钮。要消除这一点,您可能需要编写一个自定义按钮类,从原始按钮继承并进行一些自定义绘制来实现这一点


顺便说一句,与其在MouseHover中设置“enabled”,不如在MouseEnter中设置。MouseEnter和MouseLeave是一对,指示鼠标是否在按钮内,并且每次进入/退出都会触发一次。其中,只要鼠标在按钮内移动,就会触发as MouseHover,这会创建不必要的重复设置“enabled”

我用标签而不是按钮解决了这个问题

// 
// 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();
}

注意,我现在使用的是两个状态按钮,而不是三个。这是有意的(我知道我仍然可以使用三个)。

创建鼠标输入事件,如下所示

private void forAllButtons_MouseEnter(object sender, EventArgs e)
{
    Button b = (Button)sender;
    b.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
}
然后将此事件分配给所有按钮


快乐编程:)

您也可以通过取消选择按钮属性>公用>IshitteVisible中的IshitteVisible选项来停止更改按钮的颜色
也许这也有帮助…

我有一个建议。创建您自己的button类派生表单button。然后在其中重写MouseEnter事件。只需删除调用基本实现的代码

base.OnMouseEnter(e)

PS:您将无法在派生类之外使用MouseEnter事件(例如,使用此控件的项目)

您好,您可以使用这两行代码轻松地将这些更改应用于按钮

  • 将按钮的FlatStyle设置为Flat

    this.btnClose.FlatStyle = FlatStyle.Flat;
    
  • 将按钮的MouseOverBackColor设置为透明

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

  • 希望这会有所帮助。感谢

    要解决此问题,请将MouseOverBackColor设置为透明,以删除灰色背景。

    感谢您提供的鼠标提示,它解决了我的背景色更改缓慢的问题!
    this.btnClose.FlatAppearance.MouseOverBackColor = Color.Transparent;