1

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;
        }
4

1 に答える 1

0

エンコードされたピクセル数(おそらくパラメーターとして関数にWM_VSCROLL渡されている)を使用する代わりに、構造体のメンバーを使用します。scroll()pixelsnTrackPosSCROLLINFO

于 2012-12-20T18:58:11.753 に答える