2009-04-09 8 views

Respuesta

9

Deberá utilizar las API de Win32. Esto es lo que se podría hacer en VB:

'API declares 
Private Declare Function HideCaret Lib "user32" _ 
(ByVal hwnd As IntPtr) As Integer 
Private Declare Function ShowCaret Lib "user32" _ 
(ByVal hwnd As IntPtr) As Integer 
'hide the caret in myTextBox 
Call HideCaret(myTextBox.Handle) 
'show the caret back.. 
Call ShowCaret(myTextBox.Handle) 

y en C#

[DllImport("user32.dll", EntryPoint = "ShowCaret")] 
public static extern long ShowCaret(IntPtr hwnd); 
[DllImport("user32.dll", EntryPoint = "HideCaret")] 
public static extern long HideCaret(IntPtr hwnd); 

continuación, realizar una llamada a

HideCaret(richtextbox.Handle) 

cuando cada vez que desee ocultar.

+0

Como una adición, me encontré con éxito al llamar dentro del evento 'textbox.GotFocus' – maxp

5

Solo para decir que la respuesta de Anirudh Goel no funciona (al menos en C#). El quilate todavía no parpadea:/

he encontrado una solución a: http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_21896403.html

Su clase siempre ocultar el símbolo de intercalación, aquí es una mejora de uno por lo que puede optar por ocultar o no el símbolo de intercalación.

Si desea ocultar no se olvide de establecer MustHideCaret a cierto

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

namespace Lm 
{ 
    public class RichTextBoxEx : RichTextBox 
    { 
     private readonly object mustHideCaretLocker = new object(); 

     private bool mustHideCaret; 

     [DefaultValue(false)] 
     public bool MustHideCaret 
     { 
      get 
      { 
       lock (this.mustHideCaretLocker) 
        return this.mustHideCaret; 
      } 
      set 
      { 
       TabStop = false; 
       if (value) 
        SetHideCaret(); 
       else 
        SetShowCaret(); 
      } 
     } 

     [DllImport("user32.dll")] 
     private static extern int HideCaret(IntPtr hwnd); 
     [DllImport("user32.dll", EntryPoint = "ShowCaret")] 
     public static extern long ShowCaret(IntPtr hwnd); 

     public RichTextBoxEx() 
     { 
     } 

     private void SetHideCaret() 
     { 
      MouseDown += new MouseEventHandler(ReadOnlyRichTextBox_Mouse); 
      MouseUp += new MouseEventHandler(ReadOnlyRichTextBox_Mouse); 
      Resize += new EventHandler(ReadOnlyRichTextBox_Resize); 
      HideCaret(Handle); 
      lock (this.mustHideCaretLocker) 
       this.mustHideCaret = true; 
     } 

     private void SetShowCaret() 
     { 
      try 
      { 
       MouseDown -= new MouseEventHandler(ReadOnlyRichTextBox_Mouse); 
       MouseUp -= new MouseEventHandler(ReadOnlyRichTextBox_Mouse); 
       Resize -= new EventHandler(ReadOnlyRichTextBox_Resize); 
      } 
      catch 
      { 
      } 
      ShowCaret(Handle); 
      lock (this.mustHideCaretLocker) 
       this.mustHideCaret = false; 
     } 

     protected override void OnGotFocus(EventArgs e) 
     { 
      if (MustHideCaret) 
       HideCaret(Handle); 
     } 

     protected override void OnEnter(EventArgs e) 
     { 
      if (MustHideCaret) 
       HideCaret(Handle); 
     } 

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

     private void ReadOnlyRichTextBox_Resize(object sender, System.EventArgs e) 
     { 
      HideCaret(Handle); 
     } 
    } 
} 
1

Para mí la solución de Pedro77 no funcionó demasiado ... He modificado esa clase a:

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

namespace Lm 
{ 
    public class RichTextBoxEx : RichTextBox 
    { 
     private readonly object mustHideCaretLocker = new object(); 

     private bool mustHideCaret; 

     [DefaultValue(false)] 
     public bool MustHideCaret 
     { 
      get 
      { 
       lock (this.mustHideCaretLocker) 
        return this.mustHideCaret; 
      } 
      set 
      { 
       TabStop = false; 
       if (value) 
        SetHideCaret(); 
       else 
        SetShowCaret(); 
      } 
     } 

     [DllImport("user32.dll")] 
     private static extern int HideCaret(IntPtr hwnd); 
     [DllImport("user32.dll", EntryPoint = "ShowCaret")] 
     public static extern long ShowCaret(IntPtr hwnd); 

     public RichTextBoxEx() 
     { 
     } 

     private void SetHideCaret() 
     { 
      MouseDown += new MouseEventHandler(ReadOnlyRichTextBox_Mouse); 
      MouseUp += new MouseEventHandler(ReadOnlyRichTextBox_Mouse); 
      Resize += new EventHandler(ReadOnlyRichTextBox_Resize); 
      HideCaret(Handle); 
      lock (this.mustHideCaretLocker) 
       this.mustHideCaret = true; 
     } 

     private void SetShowCaret() 
     { 
      try 
      { 
       MouseDown -= new MouseEventHandler(ReadOnlyRichTextBox_Mouse); 
       MouseUp -= new MouseEventHandler(ReadOnlyRichTextBox_Mouse); 
       Resize -= new EventHandler(ReadOnlyRichTextBox_Resize); 
      } 
      catch 
      { 
      } 
      ShowCaret(Handle); 
      lock (this.mustHideCaretLocker) 
       this.mustHideCaret = false; 
     } 

     protected override void OnGotFocus(EventArgs e) 
     { 
      if (MustHideCaret) 
      { 
       HideCaret(Handle); 
       this.Parent.Focus();//here we select parent control in my case it is panel 
      } 
     } 

     protected override void OnEnter(EventArgs e) 
     { 
      if (MustHideCaret) 
       HideCaret(Handle); 
     } 

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

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

a continuación, poner mi RichTextBoxEx en (dentro de) Control Panel ... que fija conseguir parpadear cursor sobre el clic del ratón ...

5
método más fácil

: adjuntar a este evento para el evento Enter del RichTextBox:

private void Control_Enter(object sender, EventArgs e) { 
    ActiveControl = null; 
    } 
+0

Este mató a todo el control en mi forma. En cambio, utilicé ActiveControl = .ActiveForm; Esto evita el bloqueo completo. – RW4

+0

@ TheC4Fox Lo estoy usando, adjunte el evento SOLAMENTE al evento RichTextbox ENTER. Esto evita que el control se enfoque en absoluto con el clic del mouse o la tecla TAB del teclado. Con un poco más de esfuerzo puede hacer que apunte al siguiente control cuando el usuario usa la tecla TAB. Modifiqué la respuesta un poco para que quede más claro. –

Cuestiones relacionadas