2013-07-26 141 views
0

我有一個SplitPanel裏面的圖像。我設置面板的AutoScroll,因此如果圖片不適合面板,用戶可以使用鼠標滾動。現在我想按ctrl + scroll縮放圖像。它可以通過面板的MouseWheel事件完成。問題是:如何禁止按下ctrl時滾動?我嘗試使用HandledMouseEventArgs.Handled,但它似乎不工作。禁用滾動條件

回答

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); 
     } 
    } 
} 
+0

謝謝。這種方法確實有效。但包括創建一個新班級。有沒有辦法使用事件做到這一點? – SkyterX

+0

@SkyterX不,要捕獲WM_MOUSEWHEEL消息,就必須創建一個繼承自NativeWindow的類,如我在代碼中所示。我覺得這不是很不方便。所有內置事件都不適合您的目的。 –

0

我想你將不得不實施KeyDown以及KeyUp事件,並檢查是否已按下/釋放CTRL

一旦你有,你可以在你的splitpanel禁用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; 
    } 
} 
+0

通過'ModifierKeys'可以檢查沒有KeyDown/KeyUp事件的ctrl鍵狀態。禁用AutoScroll隱藏滾動條,所以我不想使用它。 – SkyterX

+0

嗯,也許我沒有正確地得到你的問題,你是什麼意思與「禁用滾動」?如果縮放圖像會發生什麼情況? – derape

+0

我想在按住Ctrl鍵的同時滾動條以「凍結」,所以我可以在不滾動它的情況下調整圖像大小。每當用戶按下ctrl時顯示/隱藏滾動條是可怕的。 – SkyterX