C# 文本框字符串/文本';自定义控件的填充

C# 文本框字符串/文本';自定义控件的填充,c#,winforms,user-interface,padding,margins,C#,Winforms,User Interface,Padding,Margins,我是一个新手,最近我问了这个问题,它教会了我对文本框底部边框的最佳选择,它可以防止由绘制的图形导致的闪烁/撕裂 现在我的问题是如何在文本框中为文本/字符串添加边距/填充,下面是代码: using System.Drawing; using System.Windows.Forms; namespace main.Classes.CustomControls { class TextBoxMaterial : TextBox { public TextBoxMateri

我是一个新手,最近我问了这个问题,它教会了我对文本框底部边框的最佳选择,它可以防止由绘制的图形导致的闪烁/撕裂

现在我的问题是如何在文本框中为文本/字符串添加边距/填充,下面是代码:

using System.Drawing;
using System.Windows.Forms;

namespace main.Classes.CustomControls {

    class TextBoxMaterial : TextBox {
        public TextBoxMaterial() {
            this.BorderStyle = System.Windows.Forms.BorderStyle.None;
            this.Controls.Add(new Label() {
                Height = 2,
                Dock = DockStyle.Bottom,
                BackColor = Color.Gray,
            });
        }
    }
}
当前文本框:

我需要的是:
我认为您必须从
UserControl
继承,而不是从
TextBox
继承,并在
UserControl
中添加一个文本框。下面的代码绝对不完整,但应该告诉您我在说什么

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,
         });
    }
}

您可以通过发送一条消息为
TextBox
的文本设置左填充和右填充。您还可以将
TextBox
AutoSize
属性设置为false,以更改控件的高度。 结果如下:

使用系统;
使用System.Runtime.InteropServices;
使用System.Windows.Forms;
使用系统图;
公共类extbox:TextBox
{
[DllImport(“user32.dll”)]
专用静态外部IntPtr SendMessage(IntPtr hwnd、int msg、,
int wParam、int lParam);
私有常量int EM_SETMARGINS=0xd3;
private const int EC_RIGHTMARGIN=2;
private const int EC_LEFTMARGIN=1;
私人INTP=10;
公共extbox()
:base()
{
VARB=新标签{Dock=DockStyle.Bottom,Height=2,BackColor=Color.Gray};
var l=新标签{Dock=DockStyle.Left,Width=p,BackColor=Color.White};
var r=新标签{Dock=DockStyle.Right,Width=p,BackColor=Color.White};
AutoSize=false;
填充=新填充(0);
BorderStyle=System.Windows.Forms.BorderStyle.None;
AddRange(新控件[]{l,r,b});
}
已创建受保护的重写无效OnHandleCreated(EventArgs e)
{
碱基。根据HandleCreated(e);
SetMargin();
}
私人保证金
{

发送消息(Handle、EM_SETMARGINS、EC_RIGHTMARGIN、p考虑到这是我最后的选择,我也在考虑同样的事情,但仍然希望我能有一个带有文本填充的文本框。在我之前的问题上,一个用户对此进行了评论,告诉我可以在文本上创建填充。我没有仔细观察,但我知道Win中的填充文本和类似内容表单总是有问题的,因为用户会做一些很难猜测的奇怪的事情。@Yawz是的,这是可能的。我给你贴了一个答案:)我正要问一个新问题,但如果我问了,它将是重复的,因为这个问题已经在这里得到了回答[我喜欢你的答案,但在我的代码中使用这个答案作为文本填充会给我:…如果允许它为此提出新问题,我会的,但它可能被标记为重复,请帮助!谢谢。你可以更改要绘制文本的矩形。
var rect=this.ClientRectangle;rect.Inflate(-p,0);
它创建一个缩小宽度的矩形。例如
(0,0100,20)
将更改为
10,0,80,20
。然后将其用于绘制字符串:
TextRenderer.DrawText(g,this.Hint,this.Font,rect,SystemColors.GrayText,this.BackColor,TextFormatFlags.Top | TextFormatFlags.Left | TextFormatFlags.noadding);
如果您在应用代码时遇到任何问题,请告诉我:)要了解右标签的作用,请尝试不将其添加到控件中,然后在文本框中写入一个长文本,通过箭头键转到文本的末尾,再使用箭头键返回到开头。
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);
    }
}