如何控制滚动条滑块大小? 自己弄了个VScrollBar,设定好Minimum与Maximum,挂接上滚动事件,能够正确地滚动页面内容了。但有一个缺点是滑动块长度太小了,因为同样页面,如果我用系统自带的滚动条,滑动块没那么小。我尝试把SmallChange值加大,但没有效果,滑动块还是那么小。有什么办法来控制滑动块大小呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 javascript做的?还是扩展windows的滚动条? reply by 阿捷 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 如果是HTML+css的好象可以用CSS来控制,如果是WINFORM的那麻烦。 问题解决,原因是: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 先前还试图用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 C# winform 定时绘制图 出现问题。 在线图片编辑JS代码!告诉我怎么做也行! comboBox显示问题 如何激活WebBrowser中打开的某个页面的javascript中的一个function 还是背包问题,请求大家帮忙. 如何在DATAGRID中客户端实现某列的动态求和? 谁会用VS2012打包Windows服务 求解 windows API 执行按钮事件 装箱,拆箱 如何使程序运行过程中适当的停顿? 超级难题,200分 树形目录菜单--可隐藏
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
如果是WINFORM的那麻烦。
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
注:以下资料与本贴最终解决方案无关!仅供参考
#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