C# 如何使用带有下划线和闪烁光标的文本框?
我已经创建了Windows窗体,并且正在使用textbox控件进行输入,但是我喜欢使用它而不带边框和其他文本框布局等。我只想使用下划线和闪烁光标 我玩了borderStyle(Fixed3D,None),backcolor=InactiveBorder等。但我仍然得到了下划线。。。像这样->\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu的结果是下划线 我认为Backcolor=InactiveBorder和BorderStyle=None可以使用,但是如何获得下划线和闪烁光标呢 要求:C# 如何使用带有下划线和闪烁光标的文本框?,c#,winforms,C#,Winforms,我已经创建了Windows窗体,并且正在使用textbox控件进行输入,但是我喜欢使用它而不带边框和其他文本框布局等。我只想使用下划线和闪烁光标 我玩了borderStyle(Fixed3D,None),backcolor=InactiveBorder等。但我仍然得到了下划线。。。像这样->\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu的结果
- 闪烁的光标和下划线。(默认情况下,屏幕不会闪烁,我只看到一条垂直线)
。我的首选解决方案是创建一个简单的自定义控件,只绘制一条线
默认情况下,系统上的插入符号不闪烁吗?如果焦点在文本框上,则会在我的系统上显示
如果插入符号在默认情况下不闪烁,请转到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;
}
}