关键字:VC 系统托盘 Shell_NotifyIcon NOTIFYICONDATA
参考文献:MSDN www.vckbase.com
其实有人已经把这些东西写得很好,就是觉得自己再写一遍,能够加深自己的印象。
[@more@]首先还是简单介绍一下Windows托盘区编程。只有Shell_NotifyIcon一个函数可用。他的功能就是Sends a message to the taskbar's status area. Shell_NotifyIcon的结构
BOOL Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA lpdata
);
dwMessage可以取如下值(我只把需要的列出来,嘿,其他的看MSDN)
NIM_ADD 添加图标
NIM_DELETE 删除图表
Lpdata 是一个指向NOTIFYICONDATA结构的指针。该结构包括处理图标的信息,回调函数,把鼠标放在上面能显示的提示信息等等。
具体操作的时候,只需要先定义NOTIFYICONDATA nc,然后把nc的结构填充满了。调用Shell_NotifyIcon就可以了。
好了,介绍完毕,下面是具体的详细步骤,我已经力图把它叙述得很清楚,如果你觉得我的步骤还比较不清楚,也可以向我索要全部代码。
1.首先创建一个但文档的工程。我的叫MyTest。在出现的对话框中右击-〉property –〉style,并把其中的maxmize box和minimize box勾上。
2.在CMyTestDlg的头文件中(MyTestDlg.h)加入以下两个变量的声明:
BOOL m_bIsMinimized;
BOOL m_bIsFirstMinimized;
并且在构造函数中初始化
m_bIsMinimized = FALSE;
m_bIsFirstMinimized = FALSE;
3.在资源中添加一个菜单,ID为默认的就成
4.在Class Wizzard 中添加OnDestroy()消息映射函数。接下来我们需要重写他。
void CMyTestDlg::OnDestroy()
{
CDialog::OnDestroy();
NOTIFYICONDATA nc;
nc.cbSize = sizeof(NOTIFYICONDATA);
nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
nc.hWnd = m_hWnd;
nc.uCallbackMessage = WM_NOTIFYICON;
nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ;
nc.uID = IDC_NOTIFYICON;
Shell_NotifyIcon(NIM_DELETE , &nc);
}
5.自己需要手工添加两个消息映射函数
定义消息
#define WM_NOTIFYICON (WM_USER+101)
#define IDC_NOTIFYICON (WM_USER+102)
#define WM_MINIMIZE (WM_USER+103)
在CMyTestDlg的头文件中
//{{AFX_MSG(CMyTestDlg)
//以下两个需要手动添加
afx_msg void OnNotifyIcon(WPARAM wParam,LPARAM lParam);
afx_msg void OnMyMinimize();
//}}AFX_MSG
在CMyTestDlg的实现文件中(CMyTestDlg.cpp)
BEGIN_MESSAGE_MAP, END_MESSAGE_MAP()中添加。
ON_MESSAGE(WM_MINIMIZE, OnMyMinimize)
ON_MESSAGE(WM_NOTIFYICON,OnNotifyIcon)
实现这两个函数就成了。
void CMyTestDlg::OnNotifyIcon(WPARAM wParam,LPARAM lParam)
{
UINT nID = (UINT)wParam;
UINT uMouseMsg = (UINT)lParam;
switch(uMouseMsg)
{
case WM_LBUTTONDBLCLK:
if(m_bIsMinimized = TRUE)
{
ShowWindow(SW_SHOW);
m_bIsMinimized = !m_bIsMinimized;
}
break;
case WM_RBUTTONDOWN:
CMenu menu;
CPoint curpos;
GetCursorPos(&curpos);
if(menu.LoadMenu(IDR_MENU1))
{
CMenu* pPopup;
pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
SetForegroundWindow();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
curpos.x,curpos.y,AfxGetMainWnd());
}
}
}
void CMyTestDlg::OnMyMinimize()
{
if(m_bIsFirstMinimized == FALSE)
{
NOTIFYICONDATA nc;
nc.cbSize = sizeof(NOTIFYICONDATA);
nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
nc.hWnd = m_hWnd;
lstrcpy(nc.szTip,"最小化");
nc.uCallbackMessage = WM_NOTIFYICON;
nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ;
nc.uID = IDC_NOTIFYICON;
Shell_NotifyIcon(NIM_ADD , &nc);
m_bIsFirstMinimized = TRUE;
}
ShowWindow(SW_HIDE);
m_bIsMinimized = TRUE;
}
6.将
void CMyTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
if(nID == SC_MINIMIZE)
OnMyMinimize();
else
CDialog::OnSysCommand(nID, lParam);
}
}
修改成这个模样。
这些就是如何实现啦,还有可以在菜单中实现退出,显示程序,以及加上个定时器,进而可以实现托盘的动画实现。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/559014/viewspace-806886/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/559014/viewspace-806886/