CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

托盘程序菜单响应问题

楼主caocao81(曹孟德)2005-04-21 13:04:27 在 VC/MFC / 界面 提问

我写了一段托盘程序代码,托盘菜单上有两个菜单项,一个是"关闭",一个是"显示"(用来显示主窗口),消息响应代码如下:  
  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

相关问题

  • 我的托盘程序弹出菜单为何不完整?
  • 求助,托盘程序右键菜单定位。
  • 关于托盘区程序图标响应鼠标点击的问题。。。
  • ”托盘“程序
  • 如何做到不用窗体但是有托盘与托盘菜单的程序?
  • 关于windows系统托盘区来放置图标的鼠标右键菜单响应问题
  • 有关在托盘的图标上鼠标右键响应弹出快捷菜单问题
  • 将程序缩到“托盘”后,如何才能自定义弹出菜单?
  • 托盘程序弹出菜单后为什么关不了啊(在线求救!!!!)
  • 从托盘图标的右键菜单退出程序时的问题?

关键词

  • 代码
  • 托盘
  • 响应
  • 菜单
  • hpopmenu
  • hsubmenu
  • 程序
  • idm
  • wm
  • hwnd

得分解答快速导航

  • 帖主:caocao81
  • vcleaner
  • legendhui
  • cnwolf

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo