登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

软件开发体会

zhengjinye

 
 
 

日志

 
 

VC++实现托盘(我用的是VS2008)  

2008-03-15 22:21:30|  分类: VC++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1、添加菜单资源和图标资源。比如ID是IDR_MENU_GL(菜单);可以添加IDR_图标,我们这里使用IDR_MAINFRAME系统图标,因此就不用添加了。

2、在MainFrm.h中添加定义:
 //对托盘图标产生的鼠标消息
 #define WM_ICON_NOTIFY  WM_USER+10

3、在MainFrm.h,class CMainFrame中定义一个消息函数和图标结构:
 public:
  LRESULT OnTaskbar(WPARAM wParam,LPARAM lParam);
  NOTIFYICONDATA m_tnid;

4、建立消息映射(MainFrm.cpp):
 
 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  .........................
  ON_MESSAGE(WM_ICON_NOTIFY,OnTaskbar)
  .........................
 END_MESSAGE_MAP()
 //就是把消息WM_ICON_NOTIFY和函数OnTaskbar绑定。

5、在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 函数后面添加如下代码(MainFrm.cpp):

 //图标句柄
 HICON hIcon;

 char lpszTip[] = "当鼠标指针停留在托盘图标上时,要显示的提示。";
 //获得资源实例
 HINSTANCE hInst = AfxFindResourceHandle(MAKEINTRESOURCE(IDR_MAINFRAME),RT_GROUP_ICON);
 //获得图标句柄
 hIcon = (HICON)LoadImage(hInst,MAKEINTRESOURCE(IDR_MAINFRAME),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);

 //给NOTIFYICONDATA结构赋值
 //结构长度
 m_tnid.cbSize = sizeof(NOTIFYICONDATA);
 //窗口句柄
 m_tnid.hWnd = m_hWnd;
 //菜单ID
 m_tnid.uID = IDR_MENU_GL;
 //属性标志:NIF_MESSAGE发送NOTIFYICONDATA结构指明的消息uCallbackMessage。
 //属性标志:NIF_ICON在右下角显示图标。
 //属性标志:NIF_TIP当鼠标停留时显示提示。
 m_tnid.uFlags = NIF_MESSAGE | NIF_ICON |NIF_TIP;

 //发送的消息,前面已经和函数OnTaskbar绑定。
 m_tnid.uCallbackMessage = WM_ICON_NOTIFY;

 //在右下角显示的图标。
 m_tnid.hIcon = hIcon;

 //设置鼠标停留时显示的文字提示。
 if (lpszTip)
 {
  lstrcpyn(m_tnid.szTip,lpszTip,sizeof(m_tnid.szTip));
 }
 else
 {
  m_tnid.szTip[0] = '\0';
 }

 //实质操作:调用Shell_NotifyIcon函数通过NIM_ADD向任务栏写图标
 //增加NIM_ADD、修改NIM_MODIFY、删除NIM_DELETE
 Shell_NotifyIcon(NIM_ADD,&m_tnid);

 //释放图标资源
 if (hIcon)
 {
  DestroyIcon(hIcon);
 }

6、建立消息响应函数(MainFrm.cpp)。

 LRESULT CMainFrame::OnTaskbar(WPARAM wParam,LPARAM lParam)
 {
  //获得鼠标消息
  UINT uMouseMsg = (UINT)lParam;

  switch(uMouseMsg)
  {
  //处理左键按下
  case WM_LBUTTONDOWN:
   //弹出Windows窗体。SW_RESTORE保持关闭时的样子。
   AfxGetMainWnd()->ShowWindow(SW_RESTORE);
   break;

  //处理右键按下,弹出快捷菜单。
  case WM_RBUTTONDOWN:
   {
    //定义菜单对象和一个指针。
    CMenu menu, *pSubMenu;

    //用于获得鼠标位置。
    CPoint pos;
    
    //获取菜单项,失败返回。
    if (!menu.LoadMenu(m_tnid.uID)) return 0;

    //获取菜单第0项,并得到指针。失败返回。
    if (!(pSubMenu = menu.GetSubMenu(0))) return 0;

    //设置0项为缺省菜单,黑亮显示。
    ::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE);
    
    //获得鼠标当前位置。
    GetCursorPos(&pos); 

    //在当前位置上弹出菜单
    pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());

    //销毁菜单。
    menu.DestroyMenu();
   }
   break;
  default:
   break;
  }

 
  return 0;
 }

6、当关闭和最小化Windows窗口时,隐藏Windows窗体和删除图标。在WindowProc中加入:

 LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
 {
  //当点击最小化按钮时
  if((message==WM_SYSCOMMAND)&&(wParam==SC_MINIMIZE))
  { 
   AfxGetMainWnd()->ShowWindow(SW_FORCEMINIMIZE);
  }
  if (message==WM_CLOSE)
  {
   //用NIM_DELETE删除图标
   Shell_NotifyIcon(NIM_DELETE,&m_tnid);
  }

  return CFrameWnd::WindowProc(message, wParam, lParam);
 }
 //如果是基于对话框的程序,可以添加相应的消息处理函数,可以自动添加,不用手动添加。

7、为快捷菜单添加事件处理程序。用向导添加即可。

  评论这张
 
阅读(1435)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018