2014-06-24 20 views
2

我有垂直滾動條的窗體,用戶可以正常滾動上下滾動,而不處理WM_MOUSEWHEEL的控件被選中,因爲窗體本身處理該事件,因此滾動工作得很好。在滾輪上滾動窗體的形式

但是,例如,當我選擇多行文本框時,我無法在鼠標滾輪上滾動我的表單,因爲WM_MOUSEWHEEL由多行文本框處理。我發現在計算器上該解決方案,它工作得很好:

public bool PreFilterMessage(ref Message m) 
{ 
    if (m.Msg == 0x020a) 
    { 
     NativeMethods.SendMessage(this.Handle, m.Msg, m.WParam, m.LParam); 
     return true; 
    } 
    return false; 
} 

internal class NativeMethods 
{ 
    [DllImport("user32.dll")] 
    public static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam); 
} 

形式向上和向下滾動的鼠標滾輪事件無論哪個子控制的重點是,但我的老闆不希望使用此解決方案,因爲他擔心它可能以某種方式在另一臺具有不同Windows的PC上崩潰。當用戶點擊表格無論如何,我會滿意,如果我可以從孩子上移除焦點控制,所以我想這:

private void MyWindowsForm_MouseDown(object sender, MouseEventArgs e) 
{ 
    this.Focus(); 
} 

它不工作,因爲焦點自動設置到窗體上的第一個孩子的控制。

我的問題是:「有什麼辦法刪除焦點從子控件當窗體上用戶點擊,所以我可以使用鼠標滾輪滾動正常我的形式?」

希望你能理解我想要做的事情。提前致謝!

+1

您的代碼不會崩潰。但您也可以傳遞輪子信息:'textBox1.MouseWheel + =(sender,e)=> {base.OnMouseWheel(e); };' – LarsTech

+0

@LarsTech此解決方案也可以工作!非常感謝! :D – msmolcic

回答

1

根據這裏發佈的建議How to remove the focus from a TextBox in WinForms?,你可以使用一些小技巧來達到這個效果。只需將焦點設置爲表單中的Label控件。 Label控件看起來是相同的,不管它是否被聚焦,所以它看起來不是聚焦在任何地方。該控件必須是可見的,但是,如果您的表單上沒有任何標籤,則可以添加一個空值爲Text的值。這將使Form顯示好像沒有設置焦點。

編輯

正如在註釋中,着眼於一個特定的控制使Form被自動滾動以使該控制進入視野,其未在此情況下所希望的。但是,您可以使用Panel控件(假設它的NamemyPanel),並將Dock屬性設置爲Fill(以便它覆蓋整個表單),將AutoScroll設置爲true並將其中的所有控件置於其中。然後,爲了從任何控件中刪除焦點,您可以編寫myPanel.Focus()以將焦點設置爲Panel本身。我已經很快測試過了,它似乎按預期工作。

+0

謝謝盧卡斯,小組做了訣竅.. :) – msmolcic