2008-10-12 52 views
8

Tôi đang cố gắng thực hiện một nút tùy chỉnh cho biểu mẫu của tôi (có FormBorderStyle = none) bằng Visual Studio 2005. Tôi có 3 hình ảnh nút trạng thái của tôi trong một ImageList được liên kết với nút.Nút tùy chỉnh trong C#: Cách xóa nền di chuột?

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

Tất cả đều đang hoạt động nhưng có một điểm bắt. Bất cứ khi nào tôi di chuyển chuột di chuột vào nút Tôi nhận được một nền màu xám thực sự gây phiền nhiễu.

Tôi làm cách nào để xóa nội dung đó?

Trả lời

11

Nền màu xám là do cài đặt "System.Windows.Forms.FlatStyle.Flat", đó là hành vi mặc định, vì nó cần phải đánh dấu nút khi bạn di chuột. Để loại bỏ điều đó, bạn có thể phải viết một lớp nút tùy chỉnh, kế thừa từ nút gốc và làm một số bức tranh tùy chỉnh để đạt được điều đó.

Btw, thay vì đặt "đã bật" trong MouseHover, bạn nên làm điều đó trong MouseEnter. MouseEnter và MouseLeave là một cặp cho biết con chuột có nằm trong nút hay không và nó được kích hoạt một lần cho mỗi lần vào/ra. Khi MouseHover kích hoạt bất cứ khi nào con chuột di chuyển trong nút, điều này tạo ra thiết lập lặp đi lặp lại unnessecery "đã bật".

+1

Cảm ơn bạn đã sử dụng mẹo MouseEnter, đã giải quyết được vấn đề về sự thay đổi BackColor-chậm chạp của tôi! – TechNyquist

2

Tôi đã giải quyết vấn đề này bằng cách sử dụng nhãn thay vì nút.

// 
// 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: lưu ý rằng hiện tôi đang sử dụng hai nút trạng thái thay vì ba. Nó được dự định (tôi biết rằng tôi vẫn có thể sử dụng ba).

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

tạo Chuột Nhập sự kiện được đưa ra bên dưới.

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

sau đó gán sự kiện này cho tất cả các nút.

Chúc mừng chương trình :)

0

Bạn cũng có thể ngăn chặn việc thay đổi màu nút bằng cách bỏ chọn tùy chọn IsHitTestVisible trong Properties Button> chung> IsHitTestVisible Có lẽ đây cũng có thể giúp ...

2

Tôi đã nhận được một đề nghị. Tạo nút Button của riêng bạn để tạo biểu mẫu Button. Sau đó ghi đè lên sự kiện MouseEnter trong đó.Chỉ cần xóa mã để gọi cơ sở implementaion.

base.OnMouseEnter(e) 

PS: Bạn sẽ không thể sử dụng các sự kiện MouseEnter bên ngoài lớp được thừa kế (ví dụ một dự án sử dụng điều khiển này)

1

Hi bạn chỉ có thể áp dụng những thay đổi này để nút của bạn dễ dàng sử dụng hai dòng mã.

  1. Đặt FlatStyle của nút để Flat

    this.btnClose.FlatStyle = FlatStyle.Flat; 
    
  2. Đặt MouseOverBackColor của nút để Transparent

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

Hy vọng điều này sẽ giúp.Cảm ơn

-1

Để khắc phục sự cố, Đặt MouseOverBackColor thành thứ tự trong suốt để xóa backgroud xám.

Các vấn đề liên quan