博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

任务栏托盘弹出菜单

Posted on 2010-04-21 19:51  ccmfc  阅读(799)  评论(0编辑  收藏  举报

先说一下思路吧。。。。。主要用的的是一个NOTIFYICONDATA结构和Shell_NotifyIcon函数

其它的就是一些消息响应了

一、先是自己写一个实现托盘的函数StartTry(),

nData;
nData.cbSize = sizeof(NOTIFYICONDATA);
nData.hWnd = this->m_hWnd;
nData.uID = IDR_MAINFRAME;
nData.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
nData.uCallbackMessage = WM_ONTRY;        //在头文件中自定义WM_ONTRY(#define WM_ONTRY WM_USER+1)消息响应函数nData.hIcon = LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_MAINFRAME));
strcpy(nData.szTip,"sun");
Shell_NotifyIcon(NIM_ADD, &nData);
this->ShowWindow(SW_HIDE);
return TRUE;

二、写一个停止托盘的函数StopTry()

NOTIFYICONDATA nData;
 nData.cbSize = sizeof(NOTIFYICONDATA);
 nData.hWnd = this->m_hWnd;
 nData.uID = IDR_MAINFRAME;
 nData.uFlags = NIF_TIP|NIF_MESSAGE|NIF_TIP;

 Shell_NotifyIcon(NIM_DELETE,&nData);

三、写一个删除托盘的消息响应函数DeleteTry();

StopTry();
 this->ShowWindow(SW_SHOW);

四、在WM_ONTRY消息响应函数中对不同的操作进行响应

 switch(lParam)
 {
 case WM_LBUTTONDOWN:
  this->ShowWindow(SW_SHOW);  //显示菜单

  DeleteTry();

 case WM_RBUTTONDOWN:
  {
   POINT point;
   GetCursorPos(&point);
   CMenu menu;
   menu.CreatePopupMenu();
   menu.AppendMenu(MF_BITMAP,WM_DeleteTry,&m_Bitmap[0]);  //右击图片删除菜单
   menu.AppendMenu(MF_BITMAP,WM_DESTROY,&m_Bitmap[1]); //右击图片退出菜单
   menu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
   break;
  }  
 default:
  {
   CMenu::DeleteTempMap();
   break;
  }

 }

 

出现的问题

menu.CreatePopupMenu();这一句。

刚开始我是产生一个菜单menu.createMenu(),菜单栏中的图片和文字只出现一小部分

看来还是做下才知道问题出现在哪。