Winform 自定义文本框

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

    }
}

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

时间: 2024-10-29 10:48:15

Winform 自定义文本框的相关文章

axure自定义文本框样式

axure中的文本框是我们经常使用的元件,但它本身对样式的设置很有限,不能设置边框样式.阴影等,不能满足我们制作高保真原型的需求,本文给大家介绍一下结合矩形元件自定义文本框样式.(PS:此处的"高保真"指的是UI上的设计,对于原型保真程度的说明,请参考我的另一片文章<产品原型设计浅见>). 如果我们要制作下图这种圆角输入框,首先拖入一个文本框.一个矩形到设计区域,将矩形置于底层,调整矩形的大小能够刚刚包围住文本框,给矩形增加一点圆角,把矩形的颜色弄浅一点,我设置的色值是#9

wxpython 支持python语法高亮的自定义文本框控件的代码

在研发闲暇时间,把开发过程中比较重要的一些代码做个珍藏,下面的代码内容是关于wxpython 支持python语法高亮的自定义文本框控件的代码,应该是对大家也有用. import keywordimport wximport wx.stc as stcimport images #---------------------------------------------------------------------- demoText = """## This versio

JavaScript 自定义文本框光标——初级版

文本框(input或textarea)的光标无法修改样式(除了通过color修改光标颜色).但笔者希望个人创建自己的网站时,文本框的光标有属于自己的风格.所以,尝试模拟文本框的光标,设计有自己风格的光标.以下是笔者个人的想法. [************************基本思路***************************] 对于键盘操作来说,光标的基本操作不外乎最基本的三个键:左箭头(left arrow).右箭头(right arrow)和退格键(backspace). 左箭

winform中文本框的一些案例

项目中经常看到在输入金额时,会加逗号,最近在复习正则表达式,就联系下,界面如下: 首先,对上面的文本框输入值进行控制,只允许用户输入数字0-9,小数点和退格键,注册文本框的KeyPress事件,代码如下: 1 //输入值只能在数字0-9之间,允许输入小数点和退格键 2 if ((e.KeyChar < '0' || e.KeyChar > '9') && e.KeyChar != 8 && e.KeyChar != 46) 3 { 4 e.Handled = t

winform中文本框添加拖拽功能

对一个文本框添加拖拽功能: private void txtFolder_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { e.Effect = DragDropEffects.Link; this.txtFolder.Cursor = System.Windows.Forms.Cursors.Arrow;//指定鼠标形状 } else { e.Effect

自定义文本框占位颜色和runtime

请耐心看完这篇文章,你会发现惊喜.当我看到这个需求的时候,首先脑海里就有个思路,既然和系统给的不一样,那肯定就要自定义了,最开始我并不知道怎么改,所以我点进去,UITextField类里面,既然是占位颜色,所以我就搜索place,就发现了 这两个属性,想都不用想,肯定我们对第二个属性进行操作,在这里牵扯到了小逻辑的处理,就是要监听开始编辑和结束编辑的状态,用什么监听呢? 开发中监听事件用到三种:1.代理 2.通知 3.target 用代理?代理中有一个原则:永远不要自己成为自己的代理,我们在自定

C#-WinForm中文本框的中文乱码问题

上面这句话可以解决textbox中的中文乱码问题 来自为知笔记(Wiz) 附件列表 QQ图片20151218124007.png

WinForm笔记一:文本框只允许输入数字

在WinForm的文本框中,有时候只允许数字,而不能输入除数字以外的其他字符,要调用TextBox的KeyPress事件,代码如下: //只允许输入数字 if (e.KeyChar<'0'||e.KeyChar>'9') { e.Handled = true; } //允许输入退格键 if (e.KeyChar == 8) { e.Handled = false; } TextBox tBox = sender as TextBox;        //哪个文本框调用,tBox 就是哪个文本框

c#快速清除所有文本框中内容

c#快速清除所有文本框中内容 如何清除Form中所有的文本框内容?分两种情况:(1)当所有的文本框都是顶级控件,即它们都直接位于this.Controls(或groupBox.Controls)中,此时遍历一遍清除即可.(2)当文本框不全处于顶级,即部分包含在某些容器控件内,如groupBox中,由于控件在窗体中是严格分级摆放的.此时的文本框有的位于this.Controls中(即Form控件集中),有的则位于groupBox.Controls中. 对于(1),直接这样写就可: //或为grou