C# 使用SetScrolInfo API进行滚动

C# 使用SetScrolInfo API进行滚动,c#,winforms,winapi,richtextbox,C#,Winforms,Winapi,Richtextbox,我正在使用SetScrolInfo API在我的richtextbox(winforms)中滚动文本。我有一个计时器,每个刻度需要滚动一个像素。 在较短的文本上,一切都很顺利。对于较长的文本,滚动方法滚动超过1个像素。我认为这与滚动条的有限部分有关。我想最多有65536个零件,但也许我错了。 调用GetScrollInfo()后,当si.nMax=65535时出现问题 在较长的文本上是否有滚动一个像素的解决方案 // Scrolls a given textbox. handle: an han

我正在使用SetScrolInfo API在我的richtextbox(winforms)中滚动文本。我有一个计时器,每个刻度需要滚动一个像素。 在较短的文本上,一切都很顺利。对于较长的文本,滚动方法滚动超过1个像素。我认为这与滚动条的有限部分有关。我想最多有65536个零件,但也许我错了。 调用GetScrollInfo()后,当si.nMax=65535时出现问题

在较长的文本上是否有滚动一个像素的解决方案

// 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;
        }
//滚动给定的文本框。句柄:文本框的句柄。像素:要滚动的像素数。
无效滚动(IntPtr句柄,整数像素)
{
MSCROLLSCONTER++;
IntPtr ptrLparam=新的IntPtr(0);
IntPtr-ptrWparam;
//获取当前滚动条位置
SCROLLINFO si=新的SCROLLINFO();
si.cbSize=(uint)Marshal.SizeOf(si);
si.fMask=(uint)ScrollInfoMask.SIF_ALL;
GetScrollInfo(句柄,(int)ScrollBarDirection.SB_垂直,参考si);
//用皮克斯增加位置
如果(si.nPos<(si.nMax-si.nPage))
si.nPos+=像素;
其他的
{
ptrWparam=新的IntPtr(SB_ENDSCROLL);
t、 启用=错误;
SendMessage(handle、WM_VSCROLL、ptrWparam、ptrLparam);
}
//重新定位滚动条
SetScrolInfo(句柄,(int)ScrollBarDirection.SB_VERT,参考si,真);
//使用SB_THUMBTRACK作为wParam发送WM_VSCROLL滚动消息
//SB_THUMBTRACK:wParam的低阶字,si.nPos wParam的高阶字
ptrWparam=新的IntPtr(SB_THUMBTRACK+0x10000*si.nPos);
SendMessage(handle、WM_VSCROLL、ptrWparam、ptrLparam);
} 
结构滚动信息
{
公共单位cbSize;
公共单位任务;
公共国际信息网;
公共int nMax;
公共单位网页;
公共非营利组织;
公共int nTrackPos;
}

使用
SCROLLINFO
结构的
nTrackPos
成员,而不是使用
WM\u VSCROLL
中编码的像素数(您可能将其作为
pixels
参数传递给
scroll()
函数)。滚动位置编码为wparam的hi字。16位值。这不可避免地意味着它不能超过65535。有没有办法检测在这种情况下滚动了多少像素?