2013年12月18日

RichTextBox を下までスクロール さらに続き

前回 の方法では WordWrap による改行が考慮されていなかったので、それを考慮したコードを書いた。ついでに、SendMessage の引数を IntPtr にした。IntPtr ってどう読むんだろう。コードを短くするために、this. を省略している。rtb が RichTextBox のインスタンス。ScrollBars が Vertical と ForcedVertical で動作することを確認した。

[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

private void ScrollToBottomRichTextBox()
{
    const uint EM_SETSCROLLPOS = 0x04DE;
    int[] pos = new int[2];
    int lineHeight = rtb.GetPositionFromCharIndex(rtb.GetFirstCharIndexFromLine(1)).Y - rtb.GetPositionFromCharIndex(rtb.GetFirstCharIndexFromLine(0)).Y;
    pos[1] = (rtb.GetLineFromCharIndex(rtb.TextLength) + 1) * lineHeight - rtb.ClientSize.Height;
    // BorderStyle が None 以外だと、1 ずれる
    if (rtb.BorderStyle != BorderStyle.None)
    {
        ++pos[1];
    }
    if (pos[1] > 0)
    {
        IntPtr iPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(int)) * pos.Length);
        Marshal.Copy(pos, 0, iPtr, pos.Length);
        SendMessage(rtb.Handle, EM_SETSCROLLPOS, IntPtr.Zero, iPtr);
    }
}

ScrollToCaret でも、AppendText でも、スクロールする位置が少しずれるので、このメソッドを書いたのだけど、これが自分の環境だけだったら嫌だなあ。

posted by Takenoko at 21:57| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック