自己弄了个VScrollBar,设定好Minimum与Maximum,挂接上滚动事件,能够正确地滚动页面内容了。但有一个缺点是滑动块长度太小了,因为同样页面,如果我用系统自带的滚动条,滑动块没那么小。我尝试把SmallChange值加大,但没有效果,滑动块还是那么小。有什么办法来控制滑动块大小呢?

解决方案 »

  1.   

    javascript做的?还是扩展windows的滚动条?   

  2.   

    winform 我通过IDocHostUIHandler取消了webbroser的滚动条,然后再手动给其添加(这样我可以把滚动条放在其它位置),目前问题就是滑动块太小了。
    VScrollBar hsb = new VScrollBar();
    void Form1_load()
    {
                hsb.Width = 16;
                hsb.Height = this.panel4.Height;
                hsb.Dock = DockStyle.Right;
                hsb.SmallChange = 10;
                this.panel4.Controls.Add(hsb);
                hsb.Scroll += new ScrollEventHandler(hsb_Scroll);
                hsb.Visible = false;
    }        private void extendWebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                if (this.extendWebBrowser1.ReadyState == WebBrowserReadyState.Complete || this.extendWebBrowser1.ReadyState == WebBrowserReadyState.Interactive)
                {
                    if (this.extendWebBrowser1.Document.Body.ScrollRectangle.Height > this.panel4.Height)
                    {
                        hsb.Minimum = 0;
                        hsb.Maximum = this.extendWebBrowser1.Document.Body.ScrollRectangle.Height - this.panel4.Height;
                        hsb.Show();
                    }
                    else
                    {
                        hsb.Hide();
                    }
                }
            }//end fun        void hsb_Scroll(object sender, ScrollEventArgs e)
            {
                this.extendWebBrowser1.Document.Window.ScrollTo(new Point(0, hsb.Value));
            }//end fun
      

  3.   

    如果是HTML+css的好象可以用CSS来控制,
    如果是WINFORM的那麻烦。
      

  4.   

    问题解决,原因是:
    hsb.Maximum = this.extendWebBrowser1.Document.Body.ScrollRectangle.Height - this.panel4.Height;
    这个值没设置好,太大了,这么改一下效果就好了:        private void extendWebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                if (this.extendWebBrowser1.ReadyState == WebBrowserReadyState.Complete || this.extendWebBrowser1.ReadyState == WebBrowserReadyState.Interactive)
                {
                    
                    if (this.extendWebBrowser1.Document.Body.ScrollRectangle.Height > this.panel4.Height)
                    {
                        hsb.Minimum = 0;
                        hsb.Maximum = (this.extendWebBrowser1.Document.Body.ScrollRectangle.Height - this.panel4.Height)/32 ;                    hsb.Show();
                    }
                    else
                    {
                        hsb.Hide();
                    }
                }
            }//end fun        void hsb_Scroll(object sender, ScrollEventArgs e)
            {
                this.extendWebBrowser1.Document.Window.ScrollTo(new Point(0, hsb.Value * 32));
            }//end fun
      

  5.   

    先前还试图用API解决问题,现在不需要了。不过还是把收集到的API资料贴上来,以便大家分享。

    注:以下资料与本贴最终解决方案无关!仅供参考

            #region 滚动条设置API
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
            public struct SCROLLINFO
            {
                public uint cbSize;
                public uint fMask;
                public int nMin;
                public int nMax;
                public uint nPage;
                public int nPos;
                public int nTrackPos;
            }
            public enum ScrollBarInfoFlags
            {
                SIF_RANGE = 0x0001,
                SIF_PAGE = 0x0002,
                SIF_POS = 0x0004,
                SIF_DISABLENOSCROLL = 0x0008,
                SIF_TRACKPOS = 0x0010,
                SIF_ALL = (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS)
            }
            public enum ScrollBarRequests
            {
                SB_LINEUP = 0,
                SB_LINELEFT = 0,
                SB_LINEDOWN = 1,
                SB_LINERIGHT = 1,
                SB_PAGEUP = 2,
                SB_PAGELEFT = 2,
                SB_PAGEDOWN = 3,
                SB_PAGERIGHT = 3,
                SB_THUMBPOSITION = 4,
                SB_THUMBTRACK = 5,
                SB_TOP = 6,
                SB_LEFT = 6,
                SB_BOTTOM = 7,
                SB_RIGHT = 7,
                SB_ENDSCROLL = 8
            }        private const int SB_HORZ = 0;
            private const int SB_VERT = 1;
            private const int SB_CTL = 2;
            private const int SB_BOTH = 3;        [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern int GetScrollInfo(IntPtr hwnd, int bar, ref SCROLLINFO si);
            [DllImport("user32")]
            public static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool Rush);
            [DllImport("user32.dll")]
            static extern int SetScrollInfo(IntPtr hwnd, int fnBar, [In] ref SCROLLINFO lpsi, bool fRedraw);
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
            #endregion