아래와 같이 이미지 및 문자 색상을 나타낼 수 있는 버튼을 만드는 코드입니다.

마우스 이동 시 이벤트가 자동으로 발생되어 지정한 이미지가 나타나도록 가능합니다. (텍스트 등 필요한 기능은 직접 추가!)


 

프로젝트에 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); //마우스 위치에 따라 상태 변경
        }
    }
}

+ Recent posts