首页 | 社区 | 博客 | 招聘 | 文章 | 新闻 | 下载 | 读书 | 代码
亲,您未登录哦! 登录 | 注册

一个Office 2003风格的通知控件(VB.NET)

打印文章

分享到:
该控件有两个基本的类组成:

  一个 form (会实际显示出来的部分).
  一个包含所有可在form中包含的属性的类.

  类包含两个timers, 一个用来控制渐隐渐出的动画效果,另一个可配置为定义弹出窗口显示多久.下面是一个演示:

fPopup.Size = Size
fPopup.Opacity = 0
fPopup.Location = _
New Point(Screen.PrimaryScreen.WorkingArea.Right_
- fPopup.Size.Width - 1, _
Screen.PrimaryScreen.WorkingArea.Bottom)
fPopup.Show()

  form在Paint事件中完成绘制. 笔者使用了一下函数来获取比指定颜色更浅/更深的颜色,但不确定是否有更好的方法.

Private Function GetDarkerColor()Function GetDarkerColor(ByVal Color As Color) As Color
Dim clNew As Color
clNew = Drawing.Color.FromArgb(255, DedValueMin0(CInt(Color.R), _
Parent.GradientPower), DedValueMin0(CInt(Color.G), _
Parent.GradientPower), DedValueMin0(CInt(Color.B), _
Parent.GradientPower))
Return clNew
End Function
为避免闪烁:
Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
Me.SetStyle(ControlStyles.ResizeRedraw, True)
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)

  [1]如何为控件实现一个隐藏窗体的方法
  在PopupNotifier.vb 类中加入:

Sub Hide()Sub Hide()
tmWait.Stop()
tmAnimation.Start()
End Sub

  在form中如此调用:

Private Sub PopupNotifier1_Close()Sub PopupNotifier1_Close() Handles PopupNotifier1.Close
PopupNotifier1.Hide()
End Sub

  [2]如何为控件实现一个定渐隐渐出速度的属性

Private iAnimationDelay As Integer = 50
<Category("Behavior"), _
DefaultValue(50)> _
Property AnimationDelay()Property AnimationDelay() As Integer
Get
Return iAnimationDelay
End Get
Set(ByVal value As Integer)
iAnimationDelay = value
End Set
End Property
Sub Popup()Sub Popup()
tmAnimation.Interval = AnimationDelay
' .... REST OF THE SUBROUTINE ....
    End Sub

  [3]如何实现类似MSN Messenger的同时处理多个提示消息的效果(向上层叠):
  写一个PopupNotifierCollection封装多个PopupNotifier,加一个YOrigin属性来控制位置

Imports System.ComponentModel
Public Class PopupNotifierCollectionClassClass PopupNotifierCollectionClass PopupNotifierCollection
Inherits CollectionBase
Sub New()Sub New()Sub New()Sub New()
End Sub
Protected Overrides Sub OnSet()Sub OnSet()Sub OnSet()Sub OnSet(ByVal index As Integer, ByVal oldValue As Object, ByVal newValue As Object)
MyBase.OnSet(index, oldValue, newValue)
End Sub
Protected Overrides Sub OnInsert()Sub OnInsert()Sub OnInsert()Sub OnInsert(ByVal index As Integer, ByVal value As Object)
MyBase.OnInsert(index, value)
End Sub
Default ReadOnly Property Item()Property Item()Property Item()Property Item(ByVal Index As Integer) As PopupNotifier
Get
Return DirectCast(List(Index), PopupNotifier)
End Get
End Property
Public Function Add()Function Add()Function Add()Function Add(ByVal value As PopupNotifier) As PopupNotifier
List.Add(value)
Return value
End Function
Public Function Contains()Function Contains()Function Contains()Function Contains(ByVal value As PopupNotifier) As Boolean
Return List.Contains(value)
End Function
Public Sub Remove()Sub Remove()Sub Remove()Sub Remove(ByVal value As PopupNotifier)
List.Remove(value)
End Sub
Public Function IndexOf()Function IndexOf()Function IndexOf()Function IndexOf(ByVal value As PopupNotifier) As Integer
Return List.IndexOf(value)
End Function
Public Shadows Sub Clear()Sub Clear()Sub Clear()Sub Clear()
MyBase.Clear()
End Sub
Sub Popup()Sub Popup()Sub Popup()Sub Popup()
For Each Item As PopupNotifier In List
Item.Popup(List.IndexOf(Item))
Next
Clear()
End Sub
End Class

Dim colPopupNotifiers As New PopupNotifierCollection
Dim pnNotifier1 As PopupNotifier = New PopupNotifier
Dim pnNotifier2 As PopupNotifier = New PopupNotifier
colPopupNotifiers.Add(pnNotifier1)
colPopupNotifiers.Add(pnNotifier2)
colPopupNotifiers.Popup()

  Popup()会调用PopupNotifier的Popup(),PopupNotifier要做一些改变:
  加入Private iOffset As Integer = 0
  在Popup()中:

Sub Popup()Sub Popup(Optional ByVal Number As Integer = 0)
tmWait.Interval = ShowDelay
fPopup.Size = Size
fPopup.Opacity = 0
iOffset = (Number * fPopup.Size.Height) + (Number * 5)
fPopup.Location = New Point(Screen.PrimaryScreen.WorkingArea.Right - fPopup.Size.Width - 1, Screen.PrimaryScreen.WorkingArea.Bottom - iOffset)
fPopup.Show()
tmAnimation.Start()
End Sub
在tmAnimation_Tick()中:
...
If fPopup.Top + fPopup.Height < Screen.PrimaryScreen.WorkingArea.Bottom - iOffset
...
If fPopup.Top > Screen.PrimaryScreen.WorkingArea.Bottom - iOffset
...

  [4]如何隐藏任务栏上的小图标
  在New中 加一句ShowInTaskbar = False.

本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( Pfan.cn )

编程爱好者论坛

本栏最新文章