아래와 같이 이미지 및 문자 색상을 나타낼 수 있는 버튼을 만드는 코드입니다.
마우스 이동 시 이벤트가 자동으로 발생되어 지정한 이미지가 나타나도록 가능합니다. (텍스트 등 필요한 기능은 직접 추가!)
![]() |
![]() |
![]() |
![]() |
프로젝트에 Button을 상속받은 아래의 클래스를 생성 후 "프로젝트 빌드" 를 해주어야 사용 가능해집니다.
그리고 Image_Disable, Image_Disable_Color ... 에 대해 이미지 및 텍스트 색상 지정을 해주면 끝!

using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public class MyButton : Button
{
public Image Image_Normal //초기 이미지
{
get
{
return image_Normal;
}
set
{
image_Normal = value;
this.BackgroundImage = value; //디자이너에서 초기 이미지 변경 시 수정되도록 추가.
}
}
private Image image_Normal;
public Image Image_Hover { get; set; } //마우스 포커싱 이미지
public Image Image_Press { get; set; } //마우스 누를시 이미지
public Image Image_Disable { get; set; } //비활성화 이미지
public Color Image_Normal_Color { get; set; } = Color.Black; //이미지 초기 글자색
public Color Image_Hover_Color { get; set; } = Color.Black; //이미지 포커싱 글자색
public Color Image_Press_Color { get; set; } = Color.White; //마우스 누를 시 글자색
public Color Image_Disable_Color { get; set; } = Color.Black; //비활성화 글자색
private bool isMouseDown;
public CustomButton()
{
this.FlatStyle = FlatStyle.Flat;
this.FlatAppearance.BorderSize = 0;
this.FlatAppearance.MouseOverBackColor = Color.Transparent; //배경 투명
this.FlatAppearance.MouseDownBackColor = Color.Transparent; //배경 투명
this.FlatAppearance.CheckedBackColor = Color.Transparent; //배경 투명
this.BackColor = Color.Transparent; //배경 투명
this.BackgroundImageLayout = ImageLayout.Zoom; //이미지 보여주는 형태
TabStop = false; //키보드 이동하여 테두리 그리기 방지
SetStyle(ControlStyles.Selectable, false); //선택 테두리 방지
}
private void SetNormal()
{
this.BackgroundImage = Image_Normal;
this.ForeColor = Image_Normal_Color;
}
private void SetHover()
{
this.BackgroundImage = Image_Hover;
this.ForeColor = Image_Hover_Color;
}
private void SetPress()
{
this.BackgroundImage = Image_Press;
this.ForeColor = Image_Press_Color;
}
private void SetDisable()
{
this.BackgroundImage = Image_Disable;
this.ForeColor = Image_Disable_Color;
}
protected override void OnEnabledChanged(EventArgs e) //Enable에 따라 변경.
{
base.OnEnabledChanged(e);
isMouseDown = false;
if (!Enabled)
{
SetDisable();
return;
}
SetHoverOrNormal(this.PointToClient(Cursor.Position)); //활성화 상태 복구
}
private void SetHoverOrNormal(Point point) //비활성화 혹은 포커싱 잃은 후 복구
{
if (ClientRectangle.Contains(point)) //Enable 시 마우스 위치 확인
{
SetHover();
}
else
{
SetNormal();
}
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (isMouseDown)
{
return;
}
SetHover();
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
SetNormal();
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if (e.Button != MouseButtons.Left) //왼쪽 버튼이 아니면 무시
{
return;
}
isMouseDown = true;
SetPress();
}
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
if (e.Button != MouseButtons.Left) //왼쪽 버튼이 아니면 무시
{
return;
}
isMouseDown = false;
SetHoverOrNormal(e.Location); //마우스 위치에 따라 상태 변경
}
}
}'C# > Windows Form' 카테고리의 다른 글
| [C# Windows Form] PrivateFontCollection 외부 폰트 파일 적용 (1) | 2025.11.28 |
|---|---|
| [C# Windows Form] FormBorderStyle None 에 대한 기본 클래스 (0) | 2025.11.28 |
| [C# Windows Form] 섬네일 만들기 (ListView, ListBox) (0) | 2025.11.17 |
| [C# Windows Form] ZipFile 다루기 - 압축 및 해제 (0) | 2025.10.06 |
| [C# Windows Form] 비동기 Custom Form 종료, 파일 열기, 프린트 등 창 닫기 (BlockingCollection - queue) (0) | 2025.09.08 |



