5

アプリケーション ログの表示に RichTextBox コントロールを使用しています。RichTextBox::AppendText メソッドを数回呼び出して、1 秒に 1 回コントロールを更新しています。私にとって本当に厄介なのは、カーソルがテキストの最後の行までスクロールし続けることです。ユーザーが最初にあるログを分析する必要がある状況では、非常に不快です。私は私の問題に対して次の解決策を試しました:

int pos = tb_logs.SelectionStart;
tb_logs.AppendText("log message");
tb_logs.SelectionStart = pos;

コントロールが定期的に再描画されて非常に気を散らすため、これは問題の核心には行きません。よりクリーンなソリューションはありますか?

4

2 に答える 2

7

ログテキストを追加するときに「垂直スクロール」が下にスクロールすることに問題があるが、常に一番上に表示したい場合:

VScroll、TextChanged イベントにイベント ハンドラーを追加し、イベント ハンドラーでスクロールを上に設定する必要があります。

richTextBox1.VScroll += HandleRichTextBoxAdjustScroll;
richTextBox1.TextChanged += HandleRichTextBoxAdjustScroll;

private const UInt32 SB_TOP = 0x6;
private const UInt32 WM_VSCROLL = 0x115;

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
private static extern bool PostMessage(IntPtr hWnd, UInt32 Msg,
    IntPtr wParam, IntPtr lParam);

private void HandleRichTextBoxAdjustScroll(Object sender,
    EventArgs e)
{
    PostMessage(handle, WM_VSCROLL, (IntPtr)SB_TOP, IntPtr.Zero);
}

水平スクロールバーでも同じことができます。WM_VSCROLL を WM_HSCROLL に、SB_TOP を SB_LEFT に置き換えます。

private const UInt32 WM_HSCROLL = 0x0114;
private const UInt32 SB_LEFT = 0x06;
于 2011-02-07T10:48:20.793 に答える
0

tb_logs.SelectionLength = 1; を試すことができます。SelectionStart とともに。これにより、現在の位置から選択された 1 つの文字が作成されます。

試していません...しかし、うまくいくかもしれません

于 2011-02-07T11:30:26.017 に答える