我做了一个托盘,并在托盘上加了一弹出菜单。
但在菜单上加执行程序时,却总是弹不出来。
请各大虾指教。
源码如下://托盘开菜单:
LRESULT CTrayIcon::OnTrayNotification(WPARAM wID, LPARAM lEvent)
{  
if (wID!=m_nid.uID)   return 0;  
// 使用与托盘图标拥有同样ID号的菜单作为右键弹出菜单   
// 并将菜单上的第一项作为缺省命令使用,  
// 缺省命令在WM_LBUTTONDBLCLK事件发生时被击发  
// 
 CMenu menu;  
 if (!menu.LoadMenu(IDR_TRAY_MENU))   return 0; 
 CMenu* pSubMenu = menu.GetSubMenu(0);  
 if (!pSubMenu)    return 0;  
 switch (lEvent) 
 {   
 case WM_RBUTTONUP:
 {
 //使菜单第一项为缺省项 (表现为粗体)   
 ::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE);   
 // 在鼠标的当前位置弹出菜单。  
 CPoint mouse;   GetCursorPos(&mouse);   
 ::SetForegroundWindow(m_nid.hWnd);    
 ::TrackPopupMenu(pSubMenu->m_hMenu,0,mouse.x,mouse.y,0,m_nid.hWnd,NULL);
 break;
 }
 case WM_LBUTTONDOWN:  //按左键显示对话框。
 ShowWindow(m_nid.hWnd,SW_SHOW );
 break;
 case WM_LBUTTONDBLCLK:  //双击发送菜单信息
 ::SendMessage(m_nid.hWnd, WM_COMMAND, pSubMenu->GetMenuItemID(0), 0);   break;
 }
 return 1;
}
// 菜单信息处理:
//在菜单第一项的COMMAND信息处加函数,如下:
void CTrayIcon::OnMenuitem32772() 
{
// TODO: Add your command handler code here
//在这里弹出另一菜单。修改密码。:)
C_CHPASSWORD_Dlg dlg3;
dlg3.DoModal();

}

解决方案 »

  1.   

    这是我看过的,也试验过的,和你的略有不同。void CTrayDlg::OnProc(WPARAM wParam,LPARAM lParam)
    {
      UINT uMouseMsg;//鼠标动作
      uMouseMsg=(UINT) lParam;  if(uMouseMsg==WM_LBUTTONDOWN)
      {
        ATOM GlobalAtom;
        if(!GlobalFindAtom("Aboutc"))  
        {
          GlobalAtom=GlobalAddAtom("Aboutc");       CAboutDlg dlg;  //弹出About对话框 
          dlg.DoModal();      GlobalDeleteAtom(GlobalAtom); 
        }
    }
      if(uMouseMsg==WM_RBUTTONDOWN)  //鼠标右键弹出菜单。
      {
        AfxGetMainWnd()->SetForegroundWindow(); //弹出Popup菜单
        CMenu menu;
        menu.LoadMenu(IDR_TRAYMENU);
        CMenu* pPopup=menu.GetSubMenu(0);
        CPoint Point;
        GetCursorPos(&Point);
        pPopup->TrackPopupMenu(TPM_LEFTALIGN,Point.x,Point.y,AfxGetMainWnd(),NULL );
        AfxGetMainWnd()->PostMessage(WM_NULL, 0, 0); 
      }
    }你要的话,可以把这个例子发给你。
      

  2.   

    你是指什么弹不出来,
    弹出菜单还是C_CHPASSWORD_Dlg?
      

  3.   

    弹出C_CHPASSWORD_Dlg对话框。
    好象这个消息没映射到一样,下面这个消息处理函数都执行不到。
    void CTrayIcon::OnMenuitem32772() 
    {
    // TODO: Add your command handler code here
    //在这里弹出另一菜单。修改密码。:)
    C_CHPASSWORD_Dlg dlg3;
    dlg3.DoModal();

    }
      

  4.   

    ::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE);   
    这句有必要么?
    检查一下菜单是否正确映射了,看代码应该没问题
      

  5.   

    那一句我那上面也有,我再用SPY++查了信息及映射,没什么问题。
    纳闷呢。
    我的想法:
    菜单放在托盘类里,托盘已经加了相关的消息映射了,那么只要有消息处理函数即可。实际上托盘接受信息的自带函数最后那个CASE多余。
    ?????
    有点绕。