如何使用带有下划线和闪烁光标的文本框

本文关键字:光标 文本 闪烁 何使用 下划线 | 更新日期: 2023-09-27 18:07:17

我创建了Windows窗体,我使用文本框控件输入,但我喜欢使用它没有边框和其他布局的文本框等。我只是想使用下划线行和闪烁光标。

我使用了borderStyle (Fixed3D, None), backcolor=InactiveBorder等。但是我仍然没有得到下划线。像这样——> _ __ _ __ _ __ _ __ _ 结果是这样的:这是underline_ _ __ _ __ _ __ _ __ _

我认为Backcolor=InactiveBorder和BorderStyle=None是可以使用的,但是如何获得下划线和闪烁光标?

要求:

  • 闪烁光标和下划线。(默认不闪烁,我只看到一条竖线))

如何使用带有下划线和闪烁光标的文本框

要做到这一点,您可以在文本框下面添加一个标签,内容为_____________________。我的首选解决方案是创建一个简单的自定义控件,只画一条线。

系统上的插入符号默认不会闪烁吗?在我的系统中,如果焦点在文本框上,则可以。

如果插入符号默认不闪烁,去Windows控制面板,检查你的键盘设置-这是你可以调整插入符号闪烁率的地方。

为您的textbox创建underline,您可以这样做,

  • 首先添加一个panel,它是在文本框的高度+下划线的高度
  • 现在将textbox添加到panel中,并将dock设置为TOP
  • 设置文本框的bordernone
  • 现在设置panelbackcolor,根据下划线的颜色需要。

更新:

这是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世界中通过继承提供的控件类之一来完成的)。该自定义控件将:

  1. 提供自己的绘图逻辑(通过重写OnPaint),以便绘制下划线并跳过绘制您不想看到的任何其他内容(例如,控件的边框)。

  2. 在接收到焦点时创建自己的插入符号,并在失去焦点时销毁该插入符号。你可以在我的回答中找到如何做到这一点的所有细节。

也可以通过调用SetCaretBlinkTime函数配置插入符号的闪烁速率。但请注意,不建议使用,因为它会更改全局系统设置,从而影响其他应用程序。最好按照Thorsten的建议去做,如果你想看到不同的东西,就修改你机器上的设置。您应该始终尊重用户的设置。他们(或其他人)将他们的系统设置为不闪烁插入符号是有原因的。

当然,你需要使用p/Invoke从c#应用程序中调用这些与插入符号管理相关的Win32 API函数。如果你知道自己在做什么,应该不会太难。如果你需要一个完整的解决方案,可以考虑在这个问题上设置赏金,说服我为你写一个。

我遇到了同样的问题,并构建了一些工作良好的东西:

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

出现错误