MFC之托盘图标

不指定
2012-2-21 22:00 by:果面 程序开发 本站原创 | |
在VC++中,想实现最小化MFC程序的时候,最小化到系统托盘,需要调用NOTIFYICONDATA类

下面我们就来讲解一下如何简单实现一个系统托盘 我们以对话框程序为列

第一步:在Dlg类中//定义一个NOTIFYICONDATA类的成员变量,用来设置托盘

NOTIFYICONDATA NotifyIcon;

第二步:声明一个消息响应函数

afx_msg void OnNotifyIcon(WPARAM wParam,LPARAM IParam);


上面那条代码也放在Dlg的头文件中

第三步:定义一个自定义消息

#define WM_NC WM_USER+1

上面那条代码也在Dlg的头文件中声明

注册消息

ON_MESSAGE(WM_NC,OnNotifyIcon)

上面那条代码在Dlg类中

第四步:在Dlg头文件中添加一个函数 用来响应点击最小化按钮

void changeMini();

并在Dlg类中实现这个函数

//响应最小化消息
void CChangeScreenDlg::changeMini()
{
ShowWindow(SW_HIDE);
NotifyIcon.cbSize=sizeof(NOTIFYICONDATA);
NotifyIcon.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
NotifyIcon.hWnd=m_hWnd;
lstrcpy(NotifyIcon.szTip,"MediaCraft EMMG");
NotifyIcon.uCallbackMessage=WM_NC;
NotifyIcon.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
Shell_NotifyIcon(NIM_ADD,&NotifyIcon);
}

第五步:截获最小化事件

在Dlg类中找到OnSysCommand函数

修改代码如下

if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
   CAboutDlg dlgAbout;
   dlgAbout.DoModal();
}
//拦截最小化事件
if(nID==SC_MINIMIZE)
{
   //ToTray();

//用我们自己的消息响应最小化事件
   changeMini();
}
else
{
   CDialog::OnSysCommand(nID, lParam);
}

第六步:响应托盘的鼠标事件 也是实现我们第二部声明的消息响应函数

void CChangeScreenDlg::OnNotifyIcon(WPARAM wParam,LPARAM IParam)
{
if ((IParam == WM_LBUTTONDOWN) || (IParam == WM_RBUTTONDOWN))
{
ModifyStyleEx(0,WS_EX_TOPMOST);
ShowWindow(SW_SHOW);
}
}

最后一步:在类的析构函数中 记得销毁托盘图标对象

Shell_NotifyIcon(NIM_DELETE, &NotifyIcon);

以上NOTIFYICONDATA类的一些具体参数,请参阅MSDN
评论(0) 引用(0) 阅读(25020)