15,996,848 members
1.00/5 (1 vote)
See more:
HI guys

I am building a Texas holdem game as my get into vb and learn project.
I have 3 picture boxes that hold the burn cards.

I found this neat code that after looking it over so much I kind of understand.

What it does is lets you set an angle to rotate your image.

Works great when i plug in the names of my picture boxes.

pbBurn1.image
pbBurn2.image
pbBurn3.image

I was trying to use the same method to loop thru all three images and rotate them all -45 degrees.
No errors in code seems to run thru instructions as expected but outputs nothing..can you please help...bellow I placed double comments on the code i tried adding to loop that never worked can someone tell me what i did wrong.

What I have tried:

VB
```Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click

''Dim BurnNum As Image = pbBurn1.Image
''Dim t As Integer = 1
''Dim count As Integer = 1
''For t = 1 To 3

''    If count = 2 Then BurnNum = pbBurn2.Image
''    If count = 3 Then BurnNum = pbBurn3.Image

' Copy the output bitmap from the source image.
Dim bm_in As New Bitmap(pbBurn2.Image)  '' Dim bm_in As New Bitmap(BurnNum)

' Make an array of points defining the
' image's corners.
Dim wid As Single = bm_in.Width
Dim hgt As Single = bm_in.Height
Dim corners As Point() = { _
New Point(0, 0), _
New Point(wid, 0), _
New Point(0, hgt), _
New Point(wid, hgt)}

' Translate to center the bounding box at the origin.
Dim cx As Single = wid / 2
Dim cy As Single = hgt / 2
Dim i As Long
For i = 0 To 3
corners(i).X -= cx
corners(i).Y -= cy
Next i

' Rotate.
Dim theta As Single = Single.Parse(-45) * PI / 180.0
Dim sin_theta As Single = Sin(theta)
Dim cos_theta As Single = Cos(theta)
Dim X As Single
Dim Y As Single
For i = 0 To 3
X = corners(i).X
Y = corners(i).Y
corners(i).X = X * cos_theta + Y * sin_theta
corners(i).Y = -X * sin_theta + Y * cos_theta
Next i

' Translate so X >= 0 and Y >=0 for all corners.
Dim xmin As Single = corners(0).X
Dim ymin As Single = corners(0).Y
For i = 1 To 3
If xmin > corners(i).X Then xmin = corners(i).X
If ymin > corners(i).Y Then ymin = corners(i).Y
Next i
For i = 0 To 3
corners(i).X -= xmin
corners(i).Y -= ymin
Next i

' Create an output Bitmap and Graphics object.
Dim bm_out As New Bitmap(CInt(-2 * xmin), CInt(-2 * ymin))
Dim gr_out As Graphics = Graphics.FromImage(bm_out)

' Drop the last corner lest we confuse DrawImage,
' which expects an array of three corners.
ReDim Preserve corners(2)

' Draw the result onto the output Bitmap.
gr_out.DrawImage(bm_in, corners)

' Display the result.
pbBurn2.Image = bm_out '' Burnnum = bm_out

''count = count + 1
''Next

End Sub```
Posted
Updated 26-Feb-16 15:57pm
v3
Sergey Alexandrovich Kryukov 27-Feb-16 1:01am
Do it not using PictireBox.
—SA

## Solution 1

The reason the image doesn't animate is because your application starts on what is normally called the "UI Thread". This thread listens for messages coming into the message queue and processes these messages into events and handles everything UI related, like redrawing controls and windows.

The problem is that your code is hogging the UI thread and blocking it from processing the WM_PAINT messages that are coming in to tell your picturebox to repaint itself with the new image.

Instead of doing it in a loop it's better to use a timer and maintain a state of the image, rotating it and telling the picturebox to use the new image. Once this code ends for this one change in time, or tick of the timer, the UI thread can process the WM_PAINT message and the picturebox can repaint with the new image.

Really, you shouldn't be using PictureBox controls at all and just paint everything yourself on either the surface of the Form or on a Panel control using the Paint event for them.

Sergey Alexandrovich Kryukov 27-Feb-16 1:01am
5ed.
—SA