Winform 自定义文本框

2021-04-04 04:25

阅读:718

标签:class   extern   width   tle   awl   winform   rest   box   run   

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TomWinform.CustomerControl
{
    public partial class BorderTextBox : TextBox
    {
        //设置Rect消息
        private const int EM_SETRECT = 179;
        //获取Rect消息
        private const int EM_GETRECT = 178;
        //粘贴消息
        private const int WM_PASTE = 0x0302;

        private Color borderColor = Color.Black;
        private float leftBorderSize = 1;
        private float rightBorderSize = 1;
        private float topBorderSize = 1;
        private float bottomBorderSize = 1;
        private Padding textPadding = new Padding(1);
        private bool allowReturn = false;

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        static extern IntPtr GetWindowDC(IntPtr hWnd);
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
        [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SendMessageA")]
        private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, string lParam);
        [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SendMessageA")]
        private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, ref Rectangle lParam);

        public BorderTextBox()
        {
            InitializeComponent();
        }

        //画边框
        private void DrawBorder(IntPtr hDC)
        {
            Graphics g = Graphics.FromHdc(hDC);

            #region 左边框
            if (leftBorderSize > 0)
            {
                Pen penLeft = new Pen(borderColor, leftBorderSize);
                Point[] pointLeft = new Point[2];
                pointLeft[0] = new Point(0, 0);
                pointLeft[1] = new Point(0, this.Width - 1);
                g.DrawLine(penLeft, pointLeft[0], pointLeft[1]);
            }
            #endregion

            #region 右边框
            if (rightBorderSize > 0)
            {
                Pen penRight = new Pen(borderColor, rightBorderSize);
                Point[] pointRight = new Point[2];
                pointRight[0] = new Point(this.Width - 1, 0);
                pointRight[1] = new Point(this.Width - 1, this.Height - 1);
                g.DrawLine(penRight, pointRight[0], pointRight[1]);
            }
            #endregion

            #region 上边框
            if (topBorderSize > 0)
            {
                Pen penTop = new Pen(borderColor, topBorderSize);
                Point[] pointTop = new Point[2];
                pointTop[0] = new Point(0, 0);
                pointTop[1] = new Point(this.Width - 1, 0);
                g.DrawLine(penTop, pointTop[0], pointTop[1]);
            }
            #endregion

            #region 下边框
            if (bottomBorderSize > 0)
            {
                Pen penBottom = new Pen(borderColor, bottomBorderSize);
                Point[] pointBottom = new Point[2];
                pointBottom[0] = new Point(0, this.Height - 1);
                pointBottom[1] = new Point(this.Width - 1, this.Height - 1);
                g.DrawLine(penBottom, pointBottom[0], pointBottom[1]);
            }
            #endregion
        }

        public void SetTextDispLayout()
        {
            if (Text == "")
                return;
            //当允许多行和禁止会车时,Paddin有效
            if (this.Multiline && (!this.WordWrap))
            {
                Rectangle rect = new Rectangle();
                SendMessage(this.Handle, EM_GETRECT, (IntPtr)0, ref rect);
                //SizeF size = CreateGraphics().MeasureString(Text, Font);
                //rect.Y = (int)(Height - size.Height) / 2 + TextPadding.Top;
                rect.Y = textPadding.Top;
                rect.X = textPadding.Left;
                rect.Height = Height;
                rect.Width = Width - textPadding.Right - textPadding.Left;
                SendMessage(this.Handle, EM_SETRECT, IntPtr.Zero, ref rect);
            }
        }


        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);
        }

        protected override void WndProc(ref Message m)
        {
            //string str = "";
            //bool flag = false;
            //int i = 0;
            //if (m.Msg == 0x0204)
            //    i++;
            //if (!AllowReturn
            //    && m.Msg == WM_PASTE
            //    && System.Windows.Forms.Clipboard.ContainsText())
            //{
            //    str = System.Windows.Forms.Clipboard.GetText();
            //    System.Windows.Forms.Clipboard.Clear();
            //    string nstr = str.Replace(char.ConvertFromUtf32((int)Keys.Return), "").Replace(char.ConvertFromUtf32((int)Keys.LineFeed), "");
            //    System.Windows.Forms.Clipboard.SetText(nstr);
            //    if (str.Length > 0) flag = true;
            //}

            base.WndProc(ref m);
            if (m.Msg == 0xf || m.Msg == 0x133)
            {
                IntPtr hDC = GetWindowDC(m.HWnd);
                if (hDC.ToInt32() == 0)
                    return;

                DrawBorder(hDC);

                //返回结果
                m.Result = IntPtr.Zero;
                //释放
                ReleaseDC(m.HWnd, hDC);
            }

            //if (flag)
            //{
            //    flag = false;
            //    System.Windows.Forms.Clipboard.SetText(str);
            //    str = "";
            //}
        }

        #region 属性
        [Description("边框颜色"), Category("自定义属性")]
        public Color BorderColor
        {
            get { return borderColor; }
            set { borderColor = value; this.Invalidate(); }
        }
        [Description("左边框宽度"), Category("自定义属性")]
        public float LeftBorderSize
        {
            get { return leftBorderSize; }
            set { leftBorderSize = value; this.Invalidate(); }
        }
        [Description("右边框宽度"), Category("自定义属性")]
        public float RightBorderSize
        {
            get { return rightBorderSize; }
            set { rightBorderSize = value;  this.Invalidate(); }
        }
        [Description("上边框宽度"), Category("自定义属性")]
        public float TopBorderSize
        {
            get { return topBorderSize; }
            set { topBorderSize = value; this.Invalidate(); }
        }
        [Description("下边框宽度"), Category("自定义属性")]
        public float BottomBorderSize
        {
            get { return bottomBorderSize; }
            set { bottomBorderSize = value;  this.Invalidate(); }
        }
        [/*DisplayName("內邊距")*/Description("文本内边距,当允许多行和禁止回车时有效"), Category("自定义属性")]
        public Padding TextPadding
        {
            get { return textPadding; }
            set { textPadding = value; SetTextDispLayout(); }
        }
        [/*DisplayName("允許回車")*/Description("是否允许回车"), Category("自定义属性")]
        public bool AllowReturn
        {
            get { return allowReturn; }
            set { allowReturn = value;this.Invalidate(); }
        }
        #endregion

        #region 事件
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            //如果不允许回车 屏蔽回车 换行键值
            if (!AllowReturn
                && ((int)e.KeyChar == (int)Keys.Return || (int)e.KeyChar == (int)Keys.LineFeed))
            {
                e.Handled = true;
            }
            base.OnKeyPress(e);
        }
        protected override void OnTextChanged(EventArgs e)
        {
            base.OnTextChanged(e);

            SetTextDispLayout();
        }
        #endregion



    }
}

 

Winform 自定义文本框

标签:class   extern   width   tle   awl   winform   rest   box   run   

原文地址:https://www.cnblogs.com/belx/p/9190340.html


评论


亲,登录后才可以留言!