托盘的实现:
[ color=#FF00FF]1.[/color]了解NOTIFYICONDATA结构;
typedef struct _NOTIFYICONDATA {
DWORD cbSize; // 结构大小(sizeof struct),必须设置
HWND hWnd; // 发送通知消息的窗口句柄
UINT uID; // 图标ID ( 由回调函数的WPARAM 指定)
UINT uFlags;
UINT uCallbackMessage; // 消息被发送到此窗口过程
HICON hIcon; // 图标句柄
CHAR szTip[64]; // 提示文本
} NOTIFYICONDATA;
BOOL Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid
);
第一个参数dwMessage类型为DWORD,表示要进行的动作,它可以是下面的值之一: NIM_ADD: 添加一个图标到任务栏。
NIM_MODIFY: 修改状态栏区域的图标。
NIM_DELETE: 删除状态栏区域的图标。
NIM_SETFOCUS: 将焦点返回到任务栏通知区域。当完成用户界面操作时,任务栏图标必须用此消息。例如,如果任务栏图标正
显示上下文菜单,但用户按下"ESCAPE"键取消操作,这时就必须用此消息将焦点返回到任务栏通知区域。
NIM_SETVERSION:指示任务栏按照相应的动态库版本工作。
2.增加一个函数用来增加删除托盘图标:
BOOL TrayMessage(HWND hWnd, DWORD dwMessage, HICON hIcon, PSTR pszTip)
{
BOOL bReturn;
NOTIFYICONDATA NofityData;
NofityData.cbSize = sizeof(NOTIFYICONDATA);
NofityData.hWnd = hWnd;
NofityData.uID = IDR_MAINFRAME;
NofityData.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
NofityData.uCallbackMessage = WM_MY_TRAY_NOTIFICATION;
NofityData.hIcon = hIcon;
lstrcpyn(NofityData.szTip, pszTip, sizeof(NofityData.szTip));
bReturn = Shell_NotifyIcon(dwMessage, &NofityData);
if (hIcon)
DestroyIcon(hIcon);
return bReturn;
}
3.在TestDlg.cpp 文件中定义一个消息:
#define WM_MY_TRAY_NOTIFICATION WM_USER+100
4.定义一个消息处理函数,用于响应当鼠标单击或双击
LRESULT CTestDlg::OnTrayNotification(WPARAM wparam, LPARAM lparam)
{
switch (lparam )
{
case WM_RBUTTONUP:
case WM_LBUTTONDBLCLK:
ShowWindow(SW_SHOW);
TrayMessage(m_hWnd, NIM_DELETE, NULL, "");
}
return 0;
}
5。最后就是实用拉。
void CTestDlg::OnBnClickedBtntray()
{
TrayMessage(m_hWnd, NIM_ADD, NULL, "我的托盘");
TrayMessage(m_hWnd, NIM_MODIFY, m_hIcon, "我的托盘");
ShowWindow(SW_HIDE);
}
#函数的定义在***DLGDlg.h
protected:
// Generated message map functions
//{{AFX_MSG(CHideDLGDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnShow(WPARAM wparam, LPARAM lparam);
afx_msg LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
[ color=#FF00FF]1.[/color]了解NOTIFYICONDATA结构;
typedef struct _NOTIFYICONDATA {
DWORD cbSize; // 结构大小(sizeof struct),必须设置
HWND hWnd; // 发送通知消息的窗口句柄
UINT uID; // 图标ID ( 由回调函数的WPARAM 指定)
UINT uFlags;
UINT uCallbackMessage; // 消息被发送到此窗口过程
HICON hIcon; // 图标句柄
CHAR szTip[64]; // 提示文本
} NOTIFYICONDATA;
BOOL Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid
);
第一个参数dwMessage类型为DWORD,表示要进行的动作,它可以是下面的值之一: NIM_ADD: 添加一个图标到任务栏。
NIM_MODIFY: 修改状态栏区域的图标。
NIM_DELETE: 删除状态栏区域的图标。
NIM_SETFOCUS: 将焦点返回到任务栏通知区域。当完成用户界面操作时,任务栏图标必须用此消息。例如,如果任务栏图标正
显示上下文菜单,但用户按下"ESCAPE"键取消操作,这时就必须用此消息将焦点返回到任务栏通知区域。
NIM_SETVERSION:指示任务栏按照相应的动态库版本工作。
2.增加一个函数用来增加删除托盘图标:
BOOL TrayMessage(HWND hWnd, DWORD dwMessage, HICON hIcon, PSTR pszTip)
{
BOOL bReturn;
NOTIFYICONDATA NofityData;
NofityData.cbSize = sizeof(NOTIFYICONDATA);
NofityData.hWnd = hWnd;
NofityData.uID = IDR_MAINFRAME;
NofityData.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
NofityData.uCallbackMessage = WM_MY_TRAY_NOTIFICATION;
NofityData.hIcon = hIcon;
lstrcpyn(NofityData.szTip, pszTip, sizeof(NofityData.szTip));
bReturn = Shell_NotifyIcon(dwMessage, &NofityData);
if (hIcon)
DestroyIcon(hIcon);
return bReturn;
}
3.在TestDlg.cpp 文件中定义一个消息:
#define WM_MY_TRAY_NOTIFICATION WM_USER+100
4.定义一个消息处理函数,用于响应当鼠标单击或双击
LRESULT CTestDlg::OnTrayNotification(WPARAM wparam, LPARAM lparam)
{
switch (lparam )
{
case WM_RBUTTONUP:
case WM_LBUTTONDBLCLK:
ShowWindow(SW_SHOW);
TrayMessage(m_hWnd, NIM_DELETE, NULL, "");
}
return 0;
}
5。最后就是实用拉。
void CTestDlg::OnBnClickedBtntray()
{
TrayMessage(m_hWnd, NIM_ADD, NULL, "我的托盘");
TrayMessage(m_hWnd, NIM_MODIFY, m_hIcon, "我的托盘");
ShowWindow(SW_HIDE);
}
#函数的定义在***DLGDlg.h
protected:
// Generated message map functions
//{{AFX_MSG(CHideDLGDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnShow(WPARAM wparam, LPARAM lparam);
afx_msg LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()