2008-10-12 110 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設置爲透明,以便刪除灰色背景。