热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NotifyWindow:一个轻量级MSNMessenger风格的通知窗体

今天介绍一个C#程序:轻量级的MSNMessenger风格的通知窗体(winform),之所以说是轻量级,最主要是因为只支持文本.NotifyWindow:Adifferen
 

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



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

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

//  Display the text "This is a sample NotifyWindow"
NotifyWindow nw  =   new  NotifyWindow ( " This is a sample NotifyWindow " );
nw.Notify();

//  The following two lines of code will display a window that 
//  looks exactly like the one shown at the beginning of this article.
NotifyWindow nw  =   new  NotifyWindow ( " NotifyWindow "
  
" This is a sample notification created with NotifyWindow " );
nw.Notify();


有字体和颜色等选项可随意改变. 下载代码中的TestNotifyWindow应用程序可以让你和看到一些选项的设置,但下面的代码更全面地展示了所有选项的设置.
NotifyWindow nw  =   new  NotifyWindow();

nw.Text 
=   " This is the NotifyWindow text " ;
nw.Title 
=   " Title Text " ;

//  Change the background style.  Other valid 
//  styles are Solid, VerticalGradient,
//  HorizontalGradient and BackwardDiagonalGradient  
//  (Default: VerticalGradient)
nw.BackgroundStyle  =  NotifyWindow.BackgroundStyles.ForwardDiagonalGradient;

//  Change the background colors  
//  (Default: BackColor=SteelBlue, GradientColor=WhiteSmoke)
nw.BackColor  =  Color.SpringGreen;
nw.GradientColor 
=  Color.White;

//  Change the text and title colors.  (Default: ControlText)
nw.TextColor  =  Color.Blue;
nw.TitleColor 
=  Color.Black;

//  Change the color displayed when the text is pressed.  (Default: Gray)
nw.PressedColor  =  Color.Red;

//  Use non-default fonts.  If TitleFont is not set 
//  by the user, nw.Font will be used.
nw.Font  =   new  Font ( " Tahoma " 8.25F );
nw.TitleFont 
=   new  Font ( " Tahoma " 8.25F , FontStyle.Bold);

//  Change NotifyWindow size.  (Default: 130, 110)
nw.SetDimensions (nwWidth, nwHeight);

//  Do not close the NotifyWindow if the mouse 
//  cursor is over the window.  (Default: true)
nw.WaitOnMouseOver  =   true ;

//  Set up an EventHandler to be called if the text or title are clicked.
nw.TextClicked  +=   new  System.EventHandler (nwTextClicked);
nw.TitleClicked 
+=   new  System.EventHandler (nwTitleClicked);

//  Display the window for 20 seconds, or 20000ms.  (Default: 11000ms)
nw.WaitTime  =   20000 ;

//  Now show the NotifyWindow.
nw.Notify();

以上代码实现的窗体效果如下图

程序员也可以通过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(),并在参数中告知操作系统不要激活窗体.

const  Int32 HWND_TOPMOST  =   - 1 ;
const  Int32 SWP_NOACTIVATE  =   0x0010 ;
const  Int32 SW_SHOWNOACTIVATE  =   4 ;
[DllImport (
" user32.dll " )]
protected   static   extern   bool  ShowWindow (IntPtr hWnd, Int32 flags);
[DllImport (
" user32.dll " )]
protected   static   extern   bool  SetWindowPos (IntPtr hWnd, 
  Int32 hWndInsertAfter, Int32 X, Int32 Y, Int32 cx, Int32 cy, 
uint  uFlags);



//  Show the window without activating it.
ShowWindow ( this .Handle, SW_SHOWNOACTIVATE);

//  Equivalent to setting TopMost = true, except don't activate the window.
SetWindowPos ( this .Handle, HWND_TOPMOST, Left, Top, Width, Height, SWP_NOACTIVATE);

 

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

推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 解决github访问慢的问题的方法集锦
    本文总结了国内用户在访问github网站时可能遇到的加载慢的问题,并提供了解决方法,其中包括修改hosts文件来加速访问。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 本文介绍了解决mysql 5.1启动问题的方法,通过修改my.ini文件中的相关配置,包括innodb_data_home_dir和skip-innodb等,可以解决启动问题。同时还介绍了如何调整内存池来存储metadata信息。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了在序列化时如何对SnakeYaml应用格式化,包括通过设置类和DumpSettings来实现定制输出的方法。作者提供了一个示例,展示了期望的yaml生成格式,并解释了如何使用SnakeYaml的特定设置器来实现这个目标。对于正在使用SnakeYaml进行序列化的开发者来说,本文提供了一些有用的参考和指导。摘要长度为169字。 ... [详细]
  • 修复安装win10失败并提示“磁盘布局不受UEFI固件支持”的方法
    本文介绍了修复安装win10失败并提示“磁盘布局不受UEFI固件支持”的方法。首先解释了UEFI的概念和作用,然后提供了两种解决方法。第一种方法是在bios界面中将Boot Mode设置为Legacy Support,Boot Priority设置为Legacy First,并关闭UEFI。第二种方法是使用U盘启动盘进入PE系统,运行磁盘分区工具DiskGenius,将硬盘的分区表设置为gpt格式,并留出288MB的内存。最后,通过运行界面输入命令cmd来完成设置。 ... [详细]
author-avatar
于昕会_445
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有