• 0

[VB.NET] Form Redraw?


Question

this is probably extremely easy to fix, but here goes.

i'm using a graphicspen to draw on a picturebox. however, every time i minimize/move another window oveer it, it disappears. i seem to remember a .ReDraw property in VB6, but it's not there. What's the .Net equivelant?

(Visual Basic, VS.NET 2003)

Link to comment
https://www.neowin.net/forum/topic/352258-vbnet-form-redraw/
Share on other sites

8 answers to this question

Recommended Posts

  • 0
  AMDPOX said:
this is probably extremely easy to fix, but here goes.

i'm using a graphicspen to draw on a picturebox.  however, every time i minimize/move another window oveer it, it disappears.  i seem to remember a .ReDraw property in VB6, but it's not there.  What's the .Net equivelant?

(Visual Basic, VS.NET 2003)

586306143[/snapback]

.Paint() usually forces whatever component it is to redraw itself.

  • 0
  AMDPOX said:
this is probably extremely easy to fix, but here goes.

i'm using a graphicspen to draw on a picturebox.? however, every time i minimize/move another window oveer it, it disappears.? i seem to remember a .ReDraw property in VB6, but it's not there.? What's the .Net equivelant?

(Visual Basic, VS.NET 2003)

586306143[/snapback]

.Invalidate() forces a redraw

If you use .Paint() you calling the sub directly, which isn't a good idea in this situation. It shouldn't hurt anything, but it's just better practice to use .Invalidate().

  • 0

i've tried:

    Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.LocationChanged
        pD.Invalidate()
    End Sub

    Private Sub Form1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.LostFocus
        pD.Invalidate()
    End Sub

and

    Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.LocationChanged
        Form1.Invalidate()
    End Sub

    Private Sub Form1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.LostFocus
        Form1.Invalidate()
    End Sub

where pD is the picturebox. But it appears that b the Invalidate are simply clearing the the picturebox. Paint() seems to be an event, not a method....?

  • 0
  AMDPOX said:
this is probably extremely easy to fix, but here goes.

i'm using a graphicspen to draw on a picturebox.  however, every time i minimize/move another window oveer it, it disappears.  i seem to remember a .ReDraw property in VB6, but it's not there.  What's the .Net equivelant?

(Visual Basic, VS.NET 2003)

586306143[/snapback]

Are you drawing on the picture box during its paint event? If not, do so. Then, in your form's resize and/or move event, invalidate the picturebox.

Edited by weenur
  • 0
  AMDPOX said:
i have the drawing commands in the MouseDown and MouseMove events... i dont see how i could put them in .Paint() and leave the functionality the same.. :(

586311835[/snapback]

Ah, ok. Makes sense now.

You need to draw to an image to preserve state. Create a class member variable that is an Image or Bitmap, and base it on the pictureBox.

Do this in the form constructor(New sub)

Dim g1 as Graphics = Graphics.FromHwnd(picturebox1.Handle)

' declared at the class level
picImg = new Bitmap(pictureBox1.ClientRectangle.Width, pictureBox1.ClientRectangle.Height, g1)

Handle the paint event for your picturebox and use the Graphics object to draw the image.

private sub PicPaint(sender as object, e as PaintEventArgs) handles pictureBox1.Paint

  e.Graphics.DrawImage(picImg, 0, 0)

end sub

Then in your mouse handler(up, i assume), draw on the image

  	end = new PointF(e.X, e.Y);

  	dim g2 as Graphics = Graphics.FromImage(picImg)
  	g2.DrawLine(Pens.Black, begin, end) ' or whatever
  	pictureBox1.Invalidate(false)

  • 0

I'm a newbie and pretty confused at this point. I have searched quite a bit for a solution to the same problem and have not been able to understand the code you posted.

I have a form with PictureBox1 and Button1 on it. My code looks like this:

Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button5.Click
     g = PictureBox1.CreateGraphics() 
     Dim g As Graphics
     Dim pRed As New Pen(Color.Red, 2)
     g.DrawLine(pRed, x1, y1, x2, y2)
End Sub

with x1, y1, x2, y2 being coordinates of the start and end of the line. That part works, but much like AMDPOX describes, when I minimize the window, the line disappears. I see that weenur has given him a reply with some code, but I guess I don't fully understand it.

When you say

  Quote
Do this in the form constructor(New sub)
I understand what the form constructor is, but not sure how I should make the New sub.

Also, I'm not sure what you mean by

  Quote
' declared at the class level
.

Could you show me what I should do with my code, and maybe paste the entire code of the form from top to bottom? I think that would help me understand the placement of each piece of code.

Again, I'm a newbie, so thank you for your patience with my 'newbieness' :)

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • "Multiple administrations have taken a dim view of TikTok because they believe the Chinese government has access to user data." Uhhmmm... the orange faced baboon gave all our data to Musk... what's Elon going to do with it that the so-called, "feared" Chinese wouldn't? Personally, I'd hand my SS card over to Xi before I'd hand a glass of water to Musk who was dying of thirst. Why? Because Xi has never made it clear that he was a true threat to me... or any of us for that matter.
    • Who is teaching people how to hold writing instruments like this? Such pain
    • You can now customize the email actions toolbar in Outlook for Android and iOS by David Uzondu Microsoft has announced a new feature that will finally allow you to customize the action toolbar in Outlook for Android and iOS. For a long time, the main actions you could take on an email were stuck in a static position in the top-right corner. Deleting, archiving, or marking something as unread meant reaching your thumb all the way up there. Now, that entire bar has been moved to a, perhaps, much more sensible spot at the bottom of the screen. Here's how it works. When you open an email, you will see a new toolbar at the bottom of the screen. This bar holds several actions you can take, like Reply, Delete, and so on. Any commands that cannot fit are tucked away behind a "More options" button. To change the layout, you just tap that button. From there, you can tap More options (...) > Reorder, as shown in the following screenshot: Then, from there, you just drag and drop the actions you want onto the main bar. Once you set it, the layout stays the same across all your accounts. Now, it is not without its quirks. There are a couple of known issues, like the fact that your layout might change depending on your screen size or if you flip your phone horizontally. If your custom actions do not fit, they will get bumped to the overflow menu automatically. You will also see more grayed-out, disabled buttons than before. Microsoft says this is intentional so actions do not disappear from view entirely. This update is currently rolling out to anyone running at least Build 4.2522.0 on Android or Build 4.2522 on iOS.
    • Neat and welcome functionality...
    • Hey, some don't give a damn about STDs and gain pleasure from living animalistic lifestyles. Different strokes for different folks...
  • Recent Achievements

    • Week One Done
      dennis Nebeker earned a badge
      Week One Done
    • One Year In
      timothytoots earned a badge
      One Year In
    • One Month Later
      CHUNWEI earned a badge
      One Month Later
    • Week One Done
      TIGOSS earned a badge
      Week One Done
    • First Post
      henryj earned a badge
      First Post
  • Popular Contributors

    1. 1
      +primortal
      467
    2. 2
      +FloatingFatMan
      193
    3. 3
      ATLien_0
      165
    4. 4
      Xenon
      79
    5. 5
      wakjak
      72
  • Tell a friend

    Love Neowin? Tell a friend!