C# 解决方法自动滚动

C# workaround Autoscroll

我基本上得到了一个面板,用户可以在其中垂直滚动。当 s/he 单击按钮时,我想禁用自动滚动,这样用户就不能滚动(计时器可以使它返回)。现在,我想以编程方式向下滚动,但将自动滚动设置为 false,这似乎是不可能的。如果 Autoscroll 设置为 true,显然我不能乱用面板的 VerticalScroll.Visible 和 .Enabled 属性.

有人知道解决方法吗? (我正在使用 Windows 表格)

为用户禁用滚动而不是为您的程序禁用滚动需要手术。您必须拦截用户输入。做起来很棘手,因为操纵滚动条不会生成 Scroll 以外的事件。但是有一个后门,Windows 通过 WM_NCHITTEST 消息询问 window 的哪一部分被鼠标移动。即returnsHTVSCROLL如果鼠标在垂直滚动条上,HTHSCROLL为水平滚动条。所以当你想让滚动条无法使用时,你可以做的就是撒谎。

向您的项目添加一个新的 class 并粘贴如下所示的代码。编译。从工具箱顶部放下新控件,替换现有面板。当您希望禁用用户滚动时,将 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;
            }
        }
    }
}