我做了一个托盘,并在托盘上加了一弹出菜单。
但在菜单上加执行程序时,却总是弹不出来。
请各大虾指教。
源码如下://托盘开菜单:
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();
}
但在菜单上加执行程序时,却总是弹不出来。
请各大虾指教。
源码如下://托盘开菜单:
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();
}
{
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);
}
}你要的话,可以把这个例子发给你。
弹出菜单还是C_CHPASSWORD_Dlg?
好象这个消息没映射到一样,下面这个消息处理函数都执行不到。
void CTrayIcon::OnMenuitem32772()
{
// TODO: Add your command handler code here
//在这里弹出另一菜单。修改密码。:)
C_CHPASSWORD_Dlg dlg3;
dlg3.DoModal();
}
这句有必要么?
检查一下菜单是否正确映射了,看代码应该没问题
纳闷呢。
我的想法:
菜单放在托盘类里,托盘已经加了相关的消息映射了,那么只要有消息处理函数即可。实际上托盘接受信息的自带函数最后那个CASE多余。
?????
有点绕。