如何在 RichTextBox 中隐藏插入符号?

Posted

技术标签:

【中文标题】如何在 RichTextBox 中隐藏插入符号?【英文标题】:How to hide the caret in a RichTextBox? 【发布时间】:2010-10-09 14:23:19 【问题描述】:

就像标题一样:我在网上搜索了答案,但我无法找到在 VB.NET 中隐藏 RichTextBox 插入符号的方法。

我尝试将 RichTextBox.Enabled 属性设置为 False,然后将背景颜色和前景色更改为非灰色,但这并没有奏效。

提前致谢。

【问题讨论】:

我知道这是一篇旧帖子,并标有 .NET 3.5。但是,我想为那些搜索过它并可以使用 .NET 4.0 的人提供更新。在 .NET 4.0 中,RichTextBox 控件现在有一个属性 IsReadOnlyCaretEnabled,默认为 False,因此如果将 ReadOnly 设置为 True,插入符号会自动隐藏。如果您希望 ReadOnly RichTextBox 显示插入符号,可以将 IsReadOnlyCaretEnabled 设置为 True。 我的回答解决了你的问题?如果是这样,您可以考虑将其标记为答案。它在 C# 中,但我认为应该在 VB 中工作。 :) 您好,您可以考虑将我的答案标记为解决方案吗? 其实我觉得最简单的方法就是用另一个透明控件来覆盖它!可以避免引入非托管代码。 【参考方案1】:

解决方案:

来自:http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_21896403.html

using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Runtime.InteropServices;

public class ReadOnlyRichTextBox : System.Windows.Forms.RichTextBox


  [DllImport("user32.dll")]
  private static extern int HideCaret (IntPtr hwnd);

  public ReadOnlyRichTextBox()
  
    this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ReadOnlyRichTextBox_Mouse);
    this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.ReadOnlyRichTextBox_Mouse);
    base.ReadOnly = true;
    base.TabStop = false;
    HideCaret(this.Handle);
  


  protected override void OnGotFocus(EventArgs e)
  
    HideCaret(this.Handle);
  

  protected override void OnEnter(EventArgs e)
  
    HideCaret(this.Handle);
  

  [DefaultValue(true)]
  public new bool ReadOnly
  
    get  return true; 
    set  
  

  [DefaultValue(false)]
  public new bool TabStop
  
    get  return false; 
    set  
  

  private void ReadOnlyRichTextBox_Mouse(object sender, System.Windows.Forms.MouseEventArgs e)
  
    HideCaret(this.Handle);
  

  private void InitializeComponent()
  
    //
    // ReadOnlyRichTextBox
    //
    this.Resize += new System.EventHandler(this.ReadOnlyRichTextBox_Resize);

  

  private void ReadOnlyRichTextBox_Resize(object sender, System.EventArgs e)
  
    HideCaret(this.Handle);

  

【讨论】:

【参考方案2】:

将richTextBox控件放在窗体上

设置表单名称为Form1

设置richTextBox名称为richTextBox1

如果不想让用户复制文本集richTextBox1 ShortcutsEnabled 属性为False

进入项目->添加组件,输入组件名称ReadOnlyRichTextBox.cs

然后打开 ReadOnlyRichTextBox.cs 并粘贴以下代码:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace <Replace with your app namespace>

    public partial class ReadOnlyRichTextBox : RichTextBox
    
        [DllImport("user32.dll")]
        static extern bool HideCaret(IntPtr hWnd);

        public ReadOnlyRichTextBox()
        
            this.ReadOnly = true;
        

        protected override void WndProc(ref Message m)
        
            base.WndProc(ref m);
            HideCaret(this.Handle);
        
    

从解决方案资源管理器中打开您的“Form1.Designer.cs”并在此文件中替换以下行:

this.richTextBox1 = new System.Windows.Forms.RichTextBox();

this.richTextBox1 = new ReadOnlyRichTextBox();

私有 System.Windows.Forms.RichTextBox richTextBox1;

私有 ReadOnlyRichTextBox richTextBox1;

【讨论】:

【参考方案3】:

您可以使用 HideCaret API 功能,在 www.pinvoke.net 上查看。诀窍是知道何时调用它。一个非常简单而肮脏的解决方案是在 RTF 的 Enter 事件中启动一次性计时器。按照 nobugs 的建议在 WndProc 中捕获正确的消息会更好,不幸的是,捕获的消息是错误的......

【讨论】:

【参考方案4】:

这对我有用:

public class RichTextLabel : RichTextBox

    public RichTextLabel()
    
        base.ReadOnly = true;
        base.BorderStyle = BorderStyle.None;
        base.TabStop = false;
        base.SetStyle(ControlStyles.Selectable, false);
        base.SetStyle(ControlStyles.UserMouse, true);
        base.SetStyle(ControlStyles.SupportsTransparentBackColor, true);

        base.MouseEnter += delegate(object sender, EventArgs e)
        
            this.Cursor = Cursors.Default;
        ;
    

    protected override void WndProc(ref Message m) 
        if (m.Msg == 0x204) return; // WM_RBUTTONDOWN
        if (m.Msg == 0x205) return; // WM_RBUTTONUP
        base.WndProc(ref m);
    

希望对你有帮助

【讨论】:

这个解决方案鼠标移动会有光标闪烁的影响【参考方案5】:
/// <summary>
/// Transparent RichTextBox
/// To change BackColor add a Panel control as holder of RichTextLabel
/// </summary>
public class RichTextLabel : RichTextBox

    public RichTextLabel()
    
        base.Enabled = false;
        base.ReadOnly = true;
        base.ScrollBars = RichTextBoxScrollBars.None;
        base.ForeColor = Color.FromArgb(0, 0, 1);
    

    override protected CreateParams CreateParams
    
        get
        
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x20;
            return cp;
        
    

    override protected void OnPaintBackground(PaintEventArgs e)
    
    

【讨论】:

【参考方案6】:

我知道它很旧,但我在这里看到了很多不同的选择。 我必须为我补充一点,这成功了:

this.textRichBox.ReadOnly = false;
this.textRichBox.TabStop = false;

【讨论】:

这在您单击富文本框之前有效。然后插入符号返回。 :(【参考方案7】:

做一些事情来防止它获得“输入焦点”:它会有插入符号,并且是可编辑的,只有当它有焦点时。

【讨论】:

【参考方案8】:

这里我有一个名为 txtMessage 的富文本控件,它的事件被处理以隐藏将显示它的事件上的插入符号。

<System.Runtime.InteropServices.DllImport("user32.dll")>
Private Shared Function HideCaret(ByVal hWnd As IntPtr) As Boolean
End Function

Public Sub New()
    txtMessage.ReadOnly = True
    txtMessage.TabStop = False
End Sub

Private Sub txtMessage_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtMessage.KeyUp
    HideCaret(txtMessage.Handle)
End Sub

Private Sub txtMessage_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles txtMessage.MouseDown
    HideCaret(txtMessage.Handle)
End Sub

Private Sub txtMessage_SelectionChanged(ByVal sender As Object, ByVal e As EventArgs) Handles txtMessage.SelectionChanged
    HideCaret(txtMessage.Handle)
End Sub

【讨论】:

【参考方案9】:

最小版本(优化):

public class ReadOnlyRichTextBox : RichTextBox

    [DllImport("user32.dll")]
    static extern bool HideCaret(IntPtr hWnd);

    public ReadOnlyRichTextBox()
    
        ReadOnly = true;
        SetStyle(ControlStyles.Selectable, false);
    

    protected override void OnHandleCreated(EventArgs e)
    
        base.OnHandleCreated(e);
        HideCaret(this.Handle);
    

    protected override void OnEnter(EventArgs e)
    
        base.OnEnter(e);
        HideCaret(this.Handle);
    

    protected override void OnGotFocus(EventArgs e)
    
        base.OnGotFocus(e);
        HideCaret(this.Handle);
    

    protected override void OnMouseDown(MouseEventArgs e)
    
        base.OnMouseDown(e);
        if (e.Button == MouseButtons.Left)
            HideCaret(this.Handle);
    

【讨论】:

以上是关于如何在 RichTextBox 中隐藏插入符号?的主要内容,如果未能解决你的问题,请参考以下文章

检测 RichTextBox 中插入符号位置何时更改

WPF RichTextBox 将插入符号定位到具有给定索引的可见字符

RichTextBox C# 设置插入符号位置 winforms

C#中,如何让richTextBox旁边的滚动条始终处于最下方

将段落或文本框附加到 RichTextBox

在富文本框中定位列表框