Winforms 如何在System.Windows.Forms.TextBox中隐藏输入插入符号?

Winforms 如何在System.Windows.Forms.TextBox中隐藏输入插入符号?,winforms,textbox,Winforms,Textbox,我需要显示一个可变长度的消息,并允许文本是可选的。我已将文本框设置为只读,不允许编辑文本,但仍会显示输入插入符号 闪烁的输入插入符号令人困惑。如何隐藏它?如果禁用文本框(设置Enable=false),其中的文本仍然可以滚动和选择。如果您不喜欢禁用文本框(通常为灰色背景)的视觉显示,可以手动覆盖颜色 请注意,在不使用默认颜色/主题设置的系统上,手动覆盖颜色会使窗体/控件看起来很奇怪。不要因为你的控件是白色的,就认为每个人的控件都是白色的。这就是为什么您应该尽可能始终使用系统颜色(在system.

我需要显示一个可变长度的消息,并允许文本是可选的。我已将文本框设置为只读,不允许编辑文本,但仍会显示输入插入符号


闪烁的输入插入符号令人困惑。如何隐藏它?

如果禁用文本框(设置
Enable=false
),其中的文本仍然可以滚动和选择。如果您不喜欢禁用文本框(通常为灰色背景)的视觉显示,可以手动覆盖颜色


请注意,在不使用默认颜色/主题设置的系统上,手动覆盖颜色会使窗体/控件看起来很奇怪。不要因为你的控件是白色的,就认为每个人的控件都是白色的。这就是为什么您应该尽可能始终使用系统颜色(在
system.Drawing.SystemColors
枚举中定义),例如
SystemColors.ControlLight

好的,这无法完成。TextBox控件是一个有趣的控件,因为它实际上有很多无法修改的行为,因为它访问操作系统的方式。这就是为什么许多很酷的自定义文本框都是从头开始编写的


我担心您可能无法执行您希望执行的操作:(

您可以通过win32调用执行此操作

[DllImport("user32.dll")]
static extern bool HideCaret(IntPtr hWnd);
public void HideCaret()
{
    HideCaret(someTextBox.Handle);
}

在使用win32调用时,不要忘记将光标隐藏在文本框的GotFocus事件中。

为了完整起见,我需要这样一个功能来使用

它们已经提供了一个
ShowCaret
和一个
HideCaret
方法,不幸的是它们受到了保护。因此,我创建了一个派生类来提供该功能。下面是完整的代码:

public class MyTextEdit : TextEdit
{
    private bool _wantHideCaret;

    public void DoHideCaret()
    {
        HideCaret();

        _wantHideCaret = true;
    }

    public void DoShowCaret()
    {
        ShowCaret();

        _wantHideCaret = false;
    }

    protected override void OnGotFocus(EventArgs e)
    {
        base.OnGotFocus(e);

        if (_wantHideCaret)
        {
            HideCaret();
        }
    }
}
要使用代码,只需在代码中使用派生类而不是原始的
TextEdit
类,并在任何地方调用
DoHideCaret()
,例如在包含文本编辑控件的窗体的构造函数中


也许这对将来的某个人有帮助。

我知道这是一条老线索,但它是一个有用的参考

我用一个简单得多但非常笨拙的解决方案解决了这个问题,这可能取决于你对用户访问表单的控制程度我给了prime tabIndex值,然后将其放置在窗体之外,使其不可见。这在对话框中效果很好,因为用户无法调整大小。如果窗体可调整大小,则可能不起作用


正如我所说,这是一个难题,但设置起来容易多了。(顺便说一句,我发现隐藏的方法不起作用,但我没有努力追求。)

不要忘记使用System.Runtime.InteropServices;和
ShowCaret(IntPtr hWnd);
不,它不可选择(或可滚动)如果文本框被禁用。您可能正在考虑将其设为只读。对于输入字段需要可见的情况,这听起来并不有用,我认为这几乎适用于任何情况。如果字段本身不可见,则不需要单独隐藏插入符号。这是否回答了您的问题在…上