mfc实现托盘图标

    xiaoxiao2025-10-07  3

    1,首先我们用AppWizard创建一个基于对话框的应用程序CUserDlg。m_nid为类成员变量NOTIFYICONDATA m_nid; 2,ToTray(){ m_nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA); m_nid.hWnd = this->m_hWnd; m_nid.uID = IDR_MAINFRAME; m_nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP ; m_nid.uCallbackMessage = WM_SHOWTASK; //自定义的消息名称 WM_SHOWTASK 头函数中定义为WM_USER+1 m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); strcpy(m_nid.szTip,"托盘图标");//当鼠标放在上面时,所显示的内容 Shell_NotifyIcon(NIM_ADD,&m_nid);//在托盘区添加图标 } 3,#define WM_SHOWTASK WM_USER+1在xxdlg.h文件中 4,添加消息WM_SHOWTASK的响应函数afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam); 在BEGIN_MESSAGE_MAP(CUserDlg,CDialog)和END_MESSAGE_MAP()之间加代码: ON_MESSAGE(WM_SHOWTASK,onShowTask) 5,编写该函数: LRESULT CUserDlg::onShowTask(WPARAM wParam,LPARAM lParam) //wParam接收的是图标的ID,lParam接收的是鼠标的行为 { if(wParam!=IDR_MAINFRAME)     return 1; switch(lParam) { case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”     {          LPPOINT lpoint=new tagPOINT;       ::GetCursorPos(lpoint);//得到鼠标位置       CMenu menu;       menu.CreatePopupMenu();//声明一个弹出式菜单       //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已       //隐藏),将程序结束。       menu.AppendMenu(MF_STRING,WM_DESTROY,"退出");       //确定弹出式菜单的位置     menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);       //资源回收       HMENU hmenu=menu.Detach();       menu.DestroyMenu();       delete lpoint;     }     break; case WM_LBUTTONDBLCLK://双击左键的处理     {                      this->ShowWindow(SW_SHOWNORMAL);//简单的显示主窗口     }     break; } return 0; } 6,然后在OnInitDialog函数中调用ToTray(); 7,为使应用程序退出时图标消失,映射WM_DESTROY消息,在OnDestroy()函数中加入: ::Shell_NotifyIcon(NIM_DELETE,&m_nid); 以上代码还存在一个问题,右键单击托盘图标,跳出菜单后无法消失。需要在menu.TrackPopupMenu前面加这么一句SetForegroundWindow();
    转载请注明原文地址: https://ju.6miu.com/read-1302901.html
    最新回复(0)