Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用带有下划线和闪烁光标的文本框?_C#_Winforms - Fatal编程技术网

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

C# 如何使用带有下划线和闪烁光标的文本框?,c#,winforms,C#,Winforms,我已经创建了Windows窗体,并且正在使用textbox控件进行输入,但是我喜欢使用它而不带边框和其他文本框布局等。我只想使用下划线和闪烁光标 我玩了borderStyle(Fixed3D,None),backcolor=InactiveBorder等。但我仍然得到了下划线。。。像这样->\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu的结果

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

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

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

要求:

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

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

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


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

使用蒙面文本框并设置焦点,例如
蒙面文本框1.Focus()
为您的
文本框创建
下划线
,您可以这样做

  • 首先添加一个
    面板
    ,该面板位于文本框高度+下划线高度
  • 现在将
    文本框
    添加到
    面板
    中,并将其
    停靠
    设置为
    顶部
  • 然后将文本框的
    边框设置为
    none
  • 现在,根据下划线的颜色需要,设置
    面板的
    背景色

更新: 这是VB代码,希望你能轻松地把它转换成c# [概念:您只需将所有文本框的边框设置为“无”。然后在forms paint事件中跟踪这些文本框并在其下方画一条线。]

Private Sub Form1\u Paint(ByVal sender作为对象,ByVal e作为PaintEventArgs)处理Me.Paint
使用xPen作为笔=新笔(颜色.蓝色)
'这里我们使用LINQ来过滤控件。
'如果您不需要它,只需使用typeof检查所有控件即可
'在For Each循环的内部。
对于Me.Controls.OfType(文本框的)()中的每个xTxtBox
e、 图形。抽绳(xPen,
xtbox.Location.X,
xTxtBox.Location.Y+xTxtBox.Height,
xTxtBox.Location.X+xTxtBox.Width,
xtbox.Location.Y+xtbox.Height)
下一个
终端使用
端接头

要做到这一点,我建议创建一个自定义控件(在WinForms世界中通过从提供的一个控件类继承来实现)。然后,该自定义控件将:

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

  • 在接收焦点时创建自己的插入符号,在失去焦点时销毁该插入符号。您将找到有关如何执行此操作的所有详细信息

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


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

    < P>我面对同样的问题,并建立了一些很好的工作:

    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-load=false
    来避免应用程序在循环中崩溃,因为
    OnCreateControl
    TextBox控件没有
    OnLoad
    事件(我对另一种方法持开放态度)

    如果您的应用程序在运行时更改字体大小,
    OnFontChanged
    可以取消注释


    MinimumSize=新尺寸(0,s.高度+1)
    我添加了1以避免出现
    MeasureText

    的任何错误。不,默认情况下,它不会闪烁,我也更新了有关此的问题。顺便说一句:我是winforms的新手,所以我可能会在代码中画一条线。那么,按照我的建议使用
    标签
    (尽管这是一个非常糟糕的假:-)关于闪烁的光标:Windows本身负责闪烁的插入符号。这不是您需要在代码中“打开”的东西。但是,您可以按照此问题的答案中所述更改插入符号的形状:。但是,默认情况下,在Windows中,插入符号是一条闪烁的垂直线。如果没有,请检查Windows控制面板中的键盘设置。使用标签控件而不是文本框的问题在于,你必须自己编写所有的文本输入代码,这并不简单。而且,即使你写了一些看起来有效的东西,它也会相当脆弱,并且缺少一些功能(例如,输入法支持)。使用一个内置了所有复杂逻辑的文本框,只需跳过你不想要的边框等等,就简单多了。不,我不是这个意思!我打算在表单上放置一个无边框的文本框,并将标签与下面的文本框对齐。文本像往常一样输入到文本框中,标签包含m
    
    Keyboard.Focus(textboxJill);
    
    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;
        }
    }