Click here to Skip to main content
15,892,005 members
Please Sign up or sign in to vote.
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
Comments
Sergey Alexandrovich Kryukov 27-Feb-16 1:01am    
Do it not using PictireBox.
—SA

1 solution

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.
 
Share this answer
 
Comments
Sergey Alexandrovich Kryukov 27-Feb-16 1:01am    
5ed.
—SA

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900