Эффект РОСТА в приложении VB.net - PullRequest
0 голосов
/ 14 марта 2012

Я придумал следующий код, чтобы создать эффект «GROWL», который вы видите на MAC и некоторых веб-сайтах jquery.(Пример чего-то подобного можно найти ЗДЕСЬ . Код, который я использую, прекрасно работает и прекрасно отображает сообщение (я). Однако проблема, с которой мне трудно работать, заключается в том, какдля отображения текущего сообщения НАД каждым предыдущим сообщением, которое все еще отображается на экране и имеет таймер для КАЖДОГО сообщения, которое всплывает. В настоящее время оно закрывает все окна сообщений одновременно.

Код такой:

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

Прямо сейчас оно будет отображать самое новое сообщение НИЖЕ старого сообщения. Что мне нужно изменить, чтобы оно отображало самое новоеодна вершина и продолжать работать вниз по списку, пока появляются другие окна сообщений?

Любая помощь будет отличной!

Дэвид

1 Ответ

1 голос
/ 16 марта 2012

Мне кажется, что Growl для Windows и Snarl поддерживают GNTP. Это означает, что вы можете просто реализовать библиотеку на основе GNTP VB (или использовать существующую) и поговорить с ней. :)

...