在开发桌面应用程序时,经常需要实现一些能够在任务栏上显示通知的功能。这些通知可以是简单的文本消息,也可以是带有动画效果的复杂窗口。本文将介绍一个自定义的任务栏通知类,它支持皮肤,并且可以很容易地集成到MFC项目中。
这个类需要在项目中静态或动态链接MFC。它已经在Visual Studio.NET下编写、编译和测试过(但也应该可以在VC6中工作)。
使用这个类非常简单:只需将TaskbarNotifier.h和TaskbarNotifier.cpp添加到项目中,然后在应用程序中包含TaskbarNotifier.h,在Dialog或Window类的头文件中添加一个CTaskbarNotifier成员变量。
// 在OnInitDialog或OnCreate成员函数中添加以下代码
m_wndTaskbarNotifier.Create(this);
m_wndTaskbarNotifier.SetSkin(IDB_MY_BITMAP_RESOURCE);
m_wndTaskbarNotifier.SetTextFont("Arial", 90, TN_TEXT_NORMAL, TN_TEXT_UNDERLINE);
m_wndTaskbarNotifier.SetTextColor(RGB(0, 0, 0), RGB(0, 0, 200));
m_wndTaskbarNotifier.SetTextRect(CRect(10, 40, m_wndTaskbarNotifier1.m_nSkinWidth - 10, m_wndTaskbarNotifier1.m_nSkinHeight - 25));
当想要显示弹出动画时,只需在任何地方调用:
m_wndTaskNotifier.Show("要显示的文本");
这将显示窗口出现然后消失的动画。可以在任何时候再次调用Show()方法。如果弹出窗口仍然存在,文本将被替换;如果它正在消失,它将再次最大化。
以下是类的一些关键函数:
int Create(CWnd *pWndParent);
// 创建一个弹出窗口,直到调用Show()才会显示
BOOL SetSkin(UINT nBitmapID, short red=-1, short green=-1, short blue=-1);
BOOL SetSkin(LPCTSTR szFileName, short red=-1, short green=-1, short blue=-1);
// 这两个函数为弹出窗口分配一个皮肤,参数可以是位图资源ID或位图文件的路径
void SetTextFont(LPCTSTR szFont, int nSize, int nNormalStyle, int nSelectedStyle);
// 这个函数允许指定用于显示文本的字体(两种样式,一种是正常状态,一种是鼠标悬停时)
void SetTextColor(COLORREF crNormalTextColor, COLORREF crSelectedTextColor);
// 这个函数设置文本在正常或选中状态下的颜色
void SetTextRect(RECT rcText);
// 这个函数允许定义一个矩形区域,该区域将用于显示文本的剪辑区域
void Show(LPCTSTR szCaption, DWORD dwTimeToShow=800, DWORD dwTimeToStay=3000, DWORD dwTimeToHide=500, int nIncrement=1);
// 显示弹出窗口动画
void Hide();
// 手动隐藏弹出窗口
当用户点击弹出窗口时,会向其父窗口发送一个消息(在TaskbarNotifier.h中定义的WM_TASKBARNOTIFIERCLICKED),可以通过在消息映射宏中添加以下内容来拦截它:
ON_MESSAGE(WM_TASKBARNOTIFIERCLICKED, OnTaskbarNotifierClicked)
没有释放HRGN句柄的原因是,当调用SetWindowRgn()函数时,GDI会负责对象的删除。