2009-02-24 6 views
5

Как и название: я искал в Интернете ответ, но я не смог найти способ скрыть каретку RichTextBox в VB.NET.Как скрыть каретку в RichTextBox?

Я попытался установить для свойства RichTextBox.Enabled значение False, а затем изменить цвет фона и цвет переднего плана на не-серые, но это не помогло.

Заранее спасибо.

+4

Я знаю, что это старый пост и помечен как .NET 3.5. Однако я хотел бы дать обновление для тех, кто его искал, и может использовать .NET 4.0. В .NET 4.0 элемент управления RichTextBox теперь имеет свойство IsReadOnlyCaretEnabled, которое по умолчанию имеет значение False, поэтому каретка автоматически скрывается, если вы установите ReadOnly на True. Если вы хотите, чтобы ReadOnly RichTextBox показывал карету, вы можете установить IsReadOnlyCaretEnabled в значение True. – Jim

+0

Мой ответ решает проблему? Если это так, вы можете рассмотреть его как ответ. Это на C#, но я должен работать в VB. :) – Pedro77

+0

Привет, можете ли вы рассмотреть вопрос о маркировке моего ответа в качестве решения? – Pedro77

ответ

2

Вы можете использовать функцию API HideCaret, ознакомьтесь с ней на www.pinvoke.net. Трюк заключается в том, чтобы знать, когда его называть. Очень простое и грязное решение - запустить таймер с одним выстрелом в событии Enter RTF. Ловушки правильное сообщение в WndProc, как nobugs suggestes лучше, к сожалению, сообщение в ловушке неправильно ...

1

Это работает для меня:

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); 
    } 
} 

Я надеюсь, что это помогает

+0

Есть курсор мерцающий эффект на мыши двигаться с этим решением – volody

0

ли что-то, чтобы сохранить это от получения «фокуса ввода»: он будет иметь каретку и может быть доступен для редактирования, только если у него есть фокус.

1

Здесь у меня есть элемент управления Rich Text с именем 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 
0
/// <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) 
    { 
    } 
} 
10

Решение:

от: 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); 

    } 
} 
0

минимальная версия (оптимизированный):

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); 
    } 
} 
0

Место управления RichTextBox в форме

Установить имя формы, как Form1

имя

Set RichTextBox в richTextBox1

Если вы не хотите, чтобы позволить пользователю копировать текст набор richTextBox1 ShortcutsEnabled свойство Ложный

Перейти к project-> Добавить Компонент, введите имя компонента 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); 
     } 
    } 
} 

От Решение Explorer открыть свой "Form1.Designer.cs" и заменить в этом файле следующие строки:

this.richTextBox1 = новый System.Windows.Forms.RichTextBox();

с

this.richTextBox1 = новый ReadOnlyRichTextBox();

и

частные System.Windows.Forms.RichTextBox richTextBox1;

с

частного ReadOnlyRichTextBox richTextBox1;

Смежные вопросы