2013-03-02 4 views
1

У меня есть менюStrip с несколькими элементами и кнопка в другой части формы. Когда мышь вводит кнопку, она делает что-то (событие MouseEnter). Проблема, которую я получаю, заключается в том, что при открытии menustrip, если мышь входит в эту кнопку, событие MouseEnter не запускается. Есть ли способ стрелять, когда открывается menustrip?Событие MouseEnter не срабатывает, когда открывается menustrip

Чтобы увидеть это графически, это то, что I'm делать:

enter image description here

У меня есть MenuStrip, и для каждого пункта меню родительского, есть кнопка. Кнопка будет над ним, поэтому единственной видимой частью menustrip будет контейнер со своими дочерними элементами.

Теперь, когда мышь вводит кнопку, например «Система», она выполняет щелчок в пункте меню. Вот почему контейнер появляется. Но как только откроется, если я хочу открыть любой другой контейнер других родителей, я должен щелкнуть сначала, чтобы потерять фокус. Тогда я хочу добиться этого, не нажимая.

Поведение, которое я хочу, похоже на тот, что есть у menustrip. Например, если система открыта и мышь входит в Клиенты, она автоматически закрывает Систему и открывает Клиенты.

enter image description here

+0

, какой тип пожара вы хотите как that..key пресс, функциональной клавиши и так ???????? ???? –

+0

Как будет срабатывать событие, когда ваш персонаж находится в фокусе ??? Вы можете сфокусировать один элемент управления одновременно. – Shaharyar

+0

просто выберите menuStrip и нажмите функциональную клавишу f4 ... откройте диалоговое окно свойств ... перейдите к событию и выберите любой тип, который вы хотите ....... –

ответ

0

Давайте посмотрим, если это правильный ответ:

#region IMessageFilter implementation 
/// <summary> Redirect WM_MouseWheel messages to window under mouse.</summary> 
    /// <remarks>Redirect WM_MouseWheel messages to window under mouse (rather than 
/// that with focus) with adjusted delta. 
/// <see cref="http://www.flounder.com/virtual_screen_coordinates.htm"/> 
/// Dont forget to add this to constructor: 
///    Application.AddMessageFilter(this); 
///</remarks> 
    /// <param name="m">The Windows Message to filter and/or process.</param> 
    /// <returns>Success (true) or failure (false) to OS.</returns> 
    [System.Security.Permissions.PermissionSetAttribute(
     System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")] 
    bool IMessageFilter.PreFilterMessage(ref Message m) { 
     // Determine window and control at these coordinates. 
    //var pos = WindowsMouseInput.GetPointLParam(m.LParam); 
     var hWnd = WindowFromPoint(WindowsMouseInput.GetPointLParam(m.LParam)); 
     var ctl = Control.FromHandle(hWnd); 
    if (hWnd != IntPtr.Zero && hWnd != m.HWnd && ctl != null) { 
    switch(m.Msg) { 
     default: return false; 
     case (int)WM.MOUSEWHEEL: 
     DebugTracing.Trace(TraceFlag.ScrollEvents, true," - {0}.WM.MouseWheel: {1}", 
                Host.Name, ((WM)m.Msg).ToString()); 
     if (ctl is MapPanel) { 
      var keyState = WindowsMouseInput.GetKeyStateWParam(m.WParam); 
      var mult   = keyState.HasFlag(MouseKeys.Control) ? 5 : 1; 
      keyState   = keyState &= ~MouseKeys.Control; 
      var wheelDelta = WindowsMouseInput.WheelDelta(m.WParam); 
      // forward delta of +/- 30 instead of +/- 120; 30/120 == 1/4 
      var newWparam = WindowsMouseInput.WParam((Int16)(mult*wheelDelta/4), keyState); 
      SendMessage(hWnd, m.Msg, newWparam, m.LParam); 
      return true; 
     } else if (ctl is MapFormOverview) { 
      var keyState = WindowsMouseInput.GetKeyStateWParam(m.WParam); 
      var wheelDelta = WindowsMouseInput.WheelDelta(m.WParam); 
      // forward delta of +/- 54 instead of +/- 120 
      // 54 = 3 * 18 (default point height in pixels?); 54/120 == 9/20 
      var newWparam = WindowsMouseInput.WParam((Int16)(wheelDelta*9/20), keyState); 
      SendMessage(hWnd, m.Msg, newWparam, m.LParam); 
      return true; 
     } 
     break; 
    } 
    } 
    return false; 
    } 
#region Extern declarations 
/// <summary>P/Invoke declaration for user32.dll.WindowFromPoint</summary> 
    /// <remarks><see cref="http://msdn.microsoft.com/en-us/library/windows/desktop/ms633558(v=vs.85).aspx"/></remarks> 
    /// <param name="pt">(Sign-extended) screen coordinates as a Point structure.</param> 
    /// <returns>Window handle (hWnd).</returns> 
    [DllImport("user32.dll")] 
    private static extern IntPtr WindowFromPoint(Point pt); 
    /// <summary>P/Invoke declaration for user32.dll.SendMessage</summary> 
    /// <param name="hWnd">Window handle</param> 
    /// <param name="msg">Windows message</param> 
    /// <param name="wp">WParam</param> 
    /// <param name="lp">LParam</param> 
    /// <returns></returns> 
    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); 
#endregion 
#endregion 
+0

Это ответ на * что-то *, только не на этот вопрос. –

+0

@ Ханс: ОП попросил пример использования IMessageFilter. У меня было это под рукой. –

+0

Да, правда в том, что я, наконец, реализовал меню по-другому. Но спасибо в любом случае :) – Andres

 Смежные вопросы

  • Нет связанных вопросов^_^