如何使用带有下划线和闪烁光标的文本框
本文关键字:光标 文本 闪烁 何使用 下划线 | 更新日期: 2023-09-27 18:07:17
我创建了Windows窗体,我使用文本框控件输入,但我喜欢使用它没有边框和其他布局的文本框等。我只是想使用下划线行和闪烁光标。
我使用了borderStyle (Fixed3D, None), backcolor=InactiveBorder等。但是我仍然没有得到下划线。像这样——> _ __ _ __ _ __ _ __ _ 结果是这样的:这是underline_ _ __ _ __ _ __ _ __ _
我认为Backcolor=InactiveBorder和BorderStyle=None是可以使用的,但是如何获得下划线和闪烁光标?
要求:
- 闪烁光标和下划线。(默认不闪烁,我只看到一条竖线))
要做到这一点,您可以在文本框下面添加一个标签,内容为_____________________
。我的首选解决方案是创建一个简单的自定义控件,只画一条线。
系统上的插入符号默认不会闪烁吗?在我的系统中,如果焦点在文本框上,则可以。
如果插入符号默认不闪烁,去Windows控制面板,检查你的键盘设置-这是你可以调整插入符号闪烁率的地方。
为您的textbox
创建underline
,您可以这样做,
- 首先添加一个
panel
,它是在文本框的高度+下划线的高度。 现在将 - 设置文本框的
border
为none
。 - 现在设置
panel
的backcolor
,根据下划线的颜色需要。
textbox
添加到panel
中,并将dock
设置为TOP
。更新:
这是VB代码,我希望你能很容易地把它转换成c#
[概念:你只需要设置所有文本框的边框为none。然后在窗体中绘制事件跟踪这些文本框并在其下方画一条线。)
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint
Using xPen As Pen = New Pen(Color.Blue)
' Here we are using LINQ to filter the controls.
' If you don't want it, you just check all the controls by using typeof
' inside the For Each loop.
For Each xTxtBox In Me.Controls.OfType(Of TextBox)()
e.Graphics.DrawLine(xPen,
xTxtBox.Location.X,
xTxtBox.Location.Y + xTxtBox.Height,
xTxtBox.Location.X + xTxtBox.Width,
xTxtBox.Location.Y + xTxtBox.Height)
Next
End Using
End Sub
使用遮罩文本框并设置焦点,例如maskedtextbox1.Focus();
<==这是用于闪烁光标和遮罩文本框的下划线!
试题:
将逻辑焦点设置为输入控件
FocusManager.SetFocusedElement(this, textboxJack);
将键盘焦点设置为输入控件
Keyboard.Focus(textboxJill);
和蒙版文本框,你可以设置一个掩码,将不会改变,当你删除它的文本不像简单的文本框:)祝你好运
要做到这一点,我建议创建一个自定义控件(这是在WinForms世界中通过继承提供的控件类之一来完成的)。该自定义控件将:
-
提供自己的绘图逻辑(通过重写
OnPaint
),以便绘制下划线并跳过绘制您不想看到的任何其他内容(例如,控件的边框)。 -
在接收到焦点时创建自己的插入符号,并在失去焦点时销毁该插入符号。你可以在我的回答中找到如何做到这一点的所有细节。
也可以通过调用SetCaretBlinkTime
函数配置插入符号的闪烁速率。但请注意,不建议使用,因为它会更改全局系统设置,从而影响其他应用程序。最好按照Thorsten的建议去做,如果你想看到不同的东西,就修改你机器上的设置。您应该始终尊重用户的设置。他们(或其他人)将他们的系统设置为不闪烁插入符号是有原因的。
我遇到了同样的问题,并构建了一些工作良好的东西:
public class TextBox : System.Windows.Forms.TextBox
{
public TextBox()
{
BorderStyle = BorderStyle.None;
Text = "__________"; //Sometime this doesn't work while creating the control in design mode ; don't know why
}
//protected override void OnFontChanged(EventArgs e)
//{
// base.OnFontChanged(e);
// RefreshHeight();
//}
bool loaded = false;
protected override void OnCreateControl()
{
if(!loaded)
RefreshHeight();
base.OnCreateControl();
}
private void RefreshHeight()
{
loaded = true;
Multiline = true;
Size s = TextRenderer.MeasureText(Text, Font, Size.Empty, TextFormatFlags.TextBoxControl);
MinimumSize = new Size(0, s.Height + 1);
Multiline = false;
}
}
我使用bool loaded = false
来避免应用程序因为OnCreateControl
而在循环中崩溃。TextBox控件没有OnLoad
事件(我对另一种方法开放)。
OnFontChanged
可以取消注释,如果你的应用程序在运行时改变字体大小
MinimumSize = new Size(0, s.Height + 1);
我增加了1以避免MeasureText