不论是主菜单还是右键快捷菜单,打开后,只要你不选择菜单项,同时焦点也不转移,那么这个菜单就一直不关闭,怎样才能做到鼠标移出菜单,菜单就自动关闭呢?或怎样判断鼠标是否已经移出菜单?
谢谢!

解决方案 »

  1.   

    如果不需要太精确,可以用个Timer
      

  2.   

    请zephyr007(道可道)大哥说得详细一点,多谢
      

  3.   

    WM_MENUSELECT
    The WM_MENUSELECT message is sent to a menu's owner window when the user selects a menu item. WM_MENUSELECT 
    uItem = (UINT) LOWORD(wParam);   // menu item or submenu index 
    fuFlags = (UINT) HIWORD(wParam); // menu flags 
    hmenu = (HMENU) lParam;          // handle to menu clicked 
     
    Parameters
    uItem 
    Value of the low-order word of wParam. If the selected item is a command item, this parameter contains the identifier of the menu item. If the selected item opens a drop-down menu or submenu, this parameter contains the menu index of the drop-down menu or submenu in the main menu, and the hMenu parameter then contains the handle to the main (clicked) menu; use the GetSubMenu function to get the menu handle to the drop-down menu or submenu. 
    fuFlags 
    Value of the high-order word of wParam. Specifies one or more menu flags. This parameter can be a combination of the following values: Value Description 
    MF_BITMAP Item displays a bitmap. 
    MF_CHECKED Item is checked. 
    MF_DISABLED Item is disabled. 
    MF_GRAYED Item is grayed. 
    MF_HILITE Item is highlighted. 
    MF_MOUSESELECT Item is selected with the mouse. 
    MF_OWNERDRAW Item is an owner-drawn item. 
    MF_POPUP Item opens a drop-down menu or submenu. 
    MF_SYSMENU Item is contained in the window menu (also known as the System menu or Control menu). The hmenu parameter identifies the window menu associated with the message. 
    hmenu 
    Value of lParam. Handle to the menu that was clicked. 
    Return Values
    If an application processes this message, it should return zero. Res
    If the fuFlags parameter contains 0xFFFF and the hmenu parameter contains NULL, the system has closed the menu. Do not use the value –1 for fuFlags. That is because fuFlags is specified as (UINT) HIWORD(wParam). If HIWORD(wParam) were 0xFFFF, fuFlags (because of the UINT cast) would be 0x0000FFFF, not –1. QuickInfo
      Windows NT: Requires version 3.1 or later.
      Windows: Requires Windows 95 or later.
      Windows CE: Unsupported.
      Header: Declared in winuser.h.See Also
    Keyboard Accelerators Overview, Keyboard Accelerator Messages, GetSubMenu  
      

  4.   

    GetMenuItemRect(),一个一个加起来就可以得到菜单的大小。
      

  5.   

    void CTestDlg::OnEnterIdle(UINT nWhy, CWnd* pWho) 
    {
    CDialog::OnEnterIdle(nWhy, pWho);

    // TODO: Add your message handler code here
    if (nWhy==MSGF_MENU) 
    {
    CPoint pt;
    GetCursorPos(&pt); if (pWho->m_hWnd != ::WindowFromPoint(pt))
    {
    隐藏菜单
    }
    }
    }
      

  6.   

    void CMyWnd::OnEnterIdle(UINT nWhy, CWnd* pWho) 
    {
                      CWnd::OnEnterIdle(nWhy, pWho);
     
                      // TODO: Add your message handler code here
                      if (nWhy == MSGF_MENU)
                      {
                      }
      

  7.   

    syy64(太平洋)大哥,多谢你的回答。可是WM_MENUSELECT消息无法判断出鼠标是否移出菜单啊。
    tufaqing()大哥,GetMenuItemRect这个函数我也用过了,但有两个问题不好解决,一是大家如果仔细观察的话应该能看到,标准菜单是有点边框的,这个边框的宽度我找不到标准的说法,比如:GetSystemMetrics(SM_CXBORDER)是窗口边框的宽度,可菜单呢?我没有查到标准的依据。二是如果出现子菜单,子菜单是要盖住上级菜单一部分的,而这到底怎么计算也是个问题。所以,这确实不是个很容易的问题,麻烦各位大哥再帮忙想想,多谢!
      

  8.   

    ln_changcheng,goodboyws:
    两位大哥,你们试验过你们的代码吗?好像不行啊。