我想出了以下代码来产生一个像你在MAC和一些jquery网站上看到的“GROWL”效果。 (可以找到类似这样的例子HERE。我使用的代码效果很好并且显示消息就好了。但是,我正在努力工作的问题是如何显示当前消息ABOVE仍然在屏幕上的每个上一条消息,并且有一个弹出的EACH消息的计时器。目前它同时关闭所有消息框。
代码是这样的:
Public Class Growl
Private _notifications As New Dictionary(Of Integer, msgWindow)
Private _count As Integer = 0
Public Sub Remove(ByVal Sender As msgWindow, ByVal e As EventArgs)
_notifications.Remove(CInt(Val(Sender.Name.Substring(1))))
RefreshPositions()
End Sub
Private Sub RefreshPositions()
Dim _top As Integer = 5
For a As Integer = 0 To _count
If _notifications.ContainsKey(a) Then
_notifications.Item(a).Top = _top
_top += _notifications.Item(a).Height + 5
End If
Next
End Sub
Public Sub ShowMessageBox(ByVal typeOfNotification As String, ByVal msg As String)
Dim x As New msgWindow
x.Name = "m" & _count
AddHandler x.FormClosed, AddressOf Remove
_notifications(_count) = x
_count += 1
x.showMessageBox(typeOfNotification, msg)
RefreshPositions()
End Sub
End Class
这就是消息框代码本身:
Public Class msgWindow
Public howLong As Integer
Public theType As String
Private loading As Boolean
Dim intX As Integer = Screen.PrimaryScreen.Bounds.Width
Protected Overrides Sub OnPaint(ByVal pe As System.Windows.Forms.PaintEventArgs)
Dim pn As New Pen(Color.DarkGreen)
If theType = "OK" Then
pn.Color = Color.DarkGreen
ElseIf theType = "ERR" Then
pn.Color = Color.DarkRed
Else
pn.Color = Color.DarkOrange
End If
Me.Width = intX
Me.Left = 0
Me.Top = 0
lblSaying.Width = Me.Width
pn.Width = 2
pe.Graphics.DrawRectangle(pn, 0, 0, Me.Width, Me.Height)
pn = Nothing
End Sub
Public Sub showMessageBox(ByVal typeOfBox As String, ByVal theMessage As String)
Me.Opacity = 0
Me.Show()
'Me.SetDesktopLocation(My.Computer.Screen.WorkingArea.Width - 300, 15)
Me.loading = True
theType = typeOfBox
lblSaying.Text = theMessage
If typeOfBox = "OK" Then
Me.BackColor = Color.FromArgb(192, 255, 192)
ElseIf typeOfBox = "ERR" Then
Me.BackColor = Color.FromArgb(255, 192, 192)
Else
Me.BackColor = Color.FromArgb(255, 255, 192)
End If
If Len(theMessage) <= 30 Then
howLong = 4000
ElseIf Len(theMessage) >= 31 And Len(theMessage) <= 80 Then
howLong = 7000
ElseIf Len(theMessage) >= 81 And Len(theMessage) <= 100 Then
howLong = 12000
Else
howLong = 17000
End If
Me.opacityTimer.Start()
End Sub
Private Sub opacityTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles opacityTimer.Tick
If Me.loading Then
Me.Opacity += 0.8
If Me.Opacity >= 0.8 Then
Me.opacityTimer.Stop()
Me.opacityTimer.Dispose()
Pause(howLong)
Me.loading = False
Me.opacityTimer.Start()
End If
Else
Me.Opacity -= 0.08
If Me.Opacity <= 0 Then
Me.opacityTimer.Stop()
Me.Close()
End If
End If
End Sub
Public Sub Pause(ByVal Milliseconds As Integer)
Dim dTimer As Date
dTimer = Now.AddMilliseconds(Milliseconds)
Do While dTimer > Now
Application.DoEvents()
Loop
End Sub
Private Sub lblSaying_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lblSaying.Click
Me.opacityTimer.Stop()
Me.Close()
End Sub
End Class
现在它将显示旧帖子以下的最新帖子。我需要更改什么才能显示最新的顶部并在其他消息框出现时继续沿列表工作?
任何帮助都会很棒!
大卫
答案 0 :(得分:1)
只是抬头,我相信Growl for Windows和Snarl都支持GNTP。这意味着您可以简单地实现基于GNTP VB的库(或使用现有的库)并与之交谈。 :)