winform自定义控件 (转帖)

定义控件

 

本文以按钮为例,制作一个imagebutton,继承系统button

 

分四种状态

1,正常状态

2,获得焦点

3,按下按钮

4,禁用

 

当然你得准备一张图片,包含四种状态的样式,同样你也可以准备四张图片,这取决于你如何draw按钮

 

我们定义一个构造函数

 

        private enum btnState

        {

            Button_UP = 0,//正常状态

            Button_Focus = 1,//获得焦点

            Button_Down = 2,//按下按钮

            Button_Disabled = 3,//禁用按钮

        }

 

然后设置控件“状态”属性

 

        private btnState imgState=0;

        //设置属性

        public btnState ButtonState

        {

            get

            {

                return imgState;

            }

            set 

            {

                if (imgState != value)

                { 

                    imgState = value; Refresh(); 

                }

            }

        }

 

 

然后判断按钮是否被禁用,同样写一个属性

 

        private bool _buttonEnabled = true;

        public bool BtnEnabled

        {

            get 

            {

                return _buttonEnabled;

            }

            set

            {

                if (value == false)

                {

                    _buttonEnabled = false;

                    imgState = btnState.Button_Disabled;

                    //删除按钮所有事件

                    disBindEvent();

 

                }

                else

                {

                    _buttonEnabled = true;

                    imgState = btnState.Button_UP;

                    //绑定按钮所有事件

                    bindEvent();

                }

            }

        

        }

 

好,到这里,我们继续上面设置属性中的事情,开始写按钮时间的绑定和删除

先列举一下,按钮有哪些事件:

从我们定义的按钮状态着手:

 

 

            Button_UP = 0,//正常状态--------------->mouseleaver,lostfocus

            Button_Focus = 1,//获得焦点------------>mousehover,mouseup

            Button_Down = 2,//按下按钮------------->mousedown

            Button_Disabled = 3,//禁用按钮--------->enable

 

 

        private void bindEvent()

        {

            MouseLeave += new EventHandler(imgButton_MouseLeave );

            LostFocus += new EventHandler(imgButton_LostFocus );

            MouseHover += new EventHandler(imgButton_MouseHover );

            MouseUp += new MouseEventHandler(imgButton_MouseUP);

            MouseDown += new MouseEventHandler(imgButton_MouseDown);

            EnabledChanged += new EventHandler(imgButton_EnAbleChanged);

 

        }

 

        private void disBindEvent()

        {

            MouseLeave -= new EventHandler(imgButton_MouseLeave);

            LostFocus -= new EventHandler(imgButton_LostFocus);

            MouseHover -= new EventHandler(imgButton_MouseHover);

            MouseUp -= new MouseEventHandler(imgButton_MouseUP);

            MouseDown -= new MouseEventHandler(imgButton_MouseDown);

            EnabledChanged -= new EventHandler(imgButton_EnAbleChanged);

        }

 

 

然后接着写上面用到的事件

 

       //鼠标事件

        private void imgButton_MouseLeave(object sender, EventArgs e)

        {

            ButtonState = btnState.Button_UP;

            Invalidate();

        }

 

        private void imgButton_LostFocus(object sender, EventArgs e)

        {

            ButtonState = btnState.Button_UP;

            Invalidate();

        }

 

        private void imgButton_MouseHover(object sender,MouseEventArgs  e)

        {

            ButtonState = btnState.Button_Focus;

            Invalidate();

        }

 

        private void imgButton_MouseUP(object sender, MouseEventArgs  e)

        {

            ButtonState = btnState.Button_Focus;

            Invalidate();

        }

 

        private void imgButton_MouseDown(object sender, EventArgs e)

        {

            ButtonState = btnState.Button_Down;

            Invalidate();

        }

 

        private void imgButton_EnAbleChanged(object sender, EventArgs e)

        {

            if (Enabled)

            {

                ButtonState = btnState.Button_UP;

                Invalidate();

            }

            else

            {

                ButtonState = btnState.Button_Disabled;

                Invalidate();

            }

        }

 

 

到这里,按钮一些事件就写完了,下面开始制作按钮的外观,进行按钮描绘

 

        //绘制按钮外观

        private void imgButtonPaint(object sender,PaintEventArgs e)

        {

            Graphics gr=e .Graphics ;

            int indexWidth = Size.Width * (int)imgState ;

            if (Image == null) return;

            if (Image.Width > indexWidth)

            {

                gr.DrawImage(Image, 0, 0, new Rectangle(new Point(indexWidth, 0), Size), GraphicsUnit.Pixel);

            }

            else

            {

                gr.DrawImage(Image, 0, 0, new Rectangle(new Point(0, 0), Size), GraphicsUnit.Pixel);

            }

        

        }

 

到这里,基本一个imagebutton就制作完了,有兴趣可以试一试,抛砖引玉,这个方法也是刚学过来的

http://www.cnblogs.com/njnudt/archive/2007/08/16/857719.html

 

posted on 2015-01-08 08:58  xihong  阅读(219)  评论(0编辑  收藏  举报

导航