winform控件重载之SearchTextBox开发

1.前言

winform只提供给我们一些基本的控件功能,有时候项目设计上面要求的控件不能够得到满足。

我们会考虑采用第三方控件(例如DotnetBar等),或者自己重载这些基础控件,来获取自己想要的控件。

重载控件在VS项目上面通常有两类:

1.用户控件(有一个图版,让你组合控件)

2.自定义控件(无视图,用代码来创建)

两者都可以实现基础控件的二次开发,下面以一个SearchTextBox为例来进行控件的二次开发。

2.SearchTextBox开发

1.新建项目

新建一个类库项目

 

 

2.在项目中添加一个自定义控件

3.继承让自定义控件TextBox

 public partial class SearchTextBox : TextBox

4.定义一个SearchTextBox的图标属性SearchImage

        private Image _searchImage = Resources._22;

        [Category("外观"), Description("获取或者设置搜索图标,建议使用16*16的png图标")]
        public Image SearchImage
        {
            get { return _searchImage; }
            set { _searchImage = value; pic.Image = value; }
        }

5.在构造函数中添加一个PictureBox控件到TextBox中,定义PictureBox的其他属性和事件

        public delegate void OnSearchHander(object sender, SearchEventArgs e);

        [Category("鼠标"), Description("定义TextBox的搜索事件")]
        public event OnSearchHander OnSearch;
       
        private PictureBox pic = null;
     
        public SearchTextBox()
        {
            InitializeComponent();
            pic = new PictureBox();
            pic.Image = _searchImage;
            pic.Width = 16;
            pic.Height = 16;
            pic.SizeMode = PictureBoxSizeMode.Zoom;
            pic.MouseEnter += pic_MouseEnter;
            pic.MouseLeave += pic_MouseLeave;
            pic.Click += pic_Click;
            this.Controls.Add(pic);
        }

        void pic_MouseLeave(object sender, EventArgs e)
        {
            Cursor = Cursors.IBeam;
            pic.BackColor = Color.Transparent;
        }

        void pic_MouseEnter(object sender, EventArgs e)
        {
            pic.BackColor = _hoverColor;
            Cursor = Cursors.Hand;
        }

        void pic_Click(object sender, EventArgs e)
        {
            if (OnSearch != null)
            {
                OnSearch(sender, new SearchEventArgs(this.Text));
            }
        }

        private Color _hoverColor = Color.Gray;

        [Category("外观"), Description("获取或者设置搜索图标鼠标进入的颜色"), DefaultValue(typeof(Color), "gray")]
        public Color HoverColor
        {
            get { return _hoverColor; }
            set { _hoverColor = value; }
        }

 

6.当然为了直观的获取搜索事件的搜索内容,我们需要定义一个事件参数类SearchEventArgs

 public class SearchEventArgs : EventArgs
    {
        public SearchEventArgs(string text)
        {
            _searchText = text;
        }

        private string _searchText;

        public string SearchText
        {
            get { return _searchText; }
            set { _searchText = value; }
        }

    }

7.最后我们需要在TextBox控件拖动的时候重绘Picture,然后加上Enter搜索热键

        private const int WM_PAINT = 0xF;
        private const int Hot_Key = 0x0312;

        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk);

        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

        protected override void OnGotFocus(EventArgs e)
        {
            RegisterHotKey(Handle, 100, KeyModifiers.None, Keys.Enter);   
            base.OnGotFocus(e);
        }

        protected override void OnLostFocus(EventArgs e)
        {
            UnregisterHotKey(Handle, 100);
            base.OnLostFocus(e);
        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_PAINT)
            {
                pic.Location = new Point(this.Width - 20, 0);             
            }
            else if(m.Msg==Hot_Key)
            {
                if (m.WParam.ToInt32() == 100)
                {
                    //搜索
                    if (OnSearch != null)
                    {
                        OnSearch(this.pic, new SearchEventArgs(this.Text));
                    }
                }
            }

            base.WndProc(ref m);
        }
    [Flags()]
    public enum KeyModifiers
    {
        None = 0,
        Alt = 1,
        Ctrl = 2,
        Shift = 4,
        WindowsKey = 8
    }  

 

8.展示一下成果

 

3.总结

第一次写博客,仅供入门参考,大神们看了,笑笑就行了。

posted @ 2016-05-06 14:19  comicwang  阅读(799)  评论(0编辑  收藏  举报