托盘程序菜单响应问题
我写了一段托盘程序代码,托盘菜单上有两个菜单项,一个是"关闭",一个是"显示"(用来显示主窗口),消息响应代码如下:
case WM_COMMAND:
hMenu = GetMenu( hwnd );
switch( LOWORD( wParam ) )
{
case IDM_HELP:
case IDM_VERSION://以上是程序主界面的菜单响应代码
case IDI_SHOW: //这里是托盘菜单的响应代码(显示)
ShowWindow( hwnd, SW_SHOW );
return 0;
case IDM_CLOSE: //这里是托盘菜单的响应代码(关闭)
SendMessage( hwnd, WM_CLOSE, 0, 0 );
return 0;
}
case WM_NOTIFYICON:
switch( lParam )
{
case WM_LBUTTONDBLCLK:
case WM_RBUTTONUP:
POINT point;
HMENU hPopMenu, hSubMenu;
GetCursorPos( &point );
hPopMenu = LoadMenu( hInstance, MAKEINTRESOURCE( IDR_MENUPOP ) );
hSubMenu = GetSubMenu( hPopMenu, 0 ); //*****
SetForegroundWindow( hwnd );
TrackPopupMenu( hSubMenu, TPM_RIGHTBUTTON, point.x, point.y, 0, hwnd, NULL ) ;
}
return 0;
case WM_DESTROY:
}
现在我发现程序只能响应"关闭"这个菜单,"显示"这个菜单点了没有反响,但如果把上面"****"标志的位置中GetSubMenu( hPopMenu, 0)的0改成1则会响应"显示,但不响应"关闭".这是为什么啊?
下面是该菜单的资源定义:
IDR_MENUPOP MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
MENUITEM "关闭(&C)", IDM_CLOSE
MENUITEM "显示(&S)", IDM_SHOW
END
POPUP "MyPopMenu"
BEGIN
MENUITEM "关闭(&C)", IDI_CLOSE
MENUITEM "显示(&S)", IDI_SHOW
END
END
问题点数:100、回复次数:8Top
1 楼vcleaner(我没当大哥很久了.......)回复于 2005-04-21 13:20:09 得分 10
SDK程序?呵呵,学习一下。能将程序代码发到:xia_qingqi@broadxent.com.cn
我看看吗?Top
2 楼caocao81(曹孟德)回复于 2005-04-21 13:22:39 得分 0
帮我顶吧,如果问题解决了就发给你。呵呵。Top
3 楼xuzheng318(忧郁王子)回复于 2005-04-21 13:23:39 得分 0
帮楼主顶!关注!Top
4 楼vcleaner(我没当大哥很久了.......)回复于 2005-04-21 13:24:42 得分 0
你发给我看看,让俺也尝试一下是否能改好。呵呵,给个机会吧,做好了就没有什么意思了!Top
5 楼legendhui(秋天的叶子)回复于 2005-04-21 13:25:17 得分 45
你的程序代码里只对菜单第一项进行了处理,当然只响应第一项了
CMenu::GetSubMenu
CMenu* GetSubMenu( int nPos ) const;
Return Value
A pointer to a CMenu object whose m_hMenu member contains a handle to the pop-up menu if a pop-up menu exists at the given position; otherwise NULL. If a CMenu object does not exist, then a temporary one is created. The CMenu pointer returned should not be stored.
Parameters
nPos
Specifies the position of the pop-up menu contained in the menu. Position values start at 0 for the first menu item. The pop-up menu’s identifier cannot be used in this function.
Remarks
Retrieves the CMenu object of a pop-up menu.
Top
6 楼anlywei(建安)回复于 2005-04-21 13:27:14 得分 0
gzTop
7 楼cnwolf(独狼)回复于 2005-04-21 13:44:24 得分 45
GetSubMenu( hPopMenu, 0)
你去的菜单是
POPUP ""
BEGIN
MENUITEM "关闭(&C)", IDM_CLOSE
MENUITEM "显示(&S)", IDM_SHOW
END
此时处理IDM_CLOSE和IDM_SHOW
GetSubMenu( hPopMenu, 1)
你取得菜单是POPUP "MyPopMenu"
BEGIN
MENUITEM "关闭(&C)", IDI_CLOSE
MENUITEM "显示(&S)", IDI_SHOW
END
此时处理的是,IDI_CLOSE和IDI_SHOW
再看看你的消息处理:
case IDM_HELP:
case IDM_VERSION://以上是程序主界面的菜单响应代码
case IDI_SHOW: //这里是托盘菜单的响应代码(显示)
ShowWindow( hwnd, SW_SHOW );
return 0;
case IDM_CLOSE: //这里是托盘菜单的响应代码(关闭)
SendMessage( hwnd, WM_CLOSE, 0, 0 );
return 0;
你处理的是
IDI_SHOW和IDM_CLOSE,所以你只能响应一个啦!
看看你是不是把IDI_CLOSE写错啦
Top
8 楼caocao81(曹孟德)回复于 2005-04-21 19:31:23 得分 0
哈哈,知道原因了,谢谢各位,尤其是 cnwolf(独狼)和legendhui(何离心之可同兮,吾将远逝以自疏) ,原来是我不小心在菜单里加了另一个菜单。Top




