如何使用文本框,但有一个下划线和闪烁的光标?

时间:2013-04-04 09:35:39

标签: c# winforms

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

我玩borderStyle(Fixed3D,无),backcolor = InactiveBorder等。但我仍然做网获取下划线...喜欢这个 - >的 _ __ _ __ _ __ _ __ _ 结果如下:这是下划线_ _ __ _ __ _ __ _ __ _

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

要求:

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

5 个答案:

答案 0 :(得分:1)

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

默认情况下系统上的插入符号是否闪烁?如果焦点在文本框上,它会在我的系统上完成。

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

答案 1 :(得分:1)

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

  • 首先添加一个panel,其高度为文本框的高度+下划线的高度
  • 现在将textbox添加到panel内,并将其dock设置为TOP
  • 然后将文本框的border设置为none
  • 现在根据下划线的颜色需要设置backcolor的{​​{1}}。

更新

这是VB代码,我希望您可以轻松将其转换为c#

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

panel

答案 2 :(得分:0)

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

尝试:

  

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

FocusManager.SetFocusedElement(this, textboxJack); 
     

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

Keyboard.Focus(textboxJill);

并且对于蒙版文本框,您可以设置一个在从中删除文本时不会更改的蒙版,而不是简单的文本框:) 祝你好运

答案 3 :(得分:0)

为此,我建议创建一个自定义控件(通过继承其中一个提供的控件类在WinForms世界中完成)。那个自定义控件将会:

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

  2. 在收到焦点时创建自己的插入符号,并在丢失焦点时销毁该插入符号。您可以找到有关如何执行此操作的所有详细信息in my answer here

  3. 您还可以通过调用SetCaretBlinkTime功能配置插入符的闪烁率。但请注意,这是不推荐,因为它会更改全局系统设置,因此会影响其他应用程序。如果您希望看到不同的内容,最好以Thorsten suggests为单位并修改设备上的设置。您应该始终尊重用户的设置。他们(或其他人)设置他们的系统是为了不让插入符号闪烁。

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

答案 4 :(得分: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

的任何错误