2009-02-24 10 views
5

Proprio come nel titolo: ho cercato il web per una risposta, ma non sono riuscito a trovare un modo per nascondere il punto di inserimento di un RichTextBox in VB.NET.Come nascondere il segno di omissione in un oggetto RichTextBox?

Ho provato a impostare la proprietà RichTextBox.Enabled su False e quindi modificare il colore di sfondo e il colore di primo piano con quelli non grigi, ma questo non ha funzionato.

Grazie in anticipo.

+4

So che questo è un vecchio post ed è etichettato .NET 3.5. Tuttavia mi piacerebbe dare un aggiornamento a questo per chi lo ha cercato e può utilizzare .NET 4.0. In .NET 4.0, il controllo RichTextBox ora ha una proprietà IsReadOnlyCaretEnabled che ha come valore predefinito False, quindi il segno di omissione viene automaticamente nascosto se si imposta ReadOnly su True. Se vuoi un ReadText RichTextBox per mostrare il caret, puoi impostare IsReadOnlyCaretEnabled su True. – Jim

+0

La mia risposta risolve il tuo problema? In tal caso, potresti considerare di contrassegnarlo come una risposta. È in C#, ma dovrebbe funzionare in VB, credo. :) – Pedro77

+0

Ciao, puoi considerare di contrassegnare la mia risposta come soluzione? – Pedro77

risposta

2

È possibile utilizzare la funzione HideCaret API, verificarlo su www.pinvoke.net. Il trucco è sapere quando chiamarlo. Una soluzione molto semplice e sporca consiste nell'avviare un timer one-shot nell'evento Enter di RTF. Intrappolando il messaggio corretto nel WndProc come nobugs suggestes è meglio, purtroppo il messaggio intrappolata è sbagliato ...

1

Questo funziona per me:

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

Spero che aiuta

+0

Ci sono effetti di sfarfallio del cursore sul movimento del mouse con questa soluzione – volody

0

Fai qualcosa a mantenere dall'ottenere il "focus di input": avrà il segno di omissione ed è modificabile solo quando ha il focus.

1

Qui Ho un controllo di testo RTF di nome txtMessage, è eventi vengono gestiti da nascondere cursore su eventi che mostrerebbero esso.

<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

Soluzione:

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

versione Minimal (ottimizzata):

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

Posizionare il controllo RichTextBox della maschera

Imposta nome del modulo come Form1

nome

Set RichTextBox come RichTextBox1

Se non si desidera consentire all'utente di copiare la proprietà ShortcutsEnabled testo set RichTextBox1 False

Vai a Progetto-> Aggiungi componente, inserire il nome del componente ReadOnlyRichTextBox.cs

ReadOnlyRichTextBox.cs quindi aprire e incollare il codice seguente:

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

Da Esplora soluzioni aprire il tuo "Form1.Designer.cs" e sostituire in questo file le seguenti righe:

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

con

this.richTextBox1 = new ReadOnlyRichTextBox();

e

System.Windows.Forms privati.RichTextBox richTextBox1;

con

privato ReadOnlyRichTextBox RichTextBox1;

Problemi correlati