MFC下托盘图标的实现和托盘菜单

对话框头文件XXXDlg.h:

1.添加成员变量NOTIFYICONDATA m_nid;

2.添加tray消息响应函数的声明

afx_msg LRESULT OnTrayNotify(WPARAM wParam, LPARAM lParam);

对话框实现文件XXXDlg.cpp:

1.定义tray消息 #define UM_TRAYNOTIFY WM_USER + 11

2.CXXXDlg的构造函数添加

memset(&m_nid, 0, sizeof(m_nid)); // Initialize NOTIFYICONDATA struct  m_nid.cbSize = sizeof(m_nid);  m_nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;

3.CXXXDlg的析构函数添加

m_nid.hIcon = NULL;  Shell_NotifyIcon(NIM_DELETE, &m_nid);

4.添加消息映射:

BEGIN_MESSAGE_MAP(CMFC2Dlg, CDialog)  //...  ON_MESSAGE(UM_TRAYNOTIFY, &CMFC2Dlg::OnTrayNotify)  //... END_MESSAGE_MAP()

5.OnInitDialog函数添加:

m_nid.hWnd = GetSafeHwnd();  m_nid.uCallbackMessage = UM_TRAYNOTIFY;

// Set tray icon and tooltip  m_nid.hIcon = m_hIcon;

// Set tray notification tip information  CString strToolTip = _T("托盘程序");  _tcsncpy_s(m_nid.szTip, strToolTip, strToolTip.GetLength());  Shell_NotifyIcon(NIM_ADD, &m_nid);

6.OnTrayNotify函数的实现: LRESULT CXXXDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam) {  UINT uMsg = (UINT)lParam;

switch(uMsg)  {  case WM_RBUTTONUP:   {    //右键处理   CMenu menuTray;   CPoint point;   int id;   GetCursorPos(&point);      menuTray.LoadMenu(IDR_MENU_TRAY);   id = menuTray.GetSubMenu(0)->TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this); #if 0   CString strInfo;   strInfo.Format(L"menuid %d", id);   LPCTSTR strtmp;   strtmp = strInfo.GetBuffer(0);   MessageBox(strtmp, L"test"); #endif   switch(id){    case IDR_TRAY_EXIT:     OnOK();     break;    case IDR_TRAY_RESTORE:

//窗口前端显示     SetForegroundWindow();     ShowWindow(SW_SHOWNORMAL);     break;    default:     break;   }   break;   }  case WM_LBUTTONDBLCLK:   SetForegroundWindow();   ShowWindow(SW_SHOWNORMAL);   break;  default:   break;  }  return 0; }

7.添加WM_SIZE消息处理:

void CMFC2Dlg::OnSize(UINT nType, int cx, int cy) {  CDialog::OnSize(nType, cx, cy);

if(nType == SIZE_MINIMIZED){   ShowWindow(SW_HIDE);  } } 8.菜单。

添加菜单资源 , 比如IDR_MENU_TRAY.

定义一个子菜单Tray,有若干个菜单项,比如“恢复窗口”, ID是IDR_TRAY_RESTORE,“退出”, ID是IDR_TRAY_EXIT。

在OnTrayNotify函数中捕获右击消息,弹出菜单,参考第6步。

至此,添加托盘的功能基本完成。

时间: 2024-08-02 10:53:41

MFC下托盘图标的实现和托盘菜单的相关文章

Delphi 7下最小化到系统托盘(主要是WM_TRAYMSG和WM_SYSCOMMAND消息)

在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本.定义如下: 123456789   _NOTIFYICONDATAA = record   cbSize: DWORD;   Wnd: HWND;   uID: UINT;   uFlags: UINT;   uCallbackMessage: UINT;   hIcon: HICON;   szTip: array [0..63] of Ansi

Qt 实现系统托盘,托盘菜单,托盘消息

Qt 实现系统托盘,托盘菜单,托盘消息 系统托盘就是运行的某个程序在电脑右下角的小图标,相信大家都很熟悉.QT 提供了QSystemTrayIcon类用于实现程序的托盘.QT提供了托盘示例,在examples文件夹下面,大家可以自行研究. 下面是我自己进行实现的一个示例,主要实现的功能: 1.托盘显示,托盘图标添加: 2.托盘激活事件分发: 3.托盘菜单: 4.托盘消息,点击消息,显示主窗口. 想要显示 托盘图标,首先需要创建一个QSystemTrayIcon对象.可以给此对象设置一些信息,比如

【Qt开发】实现系统托盘,托盘菜单,托盘消息

概述 系统托盘就是在系统桌面底部特定的区域显示运行的程序.windows在任务栏状态区域,linux在布告栏区域.应用程序系统托盘功能,是比较普遍的功能,本篇将详细的介绍如何实现该功能. 演示Demo实现功能: 1.应用启动后,任务栏,系统托盘可以看到该程序. 2.点击右上角×关闭窗口,自动隐藏窗口,托盘可以看到该程序. 3.鼠标在托盘图标上右键,弹出"退出程序"菜单栏,并带有图标. 步骤: 1.工程中新建TrayDialog类,基类是QDialog,在界面上添加Text Browse

MFC下的各种字符串类型和相互转换

MFC下的常用字符串数据类型表示的含义: L:Long  长 P:Point  指针 C:Const  常量 W:Wchar_t  宽字符 T:TCHAR  STR:String  字符串 在看看MFC下各种数据类型的定义: 1 typedef char *LPSTR; 2 typedef const char *LPCSTR; 3 4 typedef wchar_t *LPWSTR; 5 typedef const wchar_t *LPCWSTR; 6 typedef wchar_t WCH

MongoDB在MFC下使用C++驱动编译错误的解决

.post p{text-indent: 2em;} 今天使用MongoDB的C++驱动,在编译连接的时候一直出现错误,显示的string_data.h下93行max宏的问题,可视其本身并不是调用max宏,而是调用 std::numeric_limits<size_t>::max 这样就是产生错误,通过搜索发现解决方法(参考网址:http://blog.chinaunix.net/uid-17102734-id-2830143.html),将该函数用括号括起来,避免windows定义的混淆,具

css+html+js实现下拉及多级弹出菜单

本文将使用css+html+js实现横向菜单,具有下拉的多级弹出菜单. 首先我们来看看效果图: 首先应该写html部分的代码,代码比较简单,代码如下: <body> <div id="menu"> <ul> <li><a href="#" id="current">首页</a></li> <li><a href="#">

MFC下MCI的使用播放音乐

最近研究了一下MFC下的音乐的播放,主要使用了MCI 1.需要包含的库文件 在链接资源里(link)添加库文件VFW32.lib winmm.lib 2.包含的头文件 1 #include <mmsystem.h> 2 3 #include "stdafx.h" 4 5 #include "vfw.h" 6 7 #include <digitalv.h> 8 9 #pragma comment(lib,"winmm.lib"

Web标准:八、下拉及多级弹出菜单

Web标准:八.下拉及多级弹出菜单 知识点: 1.带下拉子菜单的导航菜单 2.绝对定位和浮动的区别和运用 3.CSS自适应宽度滑动门菜单 1)带下拉子菜单的导航菜单 带下拉子菜单的就是在一级导航下加一个二级菜单.这个在上一节第七节课上我已经做出来了,这里就不再写了.再重温一下注意点:如果要在一级菜单下增加二级菜单,二级菜单需要加一个float:none;来去掉浮动,否则二级菜单也会浮动到一行上去了. 2)绝对定位和浮动的区别和运用 绝对定位:它的位置将依据浏览器左上角开始计算或相对于父容器(在父

MFC下对串口的操作以及定时器的调用

最近研究了一下MFC下对串口的操作,测试了一下对设备的读写. 1.打开串口 1 GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(FALSE); 2 m_hComm = CreateFile("COM1", 3 GENERIC_READ | GENERIC_WRITE, 4 0, 5 NULL, 6 OPEN_EXISTING, 7 0, 8 NULL); 9 if (m_hComm == INVALID_HANDLE_VALUE) 10 { 1