2009-02-24 23 views
5

Al igual que el título: busqué en la web una respuesta, pero no pude encontrar una manera de ocultar el cursor de un RichTextBox en VB.NET.¿Cómo ocultar el símbolo de intercalación en un RichTextBox?

He intentado establecer la propiedad RichTextBox.Enabled en False y luego cambiar el color de fondo y el color de primer plano a los no grises, pero eso no solucionó el problema.

Gracias de antemano.

+4

Sé que esta es una publicación anterior y está etiquetada como .NET 3.5. Sin embargo, me gustaría dar una actualización a esto para aquellos que lo buscaron y pueden usar .NET 4.0. En .NET 4.0, el control RichTextBox ahora tiene una propiedad IsReadOnlyCaretEnabled que por defecto es False, por lo que la intercalación se oculta automáticamente si establece ReadOnly en True. Si quiere que ReadOnly RichTextBox muestre el símbolo de intercalación, puede establecer IsReadOnlyCaretEnabled en True. – Jim

+0

Mi respuesta te soluciona el problema? Si es así, puede considerar marcarlo como una respuesta. Está en C#, pero debería funcionar en VB, creo. :) – Pedro77

+0

Hola, ¿consideras marcar mi respuesta como una solución? – Pedro77

Respuesta

2

Puede utilizar la función HideCaret API. Compruébelo en www.pinvoke.net. El truco es saber cuándo llamarlo. Una solución muy simple y sucia es iniciar un temporizador de una sola vez en el evento Enter de RTF. Atrapando el mensaje correcto en el WndProc como nobugs suggestes es mejor, por desgracia, el mensaje es atrapado mal ...

1

Esto funciona para mí:

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

espero que ayude

+0

Hay efecto de parpadeo del cursor en el movimiento del mouse con esta solución – volody

0

hacer algo para mantener de obtener el "foco de entrada": tendrá el cursor y será editable, solo mientras tenga el foco.

1

Aquí tengo un control de texto enriquecido llamado txtMessage, sus eventos se manejan para ocultar el cursor sobre los eventos que lo mostrarían.

<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

Solución:

de: 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

versión mínima (optimizado):

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

Place el control RichTextBox en el formulario

Set nombre del formulario como Form1

nombre

Conjunto RichTextbox como RichTextBox1

Si no desea permitir al usuario copiar la propiedad ShortcutsEnabled conjunto de texto RichTextBox1 en False

Ir a Proyecto-> Añadir componente, introduzca el nombre de los componentes ReadOnlyRichTextBox.cs

ReadOnlyRichTextBox.cs Entonces abiertas y pegar el código siguiente:

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

Desde el Explorador de soluciones "abrir su Form1.Designer.cs" y vuelva a colocar en este archivo las siguientes líneas:

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

con

this.richTextBox1 = new ReadOnlyRichTextBox();

y

System.Windows.Forms privadas.RichTextBox richTextBox1;

con

privada ReadOnlyRichTextBox RichTextBox1;

Cuestiones relacionadas