任务栏通知对话框






4.94/5 (66投票s)
2002年7月12日
3分钟阅读

730151

18808
一个 MSN IM 风格的弹出通知对话框
引言
几周前,我在 CodeProject 上看到了 Prateek Kaul 编写的 MSN Messenger 状态栏弹出类。由于我需要一个支持皮肤的任务栏弹出窗口,所以我决定写我自己的新类。
这是我第一次向 CodeProject 提交作品,因为我认为我的代码已经足够成熟可以发布了。
兼容性
此类需要在您的项目中静态或动态链接 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()
方法。如果弹出窗口还在,文本将被替换;如果它正在消失,它会再次最大化。
请注意不要每次要显示消息时都分配 CTaskbarNotifier
,因为皮肤化函数需要一些 CPU 时间来生成用于创建非矩形窗口的区域。
类文档
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);
这两个函数为弹出窗口分配皮肤,它们将 Bitmap
资源 ID 或位图文件的路径作为参数。
可选参数是位图透明颜色的 RGB 值。仅当您想要一个非矩形窗口时才使用这些参数;如果这些参数留空,则不会创建区域。
void SetTextFont(LPCTSTR szFont,int nSize,int nNormalStyle,int nSelectedStyle);
此函数允许指定用于显示文本的字体(有两种样式可供选择:一种用于正常状态,一种用于鼠标悬停在窗口上时)
nNormalStyle
或 nSelectedStyle
可以是以下参数之一或组合:
TN_TEXT_NORMAL
TN_TEXT_BOLD
TN_TEXT_ITALIC
TN_TEXT_UNDERLINE
void SetTextColor(COLORREF crNormalTextColor,COLORREF crSelectedTextColor);
此函数设置文本在正常状态或选中状态下的颜色。
void SetTextRect(RECT rcText);
此函数允许在 bitmap
中定义一个矩形,该矩形将是显示文本的剪裁区域。
void Show(LPCTSTR szCaption,DWORD dwTimeToShow=800,DWORD dwTimeToStay=3000,
DWORD dwTimeToHide=500,int nIncrement=1);
显示弹出窗口动画
szCaption
:要显示的文本dwTimeToShow
:弹出窗口完全可见的持续时间(以毫秒为单位)dwTimeToStay
:弹出窗口保持可见的持续时间(以毫秒为单位)dwTimeToHide
:弹出窗口完全消失的时间(以毫秒为单位)nIncrement
:动画过程中移动窗口的像素增量(值越高,速度越快)
即使弹出窗口已可见、正在隐藏或显示,也可以调用 Show。
void Hide();
手动隐藏弹出窗口。
其他说明
当用户单击弹出窗口时,会向其父窗口发送一条消息(在 TaskbarNotifier.h 中定义为 WM_TASKBARNOTIFIERCLICKED
),您可以通过在消息映射宏中添加以下内容来拦截它:
ON_MESSAGE(WM_TASKBARNOTIFIERCLICKED,OnTaskbarNotifierClicked)
我没有释放 HRGN
句柄是因为当您调用 SetWindowRgn()
函数时,GDI 会负责对象的删除。
结论
感谢 Prateek Kaul,他的代码启发了我编写此类,也感谢 Vander Nunes 关于窗口皮肤化的文章。
我希望这个类对您有用,如果您发现任何内存或 GDI 泄漏,请告诉我。如果您有关于增强此类功能的建议,请发表评论。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。