3

可能重复:
WinForms 中的水印文本框

我目前正在编写 C# 应用程序的设置对话框。输入字段应如下所示:

输入字段为空输入字段填写

实现这一点的最佳方法是什么?我想过创建一个背景图像,但我想知道是否有更好的方法来做到这一点(动态的)......

4

4 回答 4

3

使用设置为白色的面板作为BackColor.
在面板控件中,在左侧插入一个TextBox设置BorderStyleNone
在面板控件中,在右侧插入一个LabelBackColor 设置为Transparent并设置Text为“Firstname”。

在此处输入图像描述

于 2012-07-22T17:33:46.787 回答
1

只需创建一个新的文本框类

 public class MyTextBox : TextBox
    {

        public MyTextBox()
        {
            SetStyle(ControlStyles.UserPaint, true);
        }

     protected override void OnTextChanged(EventArgs e)
    {
        base.OnTextChanged(e);
        this.Invalidate();
    }

        protected override void OnPaint(PaintEventArgs e)
        {

 e.Graphics.DrawString(this.Text, this.Font, new SolidBrush(Color.Black), new System.Drawing.RectangleF(0, 0, this.Width , this.Height ), System.Drawing.StringFormat.GenericDefault);


            e.Graphics.DrawString("Lloyd", this.Font, new SolidBrush(Color.Red), new System.Drawing.RectangleF(0, 0, 100, 100), System.Drawing.StringFormat.GenericTypographic);
            base.OnPaint(e);
        }
    }

对 Draw String 参数进行适当的更改

于 2012-07-22T17:34:15.243 回答
1

我认为这几乎可以满足您的需求:

public class MyTextBox : TextBox
{
    public const int WM_PAINT = 0x000F;

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_PAINT:
                Invalidate();
                base.WndProc(ref m);
                if (!ContainsFocus && string.IsNullOrEmpty(Text))
                {
                    Graphics gr = CreateGraphics();
                    StringFormat format = new StringFormat();
                    format.Alignment = StringAlignment.Far;

                    gr.DrawString("Enter your name", Font, new SolidBrush(Color.FromArgb(70, ForeColor)), ClientRectangle, format);
                }
                break;
            default:
                base.WndProc(ref m);
                break;
        }
    }
}

在 TextBox 上覆盖 OnPaint 通常不是一个好主意,因为插入符号的位置将被计算错误。

请注意,标签仅在 TextBox 为空且没有焦点时显示。但这就是大多数此类输入框的行为方式。

如果提示应该一直可见,您可以将其添加为标签:

public class MyTextBox : TextBox
{
    private Label cueLabel;

    public TextBoxWithLabel()
    {
        SuspendLayout();

        cueLabel = new Label();
        cueLabel.Anchor = AnchorStyles.Top | AnchorStyles.Right;
        cueLabel.AutoSize = true;
        cueLabel.Text = "Enter your name";
        Controls.Add(cueLabel);
        cueLabel.Location = new Point(Width - cueLabel.Width, 0);

        ResumeLayout(false);
        PerformLayout();
    }
}
于 2012-07-22T23:32:50.757 回答
1

创建一个由 3 个控件组成的组合,并将其放入另一个UserControl. 三个控制将是:

  • 文本框,无边框
  • 标签,在文本框的右侧
  • 面板,承载他们两个的边界。

从 Hassan 那里拿走食谱,然后把它放在上面UserControl并将其用作一个新控件。

于 2012-07-23T00:45:51.403 回答