2009-03-09 121 views
9

RichTextBoxコントロールを使用して実装した読み取り専用データロギングウィンドウがあります。私は、ユーザーが特定のログをコピー/貼り付け操作などのために選択できるように、ユーザーがコントロールをクリックしたときに起こる自動スクロールを無効にできたいと思っています。しかし、ユーザーがRichTextBoxをクリックするとすぐに、自動的に下にスクロールし、これを困難にします。リッチテキストボックスでの自動スクロールの防止

誰もがこの動作を無効にする方法を知っていますか?

ありがとうございます!あなたはこのような何かを行う可能性があります(私はここにいくつかの仮定を作ってるんだ)ログデータを追加し、あなたの方法で、その後

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
private static extern IntPtr LockWindowUpdate(IntPtr Handle); 

答えて

6

あなたはこのような何かをやって見てかかることがあります

LockWindowUpdate(this.Handle); 
int pos = richTextBox1.SelectionStart; 
int len = richTextBox1.SelectionLength; 
richTextBox1.AppendText(yourText); 
richTextBox1.SelectionStart = pos; 
richTextBox1.SelectionLength = len; 
LockWindowUpdate(IntPtr.Zero); 

リッチテキストボックスに追加したタイマーを使って小さなテストアプリを実行しましたが、スクロールしてテキスト選択を行うことができました。それはいくつかの位置的な問題があり、完璧ではありませんが、おそらくそれはあなた自身の解決策にあなたを動かすのに役立ちます。

すべてベスト!

11

RichTextBoxコントロールは、選択範囲が非表示になっていない場合、現在の選択範囲に自動的にスクロールします。 RichTextBox.AppendText()は、テキストを追加するだけでなく、現在の選択を変更するため、間接的に「自動スクロール」動作をトリガーします。 RichTextBox.HideSelectionがtrueに設定されている場合、コントロールにフォーカスがないときは選択が非表示になります。ここで説明した動作について説明します。ここでは、ユーザーがコントロール内をクリックしたときにのみ自動スクロールが発生します。 (Windowsメッセージを介して)

  1. バックアップ初期選択
  2. 非フォーカス制御
  3. 隠す選択:これを防ぐには を(それにより焦点を当てる与える)は、次の追加のテキストを行う必要があります
  4. のappendText
  5. 再表示選択
  6. リフォーカス制御を初期選択を復元

また、選択範囲がテキストの最後にあるかどうかを確認し、自動スクロール動作が許可されている場合は許可することもできます。これは基本的にVisual Studioの出力ウィンドウの動作をエミュレートします。たとえば:

[System.Runtime.InteropServices.DllImport("user32.dll")] 
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam); 
    const int WM_USER = 0x400; 
    const int EM_HIDESELECTION = WM_USER + 63; 

    void OnAppend(string text) 
    { 
     bool focused = richTextBox1.Focused; 
     //backup initial selection 
     int selection = richTextBox1.SelectionStart; 
     int length = richTextBox1.SelectionLength; 
     //allow autoscroll if selection is at end of text 
     bool autoscroll = (selection==richTextBox1.Text.Length); 

     if (!autoscroll) 
     { 
      //shift focus from RichTextBox to some other control 
      if (focused) textBox1.Focus(); 
      //hide selection 
      SendMessage(richTextBox1.Handle, EM_HIDESELECTION, 1, 0); 
     } 

     richTextBox1.AppendText(text); 

     if (!autoscroll) 
     { 
      //restore initial selection 
      richTextBox1.SelectionStart = selection; 
      richTextBox1.SelectionLength = length; 
      //unhide selection 
      SendMessage(richTextBox1.Handle, EM_HIDESELECTION, 0, 0); 
      //restore focus to RichTextBox 
      if(focused) richTextBox1.Focus(); 
     } 
    } 
+0

あなたのソリューションは魅力的に機能します!私は、RichTextBoxがフォーマット変更を行った後にスクロールするのを防ぐため、他にも多くのアプローチを試みました。これが働いたのは唯一のものでした。それは最初は巻き込まれたようでしたが、それは働いた:) –

0

SytSのソリューションは、いくつかのテキストは、「追加」されている問題、選択がパネルの上部に移動するようなスクロールバーを移動しています。 ソリューションは、とスクロール位置を保存/復元することです:

[System.Runtime.InteropServices.DllImport("User32.dll")] 
    extern static int GetScrollPos(IntPtr hWnd, int nBar); 

    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw); 

This solutionは私のためのより完全です。

関連する問題