zoukankan      html  css  js  c++  java
  • MFC为应用程序添加托盘(右键托盘,弹出菜单)

    源代码:http://download.csdn.net/detail/nuptboyzhb/4137784

    1.       导入一个托盘图标的资源(.ico)格式;资源ID为IDI_ICON1

    2.       在框架程序的初始化函数中,初始化一个托盘图标的一个结构体

    NOTIFYICONDATA notifyicondata;//NOTIFYICONDATA结构

         notifyicondata.cbSize = sizeof(NOTIFYICONDATA);//为notifyicondata结构体分配空间

         //为notifyicondata结构体各个参数赋值

         notifyicondata.hWnd = m_hWnd;//窗口的句柄

         notifyicondata.uID = IDI_NOTIFYICON; //ID标识

         notifyicondata.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;

         notifyicondata.uCallbackMessage = WM_ADDTRAYICON;//回调消息的标识;我们要为回调消息的标识添加用户消息映射

         notifyicondata.hIcon=AfxGetApp()->LoadIcon(IDI_ICON1);//加载托盘图标

      wcscpy(notifyicondata.szTip, _T("为程序创建托盘图标"));

         Shell_NotifyIcon(NIM_ADD, &notifyicondata);       //装载托盘图标

         注意:在该步骤中有几个注意的变量:

    a.       m_hWnd是整个应用程序窗口的句柄

    b.       IDI_NOTIFYICON是我们自己定义的一个常量;即在头文件上添加如下代码:

    #define IDI_NOTIFYICON 100       //托盘图标标识

    c.       WM_ADDTRAYICON是我们自定义消息的标识,也是一个常量;

    #define WM_ADDTRAYICON  WM_USER+101//自定义消息

    3.       添加用户消息映射和消息处理函数

    1.       添加成员函数:

    afx_msg LRESULT OnAddTrayIcon(WPARAM wParam,LPARAM lParam);

    2.       添加消息映射

    ON_MESSAGE(WM_ADDTRAYICON, OnAddTrayIcon)//添加消息映射

    注意:第一个参数是用户自定义消息的标识;第二个参数是消息响应处理函数

    3.       实现消息响应处理函数OnAddTrayIcon

    LRESULT 类名::OnAddTrayIcon(WPARAM wParam,LPARAM lParam)

    {

       if (wParam == IDI_NOTIFYICON)//为创建的托盘图标

       {

                switch(lParam)//消息的类型

                {

                case WM_LBUTTONDBLCLK://双击左键

          //实习窗口的隐藏或显示

    //AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);//隐藏窗口

                         break;

                case WM_RBUTTONDBLCLK://双击右键

                         {

                                   AfxGetApp()->m_pMainWnd->DestroyWindow();//关闭窗口

                                   break;

                         }

               case WM_RBUTTONDOWN://右击托盘,显示菜单

               {

                  CMenu menu,*pSubMenu; //后面要用的CMenu对象

                  CPoint point;

                  menu.LoadMenu(IDR_POPUP_MENU); //装载自定义的右键菜单 

                  pSubMenu = menu.GetSubMenu(0); //获取第一个弹出菜单

                  GetCursorPos(&point); //获取当前光标位置        pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);

                   break;

               }

                }

       }

       return 1;

    }

    4.       卸载托盘。

    当应用程序退出时,卸载

       NOTIFYICONDATA notifyicondata;

       notifyicondata.cbSize = sizeof(NOTIFYICONDATA);

       notifyicondata.uFlags = 0;

       notifyicondata.hWnd = m_hWnd;

    notifyicondata.uID = IDI_NOTIFYICON;

    Shell_NotifyIcon(NIM_DELETE, &notifyicondata);//卸载托盘图标

     

     

    NOTIFYICONDATA结构体的uCallbackMessage变量,使得用户消息响应与托盘的点击等消息关联在一起;托盘的标识IDI_NOTIFYICON,恰好是用户消息响应用来判断是否是托盘传递的消息的依据;

     

     

    在基于多文档或单文档的应用程序,当用户点击最小化按钮时,我们可以讲界面隐藏;

    具体是,添加OnSize()消息

    void CMainFrame::OnSize(UINT nType, int cx, int cy)

    {

       CFrameWnd::OnSize(nType, cx, cy);

       if(nType == SIZE_MINIMIZED)

       {

          ShowWindow(SW_HIDE); // 当最小化时,隐藏主窗口

       }

       // TODO: 在此处添加消息处理程序代码

    }

     对话框的最小化托盘于此很类似,可以参考:http://justtotry.blog.163.com/blog/static/446308122011622101427208/

  • 相关阅读:
    用两个栈实现队列(剑指09题)
    PHP 视频源文件加密方案
    PHP 实现大文件视频推流
    logstash笔记
    yum本地包的获取与安装
    IF.SVNAdmin安装 | SVN权限可视化管理
    Windows全局程序调用 Win + R
    Jenkins复制流水线命令行
    SVN hooks编写[Linux&Windows]
    AA压限, 语音识别去除语气词, 等
  • 原文地址:https://www.cnblogs.com/lidabo/p/3501277.html
Copyright © 2011-2022 走看看