自定义TextBox

认知尚浅,如有错误,愿闻其详!

概述

  在开发中,有时候需要,需要些自定义性很高的控件,而且使用的频率很高,这时候我们自己就要去修改其外观、宽高等属性,需要重写一些需要重写的事件,以达到效果。
  今天在工作中遇到的界面,需要制作出一个类似处方笺的页面,传统的文本输入框是没办法直接使用的。而且使用的频率也很高,所以就想着自定义一个TextBox,满足项目需求。
平时中也可以用于账号输入或者是其他页面的输入,反正比传统的好看多了。

效果

自定义TextBox_第1张图片
自定义TextBox.gif

实现代码


        public CTextBox()
        {
            InitializeComponent();
            //步骤1、设置控件的基本属性。
            this.BorderStyle = BorderStyle.None;
            this.BackColor = Color.White;
            this.AutoSize = false;
            //为了让输入文本与底线有一定的距离,需要加上一定的高度值(文本是紧贴上方显示的),高度值允许用户于属性面板设置。
            this.Height = this.FontHeight + TextSpaceLine;
        }
        //步骤2、控件属性,允许用户通过属性窗口进行设置
        private int _TextSpaceLine = 6;
        [DefaultValue(typeof(string), "6")]
        [Description("文本与底部横线的间距")]
        public int TextSpaceLine
        {
            get { return _TextSpaceLine; }
            set
            {
                _TextSpaceLine = value;
            }
        }
        private string _TextHint = "";
        [DefaultValue(typeof(string), "")]
        [Description("输入框输入提示!")]
        public string TextHint
        {
            get { return _TextHint; }
            set
            {

                _TextHint = value;
                SetWatermark(TextHint);
            }
        }
        private Color _LineColor = Color.FromArgb(69, 139, 116);
        [DefaultValue(typeof(Color), "69,139,116")]
        [Description("底部横线颜色")]
        public Color LineColor
        {
            get { return _LineColor; }
            set { _LineColor = value; }
        }
        //步骤3、利用win32 api进行水印的加入,具体实现不太清楚
        private const uint ECM_FIRST = 0x1500;
        private const uint EM_SETCUEBANNER = ECM_FIRST + 1;

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
        static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);

        /// 
        /// 设置水印,相当于输入提示
        /// 
        /// 提示内容
        private void SetWatermark(string watermarkText)
        {
            SendMessage(this.Handle, EM_SETCUEBANNER, 0, watermarkText);
        }

        //步骤4、截获消息,在原来的下边框位置在画一条线
        private int WM_PAINT = 0x000F;
        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            Pen pen = new Pen(LineColor, 2f);
            using (Graphics g = this.CreateGraphics())
            {
                g.DrawLine(pen, new Point(0, this.Size.Height - 1), new Point(this.Size.Width, this.Size.Height - 1));
            }
        }
    }

步骤1中,对TextBox控件的基本属性进行了设置,关闭自动尺寸、修改高度等操作。
步骤2中,声明实现一些需要通过外接属性设置的值属性,如底线颜色、文本与底线的间距、提示内容等属性。
步骤3、4中,获取句柄,使用Windows API进行设置水印与利用Graphics绘制底线。水印具体实现可以看这:在 Visual C# 中,如何为 TextBox 控件添加水印文字 - 抢劫上帝

自定义TextBox_第2张图片
可设置属性.png

你可能感兴趣的:(自定义TextBox)