2009-04-09 14 views

Odpowiedz

9

Musisz użyć interfejsów API Win32. Oto, co można zrobić w 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) 

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

następnie wykonać połączenie do

HideCaret(richtextbox.Handle) 

gdy kiedykolwiek chcesz, aby ją ukryć.

+0

jako dodatek znalazłem sukces podczas wywoływania go wewnątrz zdarzenia 'textbox.GotFocus' – maxp

5

Powiem tylko, że odpowiedź Anirudh Goel nie działa (przynajmniej w języku C#). Karat nadal miga:/

znalazłem rozwiązanie w: http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_21896403.html

swojej klasie zawsze ukryć daszek, tutaj jest jeden ulepszony, dzięki czemu można ukryć lub nie daszek.

Jeśli chcesz ukryć nie zapomnij ustawić MustHideCaret do prawdziwej

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

Dla mnie roztworu z Pedro77 nie działa zbyt ... I zostały zmodyfikowane do tej klasy:

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

następnie umieścić moje RichTextBoxEx w (wewnątrz) kontroli panelu ... że uzyskanie stałej miga daszka na kliknięcie myszką ...

5

Prostszy sposób: dołączanie tego zdarzenia do zdarzenia Enter w RichTextBox:

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

ten zabił całą kontrolę w moim formularzu. Zamiast tego użyłem ActiveControl = .ActiveForm; Zapobiega to całkowitemu zawieszeniu. – RW4

+0

@ TheC4Fox Używam go, dołączaj wydarzenie TYLKO do zdarzenia ENTER RichTextbox. Zapobiega to w ogóle skupianiu się kontroli za pomocą kliknięcia myszą lub klawisza TAB. Przy odrobinie więcej wysiłku możesz zmusić go do celowania w następną kontrolkę, gdy użytkownik użyje klawisza TAB. Trochę zmodyfikowałem odpowiedź, aby było bardziej zrozumiałe. –