
可以重载OnSize()方法,实现托盘图标。
数据结构NOTIFYICONDATA用来储存托盘图标的信息,结构如下:
typedef struct _NOTIFYICONDATA {
DWORD cbSize
HWND hWnd
UINT uID
UINT uFlags
UINT uCallbackMessage
HICON hIcon
WCHAR szTip[64]
} NOTIFYICONDATA, *PNOTIFYICONDATA
首先要在对话框类中加入NOTIFYICONDATA变量:
NOTIFYICONDATA nid;
然后要在OnInitDialog()中对nid进行一些初宏并始化:
nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA) //数据的大小
nid.hWnd = this->GetSafeHwnd() //获取当前窗口句柄
nid.uID = 100 //凳绝升指定该nid的ID
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP //定义图标的属性:图标有效|自定义消息有效|鼠标指向显示文字有效
nid.uCallbackMessage = WM_TRAYICON_RESTORE//定义CALLBACK消息名称,用来响应对托盘图标的 *** 作
nid.hIcon = m_hIcon//指定显示的图标
wcscpy(nid.szTip, _T("TrayIcon")) //鼠标指向图标时的提示框
当然在头文件中要定义好WM_TRAYICON_RESTORE,
#defined WM_TRAYICON_RESTORE WM_USER+101 //这个值一般要大于100
重载OnSize()方法,假如对话框类是CTrayIconDlg;
void CTrayIconDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy)
if (nType==SIZE_MINIMIZED)//如果事件为最小化
{
Shell_NotifyIcon(NIM_ADD,&nid) //在托盘区添加图标
ShowWindow(SW_HIDE) //隐藏主窗口
}
}
运行程序,最小化窗口,是不是成功将窗口藏到系统托盘了。
现在还不能让程序窗口还原,无论单击,双击小图标都没反应,那是因为没有对其消息进行处理。
首先在CTrayIconDlg类中加入方法:
afx_msg LRESULT OnRestore(WPARAM wParam, LPARAM lParam)
实现如下:
LRESULT CTrayIconDlg::OnRestore(WPARAM wParam, LPARAM lParam)
{
if( lParam == WM_LBUTTONDOWN ) //如果在图标中单击左键则还原
{
ShowWindow(SW_SHOWNORMAL) //显示主窗口
this->SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE)//使窗口总是在最前面
//枣老Shell_NotifyIcon(NIM_DELETE,&nid) //若加入这行,则在窗口还原后删除托盘图标,否则保留托盘图标
}
return 0
}
把该方法加入消息映射表:
将ON_MESSAGE(WM_TRAYICON_RESTORE, OnRestore)插到映射表中
BEGIN_MESSAGE_MAP(CForexDemoDlg, CDialog)
...
...
ON_MESSAGE(WM_TRAYICON_RESTORE, OnRestore)
END_MESSAGE_MAP()
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)