我已经将弹出菜单的CRect置零了,
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this,NULL);
但还是弹出后,点菜单以外不隐藏,请教高手怎么办

解决方案 »

  1.   

    在对话框里的按钮单击弹出也是用这句,但当点别处时就隐藏,工作正常;
    问题是现在在托盘点击后就不隐藏,具体的托盘右键响应代码如下:
    case WM_RBUTTONUP:
       GetCursorPos(lpoint);//得到鼠标位置 
        menu.LoadMenu(IDR_MENU2);
       pSubMenu=menu.GetSubMenu(0); 
       pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this,NULL);
       //menu.DestroyMenu();
       break;
      

  2.   

    pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this,NULL);
    ==================
    你这段代码是写在什么地方的?也就是说this指向哪个类的?
      

  3.   

    CWnd*pWndPopupOwner = this;
    while (pWndPopupOwner->GetStyle() & WS_CHILD)
    pWndPopupOwner = pWndPopupOwner->GetParent();
    pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,pWndPopupOwner ,NULL);
      

  4.   

    呵呵~之前我也遇到过,给你一段代码参考一下:
    case WM_RBUTTONUP:
    {   
    POINT point;
    ::GetCursorPos(&point);
    CMenu menu;
    menu.CreatePopupMenu();
    menu.AppendMenu(MF_STRING, ID_CONFIG, _T("配置"));
    menu.AppendMenu(MF_STRING, ID_ABOUT, _T("关于中心服务器"));
    menu.AppendMenu(MF_SEPARATOR, 0, _T(""));
    menu.AppendMenu(MF_STRING, ID_CLOSE, _T("退出"));
    menu.SetDefaultItem(ID_CONFIG);
    SetForegroundWindow(); //加上这一句就可以了
    menu.TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
    menu.Detach();
    menu.DestroyMenu();
    }
    break;
      

  5.   


    case WM_RBUTTONUP:
    {   
    POINT point;
    ::GetCursorPos(&point);
    CMenu menu;
    menu.CreatePopupMenu();
    menu.AppendMenu(MF_STRING, ID_CONFIG, _T("配置"));
    menu.AppendMenu(MF_STRING, ID_ABOUT, _T("关于VStar中心服务器"));
    menu.AppendMenu(MF_SEPARATOR, 0, _T(""));
    menu.AppendMenu(MF_STRING, ID_CLOSE, _T("退出"));
    menu.SetDefaultItem(ID_CONFIG);
    SetForegroundWindow(); //加上这一句就可以了
    menu.TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
    menu.Detach();
    menu.DestroyMenu();
    }
    break;
      

  6.   

    LRESULT CuiDlg::forTray(WPARAM wParam,LPARAM lParam) 
    //wParam接收的是图标的ID,而lParam接收的是鼠标的行为 

         if(wParam!=IDR_MAINFRAME)
     return 1;
     NOTIFYICONDATA nid; 
     nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); 
         nid.hWnd=this->m_hWnd; 
         nid.uID=IDR_MAINFRAME; 
     CMenu menu,*pSubMenu; 
     long nSelection;
     LPPOINT lpoint=new tagPOINT; 
     if(!trayStart){
      switch( lParam){
          case WM_RBUTTONUP:
     GetCursorPos(lpoint);//得到鼠标位置 
                 menu.LoadMenu(IDR_MENU2);
         pSubMenu=menu.GetSubMenu(0); 
         pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this,NULL);
     SetForegroundWindow(); 
                 menu.Detach();
                menu.DestroyMenu();
                 break;
         case WM_LBUTTONDOWN:
                 ShowWindow(SW_SHOW);
         cur->ShowWindow(SW_SHOW);
                 Shell_NotifyIcon(NIM_DELETE,&nid);
         break;
      }
      }
     delete lpoint;
     return 0; 
    }
    这是对话框响应托盘消息的回调函数,
    刚才加了SetForegroundWindow(); 还是不能自动消失,
    而且点开别的托盘程序的右键弹出菜单也无法自动消失
      

  7.   

    你把SetForegroundWindow()这句放到pSubMenu->TrackPopupMenu()前面去试试~
      

  8.   

    呵呵~找到问题了,我刚才把我的工程调试了一下,确实是我刚才将的问题:把SetForegroundWindow()这句放到pSubMenu->TrackPopupMenu()前面去
      

  9.   

    的确,只需将SetForegroundWindow()放在pSubMenu->TrackPopupMenu()前面就行了。
    但是为什么不是托盘的地方,不加SetForegroundWindow(),右键弹出也会消失,而在托盘就得加这句才能消失?
      

  10.   

    正常情况下,我们点右键菜单时,右键菜单所属窗口已经处于ForeGround状态了;而当我们点击系统托盘图标时,其所属窗口并没有处于ForeGround状态-----这是我的个人理解,仅功参考,呵呵