可能重复:
WinForms 中的水印文本框
我目前正在编写 C# 应用程序的设置对话框。输入字段应如下所示:
→
实现这一点的最佳方法是什么?我想过创建一个背景图像,但我想知道是否有更好的方法来做到这一点(动态的)......
可能重复:
WinForms 中的水印文本框
我目前正在编写 C# 应用程序的设置对话框。输入字段应如下所示:
→
实现这一点的最佳方法是什么?我想过创建一个背景图像,但我想知道是否有更好的方法来做到这一点(动态的)......
使用设置为白色的面板作为BackColor
.
在面板控件中,在左侧插入一个TextBox
设置BorderStyle
为None
。
在面板控件中,在右侧插入一个Label
BackColor 设置为Transparent
并设置Text
为“Firstname”。
只需创建一个新的文本框类
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 参数进行适当的更改
我认为这几乎可以满足您的需求:
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();
}
}
创建一个由 3 个控件组成的组合,并将其放入另一个UserControl
. 三个控制将是:
从 Hassan 那里拿走食谱,然后把它放在上面UserControl
并将其用作一个新控件。