2016-08-06 4 views
0

Я новичок в мероприятиях, поэтому будьте нежны. В основном я пытаюсь нарисовать .gif на картинке и добавить его в панель flowlayout. Причина этого в том, что gif продолжает цикл, если я не учитываю фреймы и рисую их.Hookup new Picture Paint Paint Event

В принципе, я создал изображение в одном классе, и я хочу подключить событие рисования, и при запуске класса в классе основной формы произойдет пожароопасное событие. Возможно, я делаю это неправильно, может быть, это не лучшая практика, или, может быть, кто-то может предложить лучший способ сделать это. В настоящее время, когда я называю форму класса основной формой, переменные класса проходят, но я никогда не вижу, чтобы на картинке, на которой я объявлял «withevents», наступил шаг. Кроме того, событие Paint никогда не входит в это. Пожалуйста, смотрите мой код ниже

Public Class CompleteMark 
    Implements IDisposable 

    Dim WithEvents _picBox As PictureBox 

#Region "VARIABLES" 

    'Disposable variables 
    Private managedResource As System.ComponentModel.Component 
    Private unmanagedResource As IntPtr 
    Protected disposed As Boolean = False 

    'Class Variables 
    Dim _cm As New Bitmap(My.Resources.cmt) 
    Dim _currentlyAnimating As Boolean = False 
    Dim _frameCounter As Integer = 0 
    Dim _frameCount As Integer 
    Dim _frameDim As Imaging.FrameDimension 


    '_picBox = New PictureBox() 




#End Region 

    Sub New(ByVal flp As FlowLayoutPanel) 
     _picBox = New PictureBox() 
     _picBox.Size = New Size(14, 13) 
     _picBox.Margin = New Padding(0, 0, 0, 0) 
     _picBox.Name = "AnimCheckMark" 
     _picBox.Image = _cm 
     flp.Controls.Add(_picBox) 
     _picBox.Invalidate() 

     'AddHandler _picBox.Paint, AddressOf AnimCheckMark_Paint 

    End Sub 

    Private Sub OnFrameChanged(ByVal o As Object, ByVal e As EventArgs) 
     _picBox.Invalidate() 
    End Sub 

    Private Sub AnimateImage() 
     If Not _currentlyAnimating Then 
      ImageAnimator.Animate(_cm, New EventHandler(AddressOf OnFrameChanged)) 
      _currentlyAnimating = True 
     End If 
    End Sub 

    Private Sub AnimCheckMark_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles _picBox.Paint 
     _frameDim = New Imaging.FrameDimension(_cm.FrameDimensionsList(0)) 
     _frameCount = _cm.GetFrameCount(_frameDim) 

     If _frameCounter < _frameCount Then 
      AnimateImage() 
      ImageAnimator.UpdateFrames() 
      e.Graphics.DrawImage(_cm, New Point(0, 0)) 
      _frameCounter += 1 
     End If 
    End Sub 

#Region " IDisposable Support " 

    Protected Overridable Overloads Sub Dispose(
      ByVal disposing As Boolean) 
     If Not Me.disposed Then 
      If disposing Then 
       managedResource.Dispose() 
      End If 
      ' Add code here to release the unmanaged resource. 
      unmanagedResource = IntPtr.Zero 
      ' Note that this is not thread safe. 
     End If 
     Me.disposed = True 
    End Sub 

    Public Sub AnyOtherMethods() 
     If Me.disposed Then 
      Throw New ObjectDisposedException(Me.GetType().ToString, 
        "This object has been disposed.") 
     End If 
    End Sub 


    ' Do not change or add Overridable to these methods. 
    ' Put cleanup code in Dispose(ByVal disposing As Boolean). 
    Public Overloads Sub Dispose() Implements IDisposable.Dispose 
     Dispose(True) 
     GC.SuppressFinalize(Me) 
    End Sub 
    Protected Overrides Sub Finalize() 
     Dispose(False) 
     MyBase.Finalize() 
    End Sub 
#End Region 

End Class 

Тогда я новый этот класс с тестовой кнопкой на главной форме:

Private Sub btnTest_Click(sender As Object, e As EventArgs) Handles btnTest.Click 
    Dim chkMark As CompleteMark 
    chkMark = New CompleteMark(flpAdobeLbl) 
End Sub 

PictureBox создается в форме и .gif не появится, но без анимации. Может быть, я что-то упустил.

ответ

0

Огонь! Решив его, приведенный выше код отлично подходит для подключения к событию. Я просто тупо не установил точку останова в обработчике событий, поэтому VS не вступил в нее.

Очевидно, что VS будет только входить в обработчики событий, если есть точка останова.