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;
}
}
}
}
我基本上得到了一个面板,用户可以在其中垂直滚动。当 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;
}
}
}
}