2013-12-17 4 views
2

Это лучший способ рисовать изображения на форме? У меня есть большой опыт работы на Java и немного в VB.net. В Java есть repaint(), который можно вызвать? Существует Me.refresh(). Это то, что вы хотите вызвать, когда у вас есть что-то, чтобы добавить в форму или нарисовать форму.Метод окраски VB.NET?

Класс:

Public Class Form1 

    Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint 
     ' Create image. 
     Dim newImage As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif") 

     ' Create Point for upper-left corner of image. 
     Dim ulCorner As New Point(50, 50) 

     ' Draw image to screen. 
     e.Graphics.DrawImage(newImage, ulCorner) 

     Dim newImage2 As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif") 

     ' Create Point for upper-left corner of image. 
     Dim ulCorner2 As New Point(150, 150) 

     ' Draw image to screen. 
     e.Graphics.DrawImage(newImage2, ulCorner2) 

    End Sub 

End Class 

Я попробовал этот код здесь с помощью одной кнопки на форме с событием нажатия

Public Class Form1 
    Dim i As Integer 

    Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint 

     i = 0 

     ' Create image. 
     Dim newImage As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif") 

     ' Create Point for upper-left corner of image. 
     Dim ulCorner As New Point(50, 50) 

     ' Draw image to screen. 
     e.Graphics.DrawImage(newImage, ulCorner) 

     Dim newImage2 As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif") 

     ' Create Point for upper-left corner of image. 
     Dim ulCorner2 As New Point(150, 150) 

     ' Draw image to screen. 
     e.Graphics.DrawImage(newImage2, ulCorner2) 

     If i = 5 Then 
      ' Create image. 
      Dim newImage3 As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif") 

      ' Create Point for upper-left corner of image. 
      Dim ulCorner3 As New Point(250, 250) 

      ' Draw image to screen. 
      e.Graphics.DrawImage(newImage3, ulCorner3) 
     End If 

    End Sub 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     i = 5 
     Me.Refresh() 
    End Sub 
End Class 

Просто Попробовал этот код здесь:

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     i = 5 
     Me.Invalidate() 
End Sub 

Нового класс только Протестировано:

Public Class Form2 
    Dim newImage As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif") 
    Dim newImage2 As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif") 
    Dim newImage3 As Image = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif") 

    Private bgImage As Bitmap 
    Private srcImages As Image() 

    Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) 

     Dim img As Bitmap = Me.bgImage 

     If (img Is Nothing) Then 
      Me.bgImage = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height) 
      img = Me.bgImage 
     End If 

     If (Not Me.srcImages Is Nothing) Then 
     End If 

     MyBase.OnPaint(e) 

    End Sub 

    Private Sub _Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Me.srcImages = New Image(3 - 1) {} 
     Me.srcImages(0) = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif") 
     Me.srcImages(1) = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif") 
     Me.srcImages(2) = Image.FromFile("C:\Users\itpr13266\Desktop\Pic\article-tip.gif") 
    End Sub 

    Private Sub _Disposed(sender As Object, e As EventArgs) Handles MyBase.Disposed 
     If (Not Me.srcImages Is Nothing) Then 
      For Each img As Image In Me.srcImages 
       If (Not img Is Nothing) Then 
        img.Dispose() 
       End If 
      Next 
      Me.srcImages = Nothing 
     End If 
     If (Not Me.bgImage Is Nothing) Then 
      Me.bgImage.Dispose() 
      Me.bgImage = Nothing 
     End If 
    End Sub 

    Private Sub _Resize(sender As Object, e As EventArgs) Handles MyBase.SizeChanged, MyBase.Resize 
     If (Not Me.bgImage Is Nothing) Then 
      Me.bgImage.Dispose() 
      Me.bgImage = Nothing 
     End If 
    End Sub 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     Me.Invalidate() 
    End Sub 
End Class 
+1

Почему вы хотите нарисовать свою форму? Каково ваше требование? вы можете использовать свойства backgroundimage и backcolor – Magesh

ответ

2

Вызов Me.Invalidate() аннулирует всю поверхность элемента управления и вызывает перерисовку элемента управления.

Я также предлагаю вам не Загрузите свои изображения в каждый цикл краски. Вы можете загружать исходные изображения в событие загрузки форм и уничтожать их, когда находится форма.

Public Class Form1 

    Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) 

     Dim img As Bitmap = Me.bgImage 

     If (img Is Nothing) Then 
      Me.bgImage = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height) 
      img = Me.bgImage 
     End If 

     'TODO: Draw and paint. 
     If (Not Me.srcImages Is Nothing) Then 

     End If 

     MyBase.OnPaint(e) 

    End Sub 

    Private Sub _Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Me.srcImages = New Image(3 - 1) {} 
     Me.srcImages(0) = Image.FromFile("...") 
     Me.srcImages(1) = Image.FromFile("...") 
     Me.srcImages(2) = Image.FromFile("...") 
    End Sub 

    Private Sub _Disposed(sender As Object, e As EventArgs) Handles MyBase.Disposed 
     If (Not Me.srcImages Is Nothing) Then 
      For Each img As Image In Me.srcImages 
       If (Not img Is Nothing) Then 
        img.Dispose() 
       End If 
      Next 
      Me.srcImages = Nothing 
     End If 
     If (Not Me.bgImage Is Nothing) Then 
      Me.bgImage.Dispose() 
      Me.bgImage = Nothing 
     End If 
    End Sub 

    Private Sub _Resize(sender As Object, e As EventArgs) Handles MyBase.SizeChanged, MyBase.Resize 
     If (Not Me.bgImage Is Nothing) Then 
      Me.bgImage.Dispose() 
      Me.bgImage = Nothing 
     End If 
    End Sub 

    Private bgImage As Bitmap 
    Private srcImages As Image() 

End Class 
+0

Invalidate() - Invalidate() не работает, как я полагаю, он должен. Я добавил код выше, как тот, который вы разместили выше. Я включил свои собственные изображения и поместил одну кнопку в форму, которая должна перерисовать форму, когда я нажимаю на эту кнопку. Ничего не происходит, изображения не загружаются. Если вы можете, можете взглянуть. –

+0

@DougHauf Ссылка на ваше редактирование: вы не рисуете в методе 'OnPaint'. –

4

1-й снипп не свидетельствует о необходимости какой-либо помощи. Ничто в обработчике событий Paint не зависит от состояния класса, поэтому нет причин принудительно перерисовывать. По умолчанию картина уже достаточно хороша.

2-й снипп через искусственную переменную i. Вы всегда вызываете Me.Invalidate() в таком случае, который обозначает всю область клиента в форме, требующую перерисовки. Затем пользовательский интерфейс получает событие Paint, когда ничего более важного не требуется. Использование Me.Refresh() работает тоже, но оно тяжело и крайне редко нуждается в нем. Я не могу придумать хороший пример.

Обратите внимание, что у Invalidate() есть некоторые перегрузки, вы можете отметить только часть окна, требующую перерисовки. Это оптимизация, которая делает работу живописи более эффективной.

Как написано, ваша программа, скорее всего, потерпит крах после использования на некоторое время. Вы должны вызвать метод Dispose() загружаемых изображений. Взгляните на VB.NET , используя инструкцию. Вы захотите предварительно загрузить изображения, чтобы это не происходило во время рисования и не повторялось многократно. В соответствии с руководством по программированию Winforms настоятельно рекомендуется избегать подобных ловушек.

Смежные вопросы