控制带有滚动条的控件(ListView,TreeView等)的滚动条显示
这是一个小小的组件,实现控制带有滚动条的控件(ListView,TreeView等)的滚动条显示。
带有滚动条的控件,通常情况下都是需要显示滚动条的时候,如果水平滚动条和垂直滚动条都需要显示,就一起显示出来。但是有的时候我们只想让其只显示一条滚动条,例如只显示垂直滚动条,我们应该怎么办呢?
下面是一种可选方案:
/// <summary>
/// 作者:Starts_2000
/// 日期:2009-07-14
/// 网站:http://www.csharpwin.com CS 程序员之窗。
/// 你可以免费使用或修改以下代码,但请保留以上版权信息。
/// 具体请查看 CS程序员之窗开源协议(http://www.csharpwin.com/csol.html)。
/// 功能:控制有滚动条的控件的滚动条是否显示。
/// </summary>
public class ScrollBarManager : NativeWindow, IDisposable
{
private Control _owner;
private SB _scrollBar;
private const int GWL_STYLE = -16;
private const int WS_HSCROLL = 0x00100000;
private const int WS_VSCROLL = 0x00200000;
public ScrollBarManager(Control owner, SB scrollBar)
{
if (owner == null)
{
throw new ArgumentNullException("owner");
}
base.AssignHandle(owner.Handle);
_owner = owner;
_scrollBar = scrollBar;
}
[DllImport("user32.dll")]
private static extern int ShowScrollBar(IntPtr hWnd, int iBar, int bShow);
[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr hwnd, int nIndex);
protected override void WndProc(ref Message m)
{
HideScrollBar(ref m);
base.WndProc(ref m);
}
private void HideScrollBar(ref Message m)
{
int dwStyle = GetWindowLong(base.Handle, GWL_STYLE);
switch (_scrollBar)
{
case SB.SB_HORZ:
if ((dwStyle & WS_HSCROLL) == WS_HSCROLL)
{
ShowScrollBar(base.Handle, (int)_scrollBar, 0);
}
break;
case SB.SB_VERT:
if ((dwStyle & WS_VSCROLL) == WS_VSCROLL)
{
ShowScrollBar(base.Handle, (int)_scrollBar, 0);
}
break;
}
}
#region IDisposable 成员
public void Dispose()
{
base.ReleaseHandle();
_owner = null;
}
#endregion
}
/// <summary>
/// 作者:Starts_2000
/// 日期:2009-07-14
/// 网站:http://www.csharpwin.com CS 程序员之窗。
/// 你可以免费使用或修改以下代码,但请保留以上版权信息。
/// 具体请查看 CS程序员之窗开源协议(http://www.csharpwin.com/csol.html)。
/// </summary>
public enum SB
{
/// <summary>
/// 水平滚动条。
/// </summary>
SB_HORZ = 0,
/// <summary>
/// 垂直滚动条。
/// </summary>
SB_VERT = 1,
}
源及源码下载地址:http://eran.555ip.com/Information/0/330/