Я придумал следующий код для создания эффекта «GROWL», который вы видите на MAC-адресах и некоторых сайтах jquery. (например, что-то вроде этого можно найти HERE. Код, который я использую, отлично работает и отображает сообщение (-ы) просто отлично. Однако проблема, с которой мне трудно работать, заключается в том, как отображать текущее сообщение ВЫШЕ каждое предыдущее сообщение вот еще на экране и с таймером для каждого сообщения, которое выскакивает в настоящее время он закрывает все окна сообщений одновременноЭффект GROWL в приложении VB.net
код это:..
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
Прямо сейчас он отобразит новое сообщение НИЖЕ старого сообщения. Что мне нужно изменить, чтобы он отображал новейшую вершину и продолжал работать по списку вниз, когда появлялись другие окна сообщений?
Любая помощь будет замечательной!
Дэвид
http://www.growlforwindows.com/gfw/developers.aspx#integration – SpoBo