2008-10-12 109 views
8

我试图做一个自定义按钮到我的窗体(其中有FormBorderStyle =无)使用Visual Studio 2005.我有我的3个状态按钮图像链接到按钮的ImageList。C#中的自定义按钮:如何删除悬停背景?

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"; 
} 

所有的工作,但有一个赶上。每当我将鼠标悬停在按钮上时,我都会感到非常恼人的灰色背景。

我该如何删除?

回答

11

灰色的背景是由于“System.Windows.Forms.FlatStyle.Flat”的设置,这是默认行为,因为它需要悬停时突出显示按钮。要消除这种情况,您可能需要编写自定义按钮类,从原始按钮继承并执行一些自定义绘画来实现该功能。

顺便说一句,不是在MouseHover中设置“enabled”,你应该在MouseEnter中执行它。 MouseEnter和MouseLeave是一对指示鼠标是否在按钮内,并且每个入口/出口触发一次。 MouseHover在鼠标在按钮内移动时触发,这会创建“已启用”的非连续重复设置。

+1

感谢您使用MouseEnter技巧,解决了我的BackColor-change-slowness问题! – TechNyquist 2015-10-22 09:47:55

2

我已经解决了这个使用标签而不是按钮。

// 
// 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:注意我现在使用的是两个状态按钮,而不是三个。它的目的是(我知道我仍然可以使用三个)。

39
btnClose.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; 
2

create Mouse输入下面给出的事件。

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

然后将此事件分配给所有按钮。

快乐编程:)

0

您也可以停止取消选择按钮属性>通用> IsHitTestVisible 或许这也可以帮助IsHitTestVisible选项改变按钮的颜色...

2

我有一个建议。创建你自己的按钮类派生表单Button.Then重写MouseEnter事件。只需删除调用基本实现的代码。

base.OnMouseEnter(e) 

PS:您将无法使用MouseEnter事件派生类的外部(例如,使用这个控制项目)

1

嗨,你根本就这些更改应用到您的按钮轻松地使用这两种代码行。

  1. 设置按钮的的FlatStyle到扁平

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

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

希望这会有所帮助。谢谢

-1

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