1

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

我玩了borderStyle(Fixed3D,None),backcolor=InactiveBorder等。但我仍然得到下划线......就像这样-> _ __ _ __ _ __ _ __ _ 结果是这样的:这是下划线_ _ __ _ _ _ __ _ __ _

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

要求:

  • 闪烁的光标和下划线。(默认情况下不闪烁,我只看到一条垂直线))
4

5 回答 5

1

要为您创建一个underline,您textbox可以这样做,

  • 首先添加一个panel文本框高度+下划线高度的高度
  • 现在添加您的textbox内部panel并将其设置dockTOP.
  • 然后将文本框设置bordernone.
  • 现在根据下划线的颜色需要设置 的backcolorpanel

更新:

这是VB代码,希望你能轻松转换成c#

[概念:您只需将所有文本框的边框设置为无。然后在表单中绘制事件跟踪这些文本框并在其下方画一条线。]

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
于 2013-04-04T10:59:27.060 回答
1

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

默认情况下,系统上的插入符号不会闪烁吗?如果焦点在文本框上,它会在我的系统上运行。

如果插入符号默认不闪烁,请转到 Windows 控制面板并在那里检查您的键盘设置 - 这是您可以调整插入符号闪烁频率的地方。

于 2013-04-04T09:40:18.717 回答
0

为此,我建议创建一个自定义控件(在 WinForms 世界中通过从提供的控件类之一继承来完成)。然后,该自定义控件将:

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

  2. 当它获得焦点时创建它自己的插入符,并在失去焦点时销毁该插入符。您将在我的回答中找到有关如何执行此操作的所有详细信息。

SetCaretBlinkTime您还可以通过调用该函数来配置插入符号的闪烁率。但请注意,不建议这样做,因为它会更改全局系统设置并因此影响其他应用程序。如果您希望看到不同的东西,最好按照Thorsten 的建议进行操作并修改您机器上的设置。您应该始终尊重用户的设置。他们(或其他人)将系统设置为不闪烁插入符号是有原因的。

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

于 2013-04-05T06:07:01.790 回答
0

使用 Masked TextBox 并设置 Focus,例如maskedtextbox1.Focus();<== 这是用于闪烁光标和遮罩文本框到下划线!

尝试 :

将逻辑焦点设置到输入控件

FocusManager.SetFocusedElement(this, textboxJack); 

将键盘焦点设置到输入控件

Keyboard.Focus(textboxJill);

对于带掩码的文本框,您可以设置一个掩码,当您从中删除文本时不会更改该掩码,而不像简单的文本框 :) 祝您好运

于 2013-04-04T09:42:44.897 回答
0

我遇到了同样的问题并构建了一些可以正常工作的东西:

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

于 2017-10-04T11:48:53.730 回答