【问题标题】:Disabling scroll on condition禁用滚动条件
【发布时间】:2013-07-26 06:03:44
【问题描述】:

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

【问题讨论】:

    标签: c# winforms scroll


    【解决方案1】:

    您必须捕获发送到您的PanelWM_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);
          }
        }
    }
    

    【讨论】:

    • 谢谢。这种方法确实有效。但包括创建一个新类。有没有办法使用事件来做到这一点?
    • @SkyterX 不,要捕获消息WM_MOUSEWHEEL,您必须创建一个继承自NativeWindow 的类,正如我在代码中显示的那样。我认为这不是很不方便。所有内置事件都不能满足您的目的。
    【解决方案2】:

    我猜你必须实现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;
      }
    }
    

    【讨论】:

    • 可以在没有 KeyDown/KeyUp 事件的情况下通过 ModifierKeys 检查 ctrl 键的状态。禁用 AutoScroll 会隐藏滚动条,所以我不想使用它。
    • 好吧,也许我没有正确理解您的问题,“禁用滚动”是什么意思?如果缩放图像会发生什么?
    • 我希望滚动条在按下 ctrl 键时“冻结”,这样我就可以在不滚动的情况下调整图像大小。每次用户按 ctrl 时显示/隐藏滚动条是可怕的。
    • 您想“冻结”它们的原因是什么?从我的角度来看,当它们被冻结时,滚动条的位置将不正确,在您完成缩放或需要更新之后。
    • 好吧,我找到了一个用户控件,它几乎可以满足您的需求:codeproject.com/Articles/10096/… 包含源代码。希望这会有所帮助
    猜你喜欢
    • 2012-06-02
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2012-10-07
    • 2015-05-31
    • 2012-02-08
    • 2012-02-20
    相关资源
    最近更新 更多