65.9K
CodeProject 正在变化。 阅读更多。
Home

任务栏通知对话框

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (66投票s)

2002年7月12日

3分钟阅读

viewsIcon

730151

downloadIcon

18808

一个 MSN IM 风格的弹出通知对话框

引言

几周前,我在 CodeProject 上看到了 Prateek Kaul 编写的 MSN Messenger 状态栏弹出类。由于我需要一个支持皮肤的任务栏弹出窗口,所以我决定写我自己的新类。

这是我第一次向 CodeProject 提交作品,因为我认为我的代码已经足够成熟可以发布了。

兼容性

此类需要在您的项目中静态或动态链接 MFC;它是在 Visual Studio .NET 下编写、编译和测试的(但应该也能在 VC6 中工作)。

如何使用该类

此类非常易于使用:只需将 TaskbarNotifier.hTaskbarNotifier.cpp 添加到您的项目中,然后在您的应用程序中包含 TaskbarNotifier.h,并在您的 DialogWindow 类的头文件中添加一个 CTaskbarNotifier 成员变量。

OnInitDialogOnCreate 成员函数中,添加以下行:

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);

此函数允许指定用于显示文本的字体(有两种样式可供选择:一种用于正常状态,一种用于鼠标悬停在窗口上时)

nNormalStylenSelectedStyle 可以是以下参数之一或组合:

  • 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 泄漏,请告诉我。如果您有关于增强此类功能的建议,请发表评论。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.