C#workaround Autoscroll

时间:2015-08-30 10:32:06

标签: c# scroll autoscroll

我基本上有一个面板,用户可以垂直滚动。当他/她点击按钮时,我想要禁用自动滚动,因此用户无法滚动(计时器会将其重新启动)。现在,我想以编程方式向下滚动,但是当autoscroll设置为false时,似乎不可能。如果Autoscroll设置为true,显然我无法使用面板的VerticalScroll.Visible和.Enabled属性。

有没有人知道解决方法? (我使用的是Windows Forms)

1 个答案:

答案 0 :(得分:2)

禁用用户滚动但不为您的程序滚动需要手术。您必须拦截用户输入。由于操纵滚动条不会产生除滚动之外的事件,所以要做的很棘手。但是有一个后门,Windows会询问窗口的哪一部分正在被WM_NCHITTEST消息篡改。如果鼠标在垂直滚动条上,则返回HTVSCROLL,对于水平滚动条,返回HTHSCROLL。因此,当您希望滚动条无法使用时,您可以做的就是撒谎。

在项目中添加一个新类并粘贴下面显示的代码。编译。从工具箱顶部删除新控件,替换现有面板。如果要禁用用户滚动,请将AutoScrollDisabled属性设置为 true

using System;
using System.Windows.Forms;

class MyPanel : Panel {
    public bool AutoScrollDisabled { get; set; }

    protected override void WndProc(ref Message m) {
        const int WM_NCHITTEST = 0x84;
        const int HTCLIENT = 1;
        const int HTHSCROLL = 6;
        const int HTVSCROLL = 7;

        base.WndProc(ref m);
        if (m.Msg == WM_NCHITTEST && AutoScrollDisabled) {
            switch (m.Result.ToInt32()) {
                case HTHSCROLL:
                case HTVSCROLL: m.Result = new IntPtr(HTCLIENT); break;
            }
        }
    }
}