今天介绍一个C#程序: 轻量级的MSN Messenger 风格的通知窗体(winform), 之所以说是轻量级,最主要是因为只支持文本.NotifyWindow: A different MSN Messenger style notification window By Robert Misiak


[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体

[介绍]
NotifyWindow显示一种MSN Messenger 风格的通知窗体. 如果需要在通知窗体中显示图片,请参照 John O'Byrne的TaskbarNotifer.(译者:准备明天介绍) .如果你只准备显示文本,轻量级的NotifyWindow 就足够了.在打开和关闭NotifyWindow通知窗体时有向上/下平移的动画效果.窗体默认显示11秒,当然代码里可以改. NotifyWindow自己负责所有的窗体绘制工作,无需其他图片文件.

[使用代码]
一个非常简单的示例:

[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体// Display the text "This is a sample NotifyWindow"
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
NotifyWindow nw = new NotifyWindow ("This is a sample NotifyWindow");
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体nw.Notify();
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// The following two lines of code will display a window that 
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// looks exactly like the one shown at the beginning of this article.
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
NotifyWindow nw = new NotifyWindow ("NotifyWindow"
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体  
"This is a sample notification created with NotifyWindow");
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体nw.Notify();


有字体和颜色等选项可随意改变. 下载代码中的TestNotifyWindow应用程序可以让你和看到一些选项的设置,但下面的代码更全面地展示了所有选项的设置.
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体NotifyWindow nw = new NotifyWindow();
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体nw.Text 
= "This is the NotifyWindow text";
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体nw.Title 
= "Title Text";
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// Change the background style.  Other valid 
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// styles are Solid, VerticalGradient,
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// HorizontalGradient and BackwardDiagonalGradient  
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// (Default: VerticalGradient)
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
nw.BackgroundStyle = NotifyWindow.BackgroundStyles.ForwardDiagonalGradient;
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// Change the background colors  
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// (Default: BackColor=SteelBlue, GradientColor=WhiteSmoke)
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
nw.BackColor = Color.SpringGreen;
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体nw.GradientColor 
= Color.White;
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// Change the text and title colors.  (Default: ControlText)
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
nw.TextColor = Color.Blue;
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体nw.TitleColor 
= Color.Black;
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// Change the color displayed when the text is pressed.  (Default: Gray)
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
nw.PressedColor = Color.Red;
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// Use non-default fonts.  If TitleFont is not set 
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// by the user, nw.Font will be used.
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
nw.Font = new Font ("Tahoma"8.25F);
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体nw.TitleFont 
= new Font ("Tahoma"8.25F, FontStyle.Bold);
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// Change NotifyWindow size.  (Default: 130, 110)
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
nw.SetDimensions (nwWidth, nwHeight);
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// Do not close the NotifyWindow if the mouse 
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// cursor is over the window.  (Default: true)
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
nw.WaitOnMouseOver = true;
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// Set up an EventHandler to be called if the text or title are clicked.
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
nw.TextClicked += new System.EventHandler (nwTextClicked);
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体nw.TitleClicked 
+= new System.EventHandler (nwTitleClicked);
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// Display the window for 20 seconds, or 20000ms.  (Default: 11000ms)
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
nw.WaitTime = 20000;
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// Now show the NotifyWindow.
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
nw.Notify();
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
以上代码实现的窗体效果如下图
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体

程序员也可以通过nw.Blend and nw.StringFormat来定制背景, Text 和 Title 

[特色]

NotifyWindow的特色在于它自己完成了绘制工作.背景是由Graphics.FillRectangle 和LinearGradientBrush (默认的情况)  或SolidBrush绘制的. 边框是由一系列对 Graphics.DrawRectangle 和 Graphics.DrawLine的调用完成绘制的.在Windows XP 或更新版本的启用了主题皮肤效果(Visual Styles)的操作系统中, 关闭按钮的绘制是调用 UxTheme.dll 中的DrawThemeBackground(),若没有启用主题皮肤效果,则使用 ControlPaint.DrawCaptionButton.

在此程序和类似程序中,一个难点在于如何把窗体放在最上层,但又不抢走焦点. 分别通过Form.Show() 和设置TopMost = true来激活窗体都会抢走焦点. 我们可以这样来实现:先调用ShowWindow(),再调用 SetWindowPos(),并在参数中告知操作系统不要激活窗体.

[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体const Int32 HWND_TOPMOST = -1;
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
const Int32 SWP_NOACTIVATE = 0x0010;
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
const Int32 SW_SHOWNOACTIVATE = 4;
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体[DllImport (
"user32.dll")]
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
protected static extern bool ShowWindow (IntPtr hWnd, Int32 flags);
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体[DllImport (
"user32.dll")]
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
protected static extern bool SetWindowPos (IntPtr hWnd, 
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体  Int32 hWndInsertAfter, Int32 X, Int32 Y, Int32 cx, Int32 cy, 
uint uFlags);
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// Show the window without activating it.
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
ShowWindow (this.Handle, SW_SHOWNOACTIVATE);
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
// Equivalent to setting TopMost = true, except don't activate the window.
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
SetWindowPos (this.Handle, HWND_TOPMOST, Left, Top, Width, Height, SWP_NOACTIVATE);
[CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体

 

一个类似的NotifyWindow类最初是在一个开源的项目 ChronosXP.中实现的. 后来大家觉得需要在此项目之外使用这些类似NotifyWindow的代码, 就将其修改得更一般化,拿出来可单独使用.
提供下载的代码中包括一个名为NotifyWindow2000的类, 它会在鼠标或键盘有所活动之前一直显示NotifyWindow.它用SetWindowsHookEx() 设置钩子WH_KEYBOARD_LL/WH_MOUSE_LL来监测用户活动,因此它只能在Windows 2000或更高版本的windows上运行.笔者还不知道如何在老版本的windows上实现这一点.

相关文章:

  • 2022-03-03
  • 2022-12-23
  • 2021-09-15
  • 2021-08-17
  • 2021-09-30
  • 2021-06-12
  • 2022-12-23
  • 2022-01-22
猜你喜欢
  • 2021-11-01
  • 2021-05-17
  • 2021-10-08
  • 2021-05-31
  • 2021-04-21
  • 2021-11-21
  • 2022-02-24
相关资源
相似解决方案