【发布时间】:2013-07-26 06:03:44
【问题描述】:
我有一个SplitPanel,里面有图片。我设置了面板的自动滚动,所以如果图片不适合面板,用户可以使用鼠标滚动。现在我想通过 ctrl+scroll 来缩放图像。可以通过面板的 MouseWheel 事件来完成。问题是:按下 ctrl 时如何禁止滚动?我尝试使用HandledMouseEventArgs.Handled,但它似乎不起作用。
【问题讨论】:
我有一个SplitPanel,里面有图片。我设置了面板的自动滚动,所以如果图片不适合面板,用户可以使用鼠标滚动。现在我想通过 ctrl+scroll 来缩放图像。可以通过面板的 MouseWheel 事件来完成。问题是:按下 ctrl 时如何禁止滚动?我尝试使用HandledMouseEventArgs.Handled,但它似乎不起作用。
【问题讨论】:
您必须捕获发送到您的Panel 的WM_MOUSEWHEEL 消息:
public class CustomPanel : Panel {
public bool ScrollDisabled { get;set;}
protected override void WndProc(ref Message m){
if(m.Msg == 0x20a && ScrollDisabled) return; //WM_MOUSEWHEEL = 0x20a
//if(m.Msg == 0x20a && ModifierKeys == Keys.Control) return; <--- or do this directly.
base.WndProc(ref m);
}
}
我忘记了您的面板停靠在您的SplitContainer 中,无法将其分配给新实例。所以这里是解决方案:
public class Form1 : Form {
public Form1(){
InitializeComponent();
//Suppose you want to disable scroll in Panel1 of your SplitContainer when Control key is pressed
new PanelWndProc().AssignHandle(splitContainer1.Panel1.Handle);
}
public class PanelWndProc : NativeWindow
{
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x20a && Control.ModifierKeys == Keys.Control) return;
base.WndProc(ref m);
}
}
}
【讨论】:
WM_MOUSEWHEEL,您必须创建一个继承自NativeWindow 的类,正如我在代码中显示的那样。我认为这不是很不方便。所有内置事件都不能满足您的目的。
我猜你必须实现KeyDown 以及KeyUp 事件并检查CTRL 是否已被按下/释放。
一旦你有了它,你就可以在你的拆分面板上禁用Autoscroll 属性
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control)
{
splitpanel.AutoScroll = false;
}
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if (e.Control)
{
splitpanel.AutoScroll = true;
}
}
【讨论】:
ModifierKeys 检查 ctrl 键的状态。禁用 AutoScroll 会隐藏滚动条,所以我不想使用它。