控制带有滚动条的控件(ListView,TreeView等)的滚动条显示

这是一个小小的组件,实现控制带有滚动条的控件(ListViewTreeView)的滚动条显示。

    带有滚动条的控件,通常情况下都是需要显示滚动条的时候,如果水平滚动条和垂直滚动条都需要显示,就一起显示出来。但是有的时候我们只想让其只显示一条滚动条,例如只显示垂直滚动条,我们应该怎么办呢?

下面是一种可选方案:
 

    /// <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/ 

posted @ 2011-10-21 09:56  把爱延续  阅读(2946)  评论(1编辑  收藏  举报