2009-04-09 18 views

回答

9

您需要使用Win32 API。這裏是你可以在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) 

,並在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); 

然後撥打電話到

HideCaret(richtextbox.Handle) 

當過要隱藏它。

+0

作爲附錄,我發現成功的事件`textbox.GotFocus` – maxp 2012-02-13 11:54:06

5

只能說Anirudh Goel答案不起作用(至少在C#中)。克拉仍然存在閃爍:/

我發現了一個解決方案:http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_21896403.html

他總是類隱藏插入符,這裏是一個改進的一個,所以你可以選擇隱藏或不插入符號。

如果你想隱藏不要忘記MustHideCaret設置爲true

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

對我來說,從Pedro77解決方案沒有工作過...... 我已經修改了類:

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

然後把我的RichTextBoxEx成固定獲得上閃爍的鼠標點擊插入符號(內部)面板控制... ...

5

簡單的方法:這個事件附加到在RichTextBox的Enter事件:

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

這殺死了我的表格所有的控制內部調用它時。相反,我使用ActiveControl = .ActiveForm;這可以防止完全鎖定。 – RW4 2014-03-05 14:40:03