none
C#UserControl 定义一个根据鼠标动作有多种状态的按钮控件 RRS feed

  • 问题

  • 需求是定义一个当鼠标按下,移动,离开、不使能、使能时均显示不同图片效果的button控件,我想定义几个属性均为Image类型,标识鼠标按下,移动,离开,不使能,默认的图片,代码如下,为什么一加载程序就飞了呢?
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Text;
    using System.Windows.Forms;

    namespace Multi_StatusControl
    {
        public partial class Multi_StatusButton : Button
        {
            public Image img_MouseMove
            {
                get
                {
                    return img_MouseMove;
                }
                set
                {
                    img_MouseMove = value;
                }
            }
            public Image img_MouseDown
            {
                get
                {
                    return img_MouseDown;
                }
                set
                {
                    img_MouseDown = value;
                }
            }
            public Image img_Default
            {
                get
                {
                    return img_Default;
                }
                set
                {
                    img_Default = value;
                }
            }
            public Image img_UnEnable
            {
                get
                {
                    return img_UnEnable;
                }
                set
                {
                    img_UnEnable = value;
                }
            }

            public Multi_StatusButton()
            {
                InitializeComponent();
                this.BackgroundImage = img_Default;
                this.MouseMove += new MouseEventHandler(Multi_StatusButton_MouseMove);
                this.MouseDown += new MouseEventHandler(Multi_StatusButton_MouseDown);
                this.MouseLeave += new EventHandler(Multi_StatusButton_MouseLeave);
                this.EnabledChanged += new EventHandler(Multi_StatusButton_EnabledChanged);
            }

            void Multi_StatusButton_EnabledChanged(object sender, EventArgs e)
            {
                //throw new Exception("The method or operation is not implemented.");
                if (this.Enabled == true)
                {
                    this.BackgroundImage = img_Default;
                }
                else
                {
                    this.BackgroundImage = img_UnEnable;
                }
            }

            void Multi_StatusButton_MouseLeave(object sender, EventArgs e)
            {
                //throw new Exception("The method or operation is not implemented.");
                if (this.Enabled == true)
                {
                    this.BackgroundImage = img_Default;
                }
            }

            void Multi_StatusButton_MouseDown(object sender, MouseEventArgs e)
            {
                //throw new Exception("The method or operation is not implemented.");
                if (this.Enabled == true)
                {
                    this.BackgroundImage = img_MouseDown;
                }
            }

            void Multi_StatusButton_MouseMove(object sender, MouseEventArgs e)
            {
                //throw new Exception("The method or operation is not implemented.");
                if (this.Enabled == true)
                {
                    this.BackgroundImage = img_MouseMove;
                }
            }


        }
    }


    guiwenyang
    2009年12月11日 13:25

答案

  • 不客气啊!
    另外,记得把你认为正确的回复“标记为答复”,这样可以让遇到同样问题的同行搜索到这个回复,来帮助更多的人啊!
    周雪峰
    • 已标记为答案 guiwenyang 2009年12月15日 7:37
    2009年12月14日 4:35
    版主

全部回复

  • 你好!
         属性和后台字段不要用一样的名字,比如不要都使用img_MouseMove:
             public Image img_MouseMove
            {
                get
                {
                    return img_MouseMove;
                }
                set
                {
                    img_MouseMove = value;
                }
            }
          同时保证img_MouseMove正确的初始化
          另外,请问你描述的“一加载程序就飞了”是什么意思?
    周雪峰
    2009年12月11日 14:51
    版主
  • 请问后台字段是什么意思?我做了一个测试程序Test,在Test的引用中添加了此usercontrol的引用,在工具箱中添加此usercontrol的选择项,然后我在Test的Form类上像添加label那样添加一个usercontrol控件,一添加Test程序就没了!
    guiwenyang
    2009年12月13日 12:18
  • 怎么保证属性被正确的初始化呢?
    guiwenyang
    2009年12月13日 12:19
  • 你好!
           private Image img_MouseMove=new Bitmap(@"C:\xxx.jpg");  //这个就是后台字段,你给他一个初始化值,这里指定C:\xxx.jpg图片,你在这个目录下放个图片!
            public Image Img_MouseMove
            {
                get
                {
                    return img_MouseMove;
                }
                set
                {
                    img_MouseMove = value;
                }
            }

            请问“一添加Test程序就没了”是什么意思啊!程序出错,抛出异常,还是怎样?

    周雪峰
    2009年12月13日 12:45
    版主
  • 哦,好的,问题我已经解决了,谢谢!这真是个很好的论坛


    guiwenyang
    2009年12月14日 2:44
  • 不客气啊!
    另外,记得把你认为正确的回复“标记为答复”,这样可以让遇到同样问题的同行搜索到这个回复,来帮助更多的人啊!
    周雪峰
    • 已标记为答案 guiwenyang 2009年12月15日 7:37
    2009年12月14日 4:35
    版主