SetScrollInfo APIを使用して、richtextbox(winforms)内のテキストをスクロールしています。タイマーがあり、ティックごとに1ピクセルずつスクロールする必要があります。すべてが短いテキストで完全に機能しています。長いテキストの場合、scrollメソッドは1ピクセルを超えてスクロールします。スクロールバーの限られた部分に関係していると思います。最大65536個の部品があると思いますが、間違っているかもしれません。GetScrollInfo()を呼び出した後、si.nMax=65535の場合に問題が発生します
長いテキストで1ピクセルずつスクロールする解決策はありますか?
// Scrolls a given textbox. handle: an handle to our textbox. pixels: number of pixels to scroll.
void scroll(IntPtr handle, int pixels)
{
mScrollsCounter++;
IntPtr ptrLparam = new IntPtr(0);
IntPtr ptrWparam;
// Get current scroller posion
SCROLLINFO si = new SCROLLINFO();
si.cbSize = (uint)Marshal.SizeOf(si);
si.fMask = (uint)ScrollInfoMask.SIF_ALL;
GetScrollInfo(handle, (int)ScrollBarDirection.SB_VERT, ref si);
// Increase posion by pixles
if (si.nPos < (si.nMax - si.nPage))
si.nPos += pixels;
else
{
ptrWparam = new IntPtr(SB_ENDSCROLL);
t.Enabled = false;
SendMessage(handle, WM_VSCROLL, ptrWparam, ptrLparam);
}
// Reposition scroller
SetScrollInfo(handle, (int)ScrollBarDirection.SB_VERT, ref si, true);
// Send a WM_VSCROLL scroll message using SB_THUMBTRACK as wParam
// SB_THUMBTRACK: low-order word of wParam, si.nPos high-order word of wParam
ptrWparam = new IntPtr(SB_THUMBTRACK + 0x10000 * si.nPos);
SendMessage(handle, WM_VSCROLL, ptrWparam, ptrLparam);
}
struct SCROLLINFO
{
public uint cbSize;
public uint fMask;
public int nMin;
public int nMax;
public uint nPage;
public int nPos;
public int nTrackPos;
}