我基本上有一个面板,用户可以垂直滚动。当他/她点击按钮时,我想要禁用自动滚动,因此用户无法滚动(计时器会将其重新启动)。现在,我想以编程方式向下滚动,但是当autoscroll设置为false时,似乎不可能。如果Autoscroll设置为true,显然我无法使用面板的VerticalScroll.Visible和.Enabled属性。
有没有人知道解决方法? (我使用的是Windows Forms)
答案 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;
}
}
}
}