2008-10-12 7 views
8

Visual Studio 2005를 사용하여 양식 (FormBorderStyle = none)에 사용자 지정 단추를 쓰려고합니다. 단추에 연결된 ImageList에 3 가지 상태 단추 이미지가 있습니다.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"으로 설정되어 있기 때문에 마우스를 놓을 때 단추를 강조 표시해야하므로 기본 동작입니다. 이를 제거하려면 사용자 정의 버튼 클래스를 작성하고 원래 버튼을 상속 받아이를 구현하기 위해 사용자 정의 페인팅을 수행해야 할 수 있습니다.

Btw, MouseHover에서 "enabled"를 설정하는 대신 MouseEnter에서 수행해야합니다. MouseEnter 및 MouseLeave는 마우스가 버튼 내에 있는지 여부를 나타내는 쌍이며 항목/이탈 당 한 번 발생합니다. MouseHover는 단추 안에서 마우스가 움직일 때마다 실행됩니다.이 단추는 반복적으로 "사용 가능"으로 설정된 설정을 만듭니다.

+1

MouseEnter 팁을 제공해 주셔서 감사합니다. 저의 BackColor 변경 슬로우 문제를 해결했습니다! – TechNyquist

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

추 신 : 3 개 대신 2 개의 상태 버튼을 사용하고 있습니다. 그것은 의도 된 것입니다 (저는 여전히 3을 사용할 수 있음을 압니다).

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

create 마우스 아래에 주어진 이벤트를 입력하십시오.

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

이 이벤트를 모든 버튼에 할당하십시오.

행복한 프로그래밍 :

0

또한 어쩌면이 또한 도움이 될 수 있습니다 IsHitTestVisible 일반 버튼 속성>>의 IsHitTestVisible 옵션을 선택 취소하여 버튼의 색상을 변경 중지 할 수는 ...

2

나는 하나 개의 제안을 가지고있다. Button 클래스를 파생시키는 자신 만의 버튼 클래스를 만듭니다. 그 후, MouseEnter 이벤트를 오버라이드 (override)합니다. 기본 구현을 호출하기위한 코드를 삭제합니다.

base.OnMouseEnter(e) 

PS : 당신은 파생 클래스 외부 MouseEnter 이벤트를 발생 사용할 수 없습니다 (예를 들어,이 컨트롤을 사용하여 프로젝트)

1

안녕하세요 당신이 단순히 버튼을 쉽게이 두 가지를 사용하여 이러한 변경 사항을 적용 할 수 있습니다 코드 줄.

  1. 이 도움이 될

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

투명 희망에 플랫

버튼의 MouseOverBackColor을 설정
this.btnClose.FlatStyle = FlatStyle.Flat; 
  • 에있는 버튼의 FlatStyle을 설정합니다.감사합니다

  • -1

    문제를 해결하려면 MouseOverBackColor를 투명 inorder로 설정하여 회색 배경을 제거하십시오.

    관련 문제