VC++MFC对话框应用程序实现程序最小化到系统托盘

转自:http://blog.sina.com.cn/s/blog_6b23bc700100pqrm.html

  现在使用系统托盘图标的程序越来越多,尤其是需要长时间运行的程序。这并不是什么高深的技术,纯当做个笔记。

       第一步:定义一个 NOTIFYICONDATA  结构变量 nid。NOTIFYICONDATA结构体定义可以在MSDN中查找,就不做多做介绍。

       第二步:设置NOTIFYICONDATA变量属性:
       nid.cbSize =sizeof(NOTIFYICONDATA);
       nid.hWnd =m_hWnd;
       nid.hIcon =m_hIcon;

    nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP|NIF_INFO;

   m_nid.uID     = IDR_MAINFRAME;//IDR_MAINFRAME是你自己导入的一个icon资源的ID

           m_nid.hIcon   = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));

       nid.uCallbackMessage =WM_NOTIFYICON; //#define WM_NOTIFYICON (WM_USER +101) 自己定义
       wcscpy(nid.szTip, L"这是标签");
       wcscpy(nid.szInfo, L"这是气泡提示消息");
       wcscpy(nid.szInfoTitle, L"这是气泡提示标题");
       nid.dwInfoFlags = NIIF_INFO;
       nid.uTimeout = 1000;

     第三步:将图标显示到系统托盘,只需调用一个API即可完成.
      Shell_NotifyIcon (NIM_ADD,&nid);

     第四步:图标添加完成了,我们通常需要让它响应用户的各种操作。如双击显示窗体,右键弹出上下文菜单等.
首先,我们定义一个回调函数
LRESULT OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
       switch(lParam) //根据lParam判断相对应的事件
       {
       case WM_LBUTTONDBLCLK: //如果左键双击托盘图标,则显示窗体
              ShowWindow (SW_SHOWNORMAL );
              SetForegroundWindow();
              break;
       case WM_RBUTTONUP: //如果右键菜单弹起,则弹出菜单
              CPoint pos;
              GetCursorPos(&pos);
              if(pMenuContext != NULL)
              {
                     SetForegroundWindow(); //加这句是为了鼠标点击其他地方时,弹出的菜单能够消失
              pMenuContext->TrackPopupMenu(TPM_RIGHTBUTTON|TPM_RIGHTALIGN,pos.x+1,pos.y+1,this);
              }
              break;
       }
       return 0;
}

然后在BEGIN_MESSAGE_MAP 与END_MESSAGE_MAP 之间 添加
ON_MESSAGE (WM_NOTIFYICON ,&OnNotifyIcon)
进行消息映射就完成了

     我们已经完成了对程序添加托盘图标,而且可以通过图标对应用程序进行一定的操作,但是当程序退出的时候,系统托盘图标并不会自动删除,所以我们还需要在 OnClose() 中调用::Shell_NotifyIcon (NIM_DELETE ,&nid); 删除托盘图标.

     在此附上源码工程: 点我下载
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值