TaskbarNotifier: 可换肤的 MSN Messenger-like 风格窗体( C# & VB.NET)

原创 2007年09月26日 11:41:00

这是我昨天(今天凌晨)说到的今天要介绍的TaskbarNotifier, a skinnable MSN Messenger-like popup in C# and now in VB.NET too By John O'Byrne. 可惜昨天晚上写好的那篇文章,因为过了24:00,日期只能记在今天名下了,没找到博客园里改文章时间的地方:|



[介绍]
笔者在学习C#时移植自己C++的CTaskbarNotifier类,实现了这个可换肤的 MSN Messenger-like 风格窗体, 在某种风格下看起来和MSN Messenger的弹出窗口很相像.

[特色]
支持:
1. 可定制的透明位图背景
2. 可换肤且有3种状态的关闭按钮
3. 可以点击的标题文本
4. 可以点击的内容文本
5. A selection rectangle
6. 可定制文本在不同状态(平常/鼠标悬停)下的字体,颜色
7. 有参数可控制动画移进移出的速度

[兼容性]
该类可独立运行,除.NET基础类库不需其他库.以托管代码编写,可移植性较好

[如何使用]

  • 首先,复制TaskbarNotifier.cs到你的项目目录下.
  • 在你的代码顶部加上: using CustomUIControls;
  • 在你的类中加上一个成员变量: TaskbarNotifier taskbarNotifier;
  • 在你的类构造函数中中加上:
    taskbarNotifier=new TaskbarNotifier();
    taskbarNotifier.SetBackgroundBitmap(
    "skin.bmp",
                        Color.FromArgb(
    255,0,255));
    taskbarNotifier.SetCloseBitmap(
    "close.bmp",
            Color.FromArgb(
    255,0,255),new Point(127,8));
    taskbarNotifier.TitleRectangle
    =new Rectangle(40,9,70,25);
    taskbarNotifier.ContentRectangle
    =new Rectangle(8,41,133,68);
    taskbarNotifier.TitleClick
    +=new EventHandler(TitleClick);
    taskbarNotifier.ContentClick
    +=new EventHandler(ContentClick);
    taskbarNotifier.CloseClick
    +=new EventHandler(CloseClick);

(译者:比较直观简单,略去介绍)最后一行表示窗体的弹出耗时500ms, 显示持续3000ms,消失耗时500ms.

[手册文档]

方法

void Show(string strTitle, string strContent, int nTimeToShow, int nTimeToStay, int nTimeToHide);
void Hide();
void SetBackgroundBitmap(string strFilename, Color transparencyColor);
void SetBackgroundBitmap(Image image, Color transparencyColor);
void SetCloseBitmap(string strFilename, Color transparencyColor, Point position);
void SetCloseBitmap(Image image, Color transparencyColor, Point position);

 属性

string TitleText (get/set)
string ContentText (get/set)
TaskbarStates TaskbarState (
get)
Color NormalTitleColor (
get/set)
Color HoverTitleColor (
get/set)
Color NormalContentColor (
get/set)
Color HoverContentColor (
get/set)
Font NormalTitleFont (
get/set)
Font HoverTitleFont (
get/set)
Font NormalContentFont (
get/set)
Font HoverContentFont (
get/set)
Rectangle TitleRectangle (
get/set//must be defined before calling show())
Rectangle ContentRectangle (get/set//must be defined before calling show())
bool TitleClickable (get/set) (default = false);
bool ContentClickable (get/set) (default = true);
bool CloseClickable (get/set) (default = true);
bool EnableSelectionRectangle (get/set) (default = true);

 

事件

event EventHandler CloseClick
event EventHandler TitleClick
event EventHandler ContentClick

[技术细节]
窗体的皮肤是通过给定图片和透明色来在一块区域中动态绘制实现的
protected Region BitmapToRegion(Bitmap bitmap, Color transparencyColor)
{
    
if (bitmap == null)
        
throw new ArgumentNullException("Bitmap""Bitmap cannot be null!");

    
int height = bitmap.Height;
    
int width = bitmap.Width;

    GraphicsPath path 
= new GraphicsPath();

    
for (int j=0; j<height; j++ )
        
for (int i=0; i<width; i++)
        
{
            
if (bitmap.GetPixel(i, j) == transparencyColor)
                
continue;

            
int x0 = i;

            
while ((i < width) && 
                    (bitmap.GetPixel(i, j) 
!= transparencyColor))
                i
++;

            path.AddRectangle(
new Rectangle(x0, j, i-x0, 1));
        }


    Region region 
= new Region(path);
    path.Dispose();
    
return region;
}

窗体的Refresh()使用了双缓冲技术避免闪烁
protected override void OnPaintBackground(PaintEventArgs pea)
{
    Graphics grfx 
= pea.Graphics;
    grfx.PageUnit 
= GraphicsUnit.Pixel;

    Graphics offScreenGraphics;
    Bitmap offscreenBitmap;

    offscreenBitmap 
= new Bitmap(BackgroundBitmap.Width, 
                                BackgroundBitmap.Height);
    offScreenGraphics 
= Graphics.FromImage(offscreenBitmap);

    
if (BackgroundBitmap != null)
    
{
        offScreenGraphics.DrawImage(BackgroundBitmap, 
            
00, BackgroundBitmap.Width, BackgroundBitmap.Height);
    }


    DrawCloseButton(offScreenGraphics);
    DrawText(offScreenGraphics);

    grfx.DrawImage(offscreenBitmap, 
00);
}

[Bug/限制]

为了只使用托管代码, 用了 Screen.GetWorkingArea(WorkAreaRectangle) 函数来取得任务栏位置,结果窗体总出现在WorkAreaRectangle的底部.

在C#托管代码中没找到 ShowWindow(SW_SHOWNOACTIVATE)来让窗体出现但不抢走当前窗口焦点的方法.

 

相关文章推荐

[CodeProject每日一荐] TaskbarNotifier: 可换肤的 MSN Messenger-like 风格窗体( C# & VB.NET)

这是我昨天(今天凌晨)说到的今天要介绍的TaskbarNotifier, a skinnable MSN Messenger-like popup in C# and now in VB.NET to...
  • e_wsq
  • e_wsq
  • 2012年02月12日 21:28
  • 635

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

MSN Style TaskbarNotifier【Winform Only】

首先,建立一個WINFORM的工程,建立一個窗體,代碼如下: // C# TaskbarNotifier Class v1.0// by John OByrne - 02 december 2002/...

C#实现窗口从屏幕右下角升起效果

          private void 帮助ToolStripMenuItem_Click(object sender, EventArgs e)        {            frm...

Android自定义竖直方向SeekBar

写在前面因为有这样的一个场景,需要实现竖直方向的多色进度条,然后在网上也找了下,没看到符合需要的,于是自定义了一个,效果如下: 具体实现本来想定义水平的,然后旋转一下,后来发现还不如直接定义竖直方向...

很酷的VB仿XP风格窗体换肤控件

  • 2013年07月07日 12:04
  • 61KB
  • 下载

.NET vs2010中使用IrisSkin2.dll轻松实现winForm窗体换肤功能

IrisSkin2.dll是一款很不错的免费皮肤控件,利用它可以轻松的实现winForm窗体换肤! 网上很多朋友说在VS2010中不能使用IrisSkin2.dll,我这里提供一个取巧的办法。 ...
  • 3150379
  • 3150379
  • 2015年03月19日 14:19
  • 932

C#.NET vs2010中使用IrisSkin4.dll轻松实现WinForm窗体换肤功能

C#.NET vs2010中使用IrisSkin4.dll轻松实现WinForm窗体换肤功能   IrisSkin2.dll是一款很不错的免费皮肤控件,利用它可以轻松的实现Wi...

c# 在WinForm 窗体间传递信息(转换为VB.net)

转载自《c# 在WinForm 窗体间传递信息》http://blog.sina.com.cn/s/blog_45eaa01a01014552.html,我转换为VB.net,并在方法6中讲述如何从主...

鼠标移动痕迹 C#,Delphi,VB,VB.net四种语言版本(附窗体透明)-思路和源代码(3)

鼠标移动痕迹 C#,Delphi,VB,VB.net四种语言版本(附窗体透明)-思路和源代码(1) 鼠标移动痕迹 C#,Delphi,VB,VB.net四种语言版本(附窗体透明)-思路和源代码(2)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TaskbarNotifier: 可换肤的 MSN Messenger-like 风格窗体( C# & VB.NET)
举报原因:
原因补充:

(最多只允许输入30个字)