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.总结
第一次写博客,仅供入门参考,大神们看了,笑笑就行了。