TextBox String/Text's Padding For Custom Control

前端 未结 2 744
隐瞒了意图╮
隐瞒了意图╮ 2021-01-14 13:16

I\'m a newbie, and recently I\'ve asked this question, where it taught me to have my best option for TextBox\'s bottom border, that prevents flickering/tearing - resulted by

相关标签:
2条回答
  • 2021-01-14 14:05

    I think you will have to inherit from UserControl rather than from TextBox and add a TextBox to your UserControl. Code below is by no means complete but should show you what I'm talking about

    public partial class TextBoxMaterial : UserControl
    {
        public TextBoxMaterial()
        {
            InitializeComponent();
    
            this.Controls.Add(new Label()
            {
                Height = 2,
                Dock = DockStyle.Bottom,
                BackColor = Color.Gray,
            });
    
            this.Controls.Add(new TextBox()
            {
                Left = 10,
                Width = this.Width - 20,
                BackColor = this.BackColor,
                BorderStyle = BorderStyle.None,
             });
        }
    }
    
    0 讨论(0)
  • 2021-01-14 14:23

    You can set left padding and right padding for text of TextBox by sending an EM_SETMARGINS. You also can set AutoSize property of the TextBox to false to be able to change the height of control. Here is the result:

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    using System.Drawing;
    public class ExTextBox : TextBox
    {
        [DllImport("user32.dll")]
        private static extern IntPtr SendMessage(IntPtr hwnd, int msg,
            int wParam, int lParam);
        private const int EM_SETMARGINS = 0xd3;
        private const int EC_RIGHTMARGIN = 2;
        private const int EC_LEFTMARGIN = 1;
        private int p = 10;
        public ExTextBox()
            : base()
        {
            var b = new Label { Dock = DockStyle.Bottom, Height = 2, BackColor = Color.Gray };
            var l = new Label { Dock = DockStyle.Left, Width = p, BackColor = Color.White };
            var r = new Label { Dock = DockStyle.Right, Width = p, BackColor = Color.White };
            AutoSize = false;
            Padding = new Padding(0);
            BorderStyle = System.Windows.Forms.BorderStyle.None;
            Controls.AddRange(new Control[] { l, r, b });
        }
        protected override void OnHandleCreated(EventArgs e)
        {
            base.OnHandleCreated(e);
            SetMargin();
        }
        private void SetMargin()
        {
            SendMessage(Handle, EM_SETMARGINS, EC_RIGHTMARGIN, p << 16);
            SendMessage(Handle, EM_SETMARGINS, EC_LEFTMARGIN, p);
        }
    }
    

    To know what the role of right label is, try not adding it to the control, then write a long text to TextBox and go to the end of text by arrow keys and again back to the beginning using arrow keys.

    0 讨论(0)
提交回复
热议问题