2009-04-09 22 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

5

ちょうどAnirudh Goelの答えは(少なくともC#では)うまくいかないと言っています。/

私はで解決策が見つかりました::まだ点滅カラットあなたはキャレットを非表示にするかどうかを選択できるようhttp://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_21896403.html

彼のクラスは常にキャレットを非表示には、ここでの改善です。

あなたは真の 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); 
     } 

     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

にMustHideCaretを設定することを忘れないでください非表示にしたい場合は... 私はそのクラスを変更した:

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

簡単方法は:リッチテキストボックスのEnterイベントにこのイベントを添付:

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

の内側にそれを呼び出すときに、私は成功を見つけました。代わりに、私はActiveControl = .ActiveFormを使用しました。これにより完全なロックアップが防止されます。 – RW4

+0

@ TheC4Fox私はそれを使用しています、リッチテキストボックスのEnterイベントにのみイベントを添付します。これにより、マウスクリックやキーボードのTABによるコントロールの集中を防ぐことができます。 TABキーを使用すると、次のコントロールをターゲットにすることができます。私はそれをもっと明確にするために答えを少し修正しました。 –

関連する問題