使用SetScrollInfo API滚动

本文关键字:滚动 API SetScrollInfo 使用 | 更新日期: 2023-09-27 17:49:15

我使用SetScrollInfo API来滚动文本在我的richtextbox(winforms)。我有一个计时器,每一个刻度我需要滚动一个像素。在较短的文本中,一切都工作得很好。对于较长的文本,scroll方法将滚动超过1个像素。我认为这与滚动条的有限部分有关。我猜最多有65536个零件,但也许我错了。问题发生时,si。调用GetScrollInfo()后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;
        }

使用SetScrollInfo API滚动

不是使用WM_VSCROLL中编码的像素数(您可能将其作为pixels参数传递给scroll()函数),而是使用SCROLLINFO结构的nTrackPos成员。