0

我有一个带有图像的 SplitPanel。我设置了面板的自动滚动,所以如果图片不适合面板,用户可以使用鼠标滚动。现在我想通过 ctrl+scroll 来缩放图像。可以通过面板的 MouseWheel 事件来完成。问题是:按下 ctrl 时如何禁止滚动?我尝试使用HandledMouseEventArgs.Handled,但它似乎不起作用。

4

2 回答 2

2

您必须捕获WM_MOUSEWHEEL发送到您的消息Panel

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);
      }
    }
}
于 2013-07-26T08:01:52.827 回答
0

我想你必须实现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;
  }
}
于 2013-07-26T06:06:35.093 回答