winfrom api发送消息,实现滚动效果(重绘滚动条用)

  #region 调用系统方法,是容器内的所有控件随滚动条移动
        private void SetControlsScroll(int horizontalvalue,int verticalvalue)
        {
            var flags = BindingFlags.NonPublic | BindingFlags.Instance;
            var field = typeof(ScrollableControl).GetField("displayRect", flags);
            var rect = (Rectangle)field.GetValue(this);

            Rectangle cr = this.ClientRectangle;
            RECT rcClip = RECT.FromXYWH(cr.X, cr.Y, cr.Width, cr.Height);
            RECT rcUpdate = RECT.FromXYWH(cr.X, cr.Y, cr.Width, cr.Height);
            var xDelta = -horizontalValue - rect.X;
            var yDelta = -verticalvalue - rect.Y;
            //var yDelta = -rect.Y;
            rect.X = -horizontalValue;
           rect.Y = -verticalvalue;
           //rect.Y = 0;
            field.SetValue(this, rect);

            int SW_SCROLLCHILDREN = 0x0001;
            int SW_INVALIDATE = 0x0002;
            int SW_ERASE = 0x0004;

            ScrollWindowEx(new HandleRef(this, Handle), xDelta, yDelta,
                                             null,
                                             ref rcClip,
                                             new HandleRef(),
                                             ref rcUpdate,
                                             SW_INVALIDATE
                                             | SW_ERASE
                                             | SW_SCROLLCHILDREN);
        }
        #endregion

相关资料:
http://msdn.microsoft.com/zh-cn/library/dwbfte93.aspx

 

posted @ 2014-02-20 14:31  青田  阅读(1019)  评论(0编辑  收藏  举报