MFC基于Dialog的托盘程序(Visual C++ 2013)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
执行文件 TrayDialogDlg.cpp 的消息映射中会自动添加消息映射
ON_MESSAGE(WM_TRAY_NOTIFICATION, &CTrayDialogDlg::OnTrayNotification)
3、 编辑消息处理函数
afx_msg LRESULT CTrayDialogDlg::OnTrayNotification(WPARAM wParam, LPARAM lParam) {
MFC 基于 Dialog 的托盘程序
MFC 基于 DIALOG 的托盘程序......................................................................................................................................1
一、托盘是什么
所谓的“托盘”,在 Windows 系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部 分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。
二、NOTIFYICODDATA 结构和 Shell_NotifyIcon 函数
1、 NOTIFYICONDATA 结构包含了系统用来处理托盘图标的信息,它包括选择的图标、回调消息、提 示消息和图标对应的窗口等内容。其定义为:
DestroyIcon(hIcon); return bReturn; }
5、 为类 CTrayDialogDlg 的 WM_SYSCOMMAND 消息的响应函数 OnSysCommand()添加窗口最小化时的处 理事件(此处需要将对话框的 Minimize 属性设置为 True,否则就需要在对话框中加入最小化按钮, 如教材中所述)。
void CTrayDialogDlg::OnSysCommand(UINT nID, LPARAM lParam) {
if ((nID & 0xFFF0) == IDM_ABOUTBOX) {
CAboutDlg dlgAbout; dlgAbout.DoModal(); } //添加窗口最小化时的处理事件 else if (nID == SC_MINIMIZE) { TrayMessage(m_hWnd, NIM_ADD, NULL, L""); TrayMessage(m_hWnd, NIM_MODIFY, m_hIcon, L"在托盘区显示图标"); ShowWindow(SW_HIDE);
UINT uTimeout; UINT uVersion; }; TCHAR szInfoTitle[64]; DWORD dwInfoFlags; GUID guidItem; } NOTIFYICONDATA, *PNOTIFYICONDATA;
该结构中,成员 uFlags 可以是下列的组合或其中之一: NIF_ICON:设置成员 hIcon 有效 NIF_MESSAGE:设置成员 uCallbackMessage 有效 NIF_TIP:设置成员 szTip 有效 2、 全局函数 Shell_NotifyIcon()用于在托盘上增加、删除或修改图标。其原型为:
delete lpoint; }break; case WM_LBUTTONDBLCLK: {
ShowWindow(SW_SHOW); TrayMessage(m_hWnd, NIM_DELETE, NULL, L""); }break; } return 0; }
4、 添加实现托盘化的全局函数 TrayMessage(); 在头文件 TrayDialog.h 中添加函数声明
typedef struct _NOTIFYICONDATA {
DWORD cbSize; //以字节为单位的这个结构的大小 HWND hWnd; //接收托盘图标通知消息的窗口句柄 UINT uID; //应用程序定义的该图标的ID号 UINT uFlags; //设置该图标的属性 UINT uCallbackMessage; //应用程序定义的消息ID号,此消息传Байду номын сангаас给hWnd HICON hIcon; //图标的句柄 char szTip[64]; //鼠标停留在图标上显示的提示信息 DWORD dwState; //Version 5.0图标的状态 DWORD dwStateMask; //指明dwState成员的哪些位可以被设置或者访问 TCHAR szInfo[256]; //指向一个以\0结束的字符串的指针 union{
7、 调试运行。
Figure 2 鼠标停留在图标上时显示字符
Figure 3 单击鼠标右键时显示关闭菜单
} else {
CDialogEx::OnSysCommand(nID, lParam); } }
6、 如果需要在打开程序时即在托盘中显示图标,可在对话框的初始化方法 OnInitDialog()中添加代码
// TODO: 在此添加额外的初始化代码 TrayMessage(m_hWnd, NIM_ADD, NULL, L""); TrayMessage(m_hWnd, NIM_MODIFY, m_hIcon, L"在托盘区显示图标"); ShowWindow(SW_HIDE);
switch (lParam) { case WM_RBUTTONUP: {
LPPOINT lpoint = new tagPOINT; ::GetCursorPos(lpoint); CMenu Menu; Menu.CreatePopupMenu(); Menu.AppendMenuW(MF_STRING, WM_DESTROY, L"关闭"); Menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y, this); SetForegroundWindow(); HMENU hmenu = Menu.Detach();
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA pnid);
pnid 是上面的 NOTIFYICONDATA 结构的指针。
dwMessage 是被传递的消息,可以是以下消息之一: NIM_ADD:增加图标 NIM_DELETE:删除图标 NIM_MODIFY:修改图标
一、 托盘是什么 ................................................................................................................................................................ 1 二、 NOTIFYICODDATA 结构和 SHELL_NOTIFYICON 函数.......................................................................................................1 三、 开发过程 .................................................................................................................................................................... 2
三、开发过程
(基于 Visual C++ 2013 开发平台并参照教材《Visual C++ 范例开发大全》) 1、 新建一个基于对话框的应用程序,工程名取为 TrayDialog; 2、 为 CtrayDialogDlg 类添加自定义消息 WM_TRAY_NOTIFICATION;
在头文件 TrayDialogDlg.h 中添加
BOOL bReturn; NOTIFYICONDATA NofityData; NofityData.cbSize = (DWORD)sizeof(NOTIFYICONDATA); NofityData.hWnd = hWnd; NofityData.uID = IDR_MAINFRAME; NofityData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; NofityData.uCallbackMessage = WM_TRAY_NOTIFICATION; NofityData.hIcon = hIcon; lstrcpyn(NofityData.szTip, pszTip, sizeof(NofityData.szTip)); bReturn = Shell_NotifyIcon(dwMessage, &NofityData); if (hIcon)
#define WM_TRAY_NOTIFICATION WM_USER+1
打开类向导,选择消息选项卡,打开添加自定义消息对话框,添加自定义消息;
Figure 1 添加自定义消息 这时头文件 TrayDialogDlg.h 中会自动添加声明
afx_msg LRESULT OnTrayNotification(WPARAM wParam, LPARAM lParam);
BOOL TrayMessage(HWND hWnd, DWORD dwMessage, HICON hIcon, LPCWSTR pszTip);
在执行文件 TrayDialog.cpp 中添加函数定义
BOOL TrayMessage(HWND hWnd, DWORD dwMessage, HICON hIcon, LPCWSTR pszTip) {
ON_MESSAGE(WM_TRAY_NOTIFICATION, &CTrayDialogDlg::OnTrayNotification)
3、 编辑消息处理函数
afx_msg LRESULT CTrayDialogDlg::OnTrayNotification(WPARAM wParam, LPARAM lParam) {
MFC 基于 Dialog 的托盘程序
MFC 基于 DIALOG 的托盘程序......................................................................................................................................1
一、托盘是什么
所谓的“托盘”,在 Windows 系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部 分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。
二、NOTIFYICODDATA 结构和 Shell_NotifyIcon 函数
1、 NOTIFYICONDATA 结构包含了系统用来处理托盘图标的信息,它包括选择的图标、回调消息、提 示消息和图标对应的窗口等内容。其定义为:
DestroyIcon(hIcon); return bReturn; }
5、 为类 CTrayDialogDlg 的 WM_SYSCOMMAND 消息的响应函数 OnSysCommand()添加窗口最小化时的处 理事件(此处需要将对话框的 Minimize 属性设置为 True,否则就需要在对话框中加入最小化按钮, 如教材中所述)。
void CTrayDialogDlg::OnSysCommand(UINT nID, LPARAM lParam) {
if ((nID & 0xFFF0) == IDM_ABOUTBOX) {
CAboutDlg dlgAbout; dlgAbout.DoModal(); } //添加窗口最小化时的处理事件 else if (nID == SC_MINIMIZE) { TrayMessage(m_hWnd, NIM_ADD, NULL, L""); TrayMessage(m_hWnd, NIM_MODIFY, m_hIcon, L"在托盘区显示图标"); ShowWindow(SW_HIDE);
UINT uTimeout; UINT uVersion; }; TCHAR szInfoTitle[64]; DWORD dwInfoFlags; GUID guidItem; } NOTIFYICONDATA, *PNOTIFYICONDATA;
该结构中,成员 uFlags 可以是下列的组合或其中之一: NIF_ICON:设置成员 hIcon 有效 NIF_MESSAGE:设置成员 uCallbackMessage 有效 NIF_TIP:设置成员 szTip 有效 2、 全局函数 Shell_NotifyIcon()用于在托盘上增加、删除或修改图标。其原型为:
delete lpoint; }break; case WM_LBUTTONDBLCLK: {
ShowWindow(SW_SHOW); TrayMessage(m_hWnd, NIM_DELETE, NULL, L""); }break; } return 0; }
4、 添加实现托盘化的全局函数 TrayMessage(); 在头文件 TrayDialog.h 中添加函数声明
typedef struct _NOTIFYICONDATA {
DWORD cbSize; //以字节为单位的这个结构的大小 HWND hWnd; //接收托盘图标通知消息的窗口句柄 UINT uID; //应用程序定义的该图标的ID号 UINT uFlags; //设置该图标的属性 UINT uCallbackMessage; //应用程序定义的消息ID号,此消息传Байду номын сангаас给hWnd HICON hIcon; //图标的句柄 char szTip[64]; //鼠标停留在图标上显示的提示信息 DWORD dwState; //Version 5.0图标的状态 DWORD dwStateMask; //指明dwState成员的哪些位可以被设置或者访问 TCHAR szInfo[256]; //指向一个以\0结束的字符串的指针 union{
7、 调试运行。
Figure 2 鼠标停留在图标上时显示字符
Figure 3 单击鼠标右键时显示关闭菜单
} else {
CDialogEx::OnSysCommand(nID, lParam); } }
6、 如果需要在打开程序时即在托盘中显示图标,可在对话框的初始化方法 OnInitDialog()中添加代码
// TODO: 在此添加额外的初始化代码 TrayMessage(m_hWnd, NIM_ADD, NULL, L""); TrayMessage(m_hWnd, NIM_MODIFY, m_hIcon, L"在托盘区显示图标"); ShowWindow(SW_HIDE);
switch (lParam) { case WM_RBUTTONUP: {
LPPOINT lpoint = new tagPOINT; ::GetCursorPos(lpoint); CMenu Menu; Menu.CreatePopupMenu(); Menu.AppendMenuW(MF_STRING, WM_DESTROY, L"关闭"); Menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y, this); SetForegroundWindow(); HMENU hmenu = Menu.Detach();
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA pnid);
pnid 是上面的 NOTIFYICONDATA 结构的指针。
dwMessage 是被传递的消息,可以是以下消息之一: NIM_ADD:增加图标 NIM_DELETE:删除图标 NIM_MODIFY:修改图标
一、 托盘是什么 ................................................................................................................................................................ 1 二、 NOTIFYICODDATA 结构和 SHELL_NOTIFYICON 函数.......................................................................................................1 三、 开发过程 .................................................................................................................................................................... 2
三、开发过程
(基于 Visual C++ 2013 开发平台并参照教材《Visual C++ 范例开发大全》) 1、 新建一个基于对话框的应用程序,工程名取为 TrayDialog; 2、 为 CtrayDialogDlg 类添加自定义消息 WM_TRAY_NOTIFICATION;
在头文件 TrayDialogDlg.h 中添加
BOOL bReturn; NOTIFYICONDATA NofityData; NofityData.cbSize = (DWORD)sizeof(NOTIFYICONDATA); NofityData.hWnd = hWnd; NofityData.uID = IDR_MAINFRAME; NofityData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; NofityData.uCallbackMessage = WM_TRAY_NOTIFICATION; NofityData.hIcon = hIcon; lstrcpyn(NofityData.szTip, pszTip, sizeof(NofityData.szTip)); bReturn = Shell_NotifyIcon(dwMessage, &NofityData); if (hIcon)
#define WM_TRAY_NOTIFICATION WM_USER+1
打开类向导,选择消息选项卡,打开添加自定义消息对话框,添加自定义消息;
Figure 1 添加自定义消息 这时头文件 TrayDialogDlg.h 中会自动添加声明
afx_msg LRESULT OnTrayNotification(WPARAM wParam, LPARAM lParam);
BOOL TrayMessage(HWND hWnd, DWORD dwMessage, HICON hIcon, LPCWSTR pszTip);
在执行文件 TrayDialog.cpp 中添加函数定义
BOOL TrayMessage(HWND hWnd, DWORD dwMessage, HICON hIcon, LPCWSTR pszTip) {