Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Invalidate() compared to Refresh()

583 views
Skip to first unread message

SamSpade

unread,
May 8, 2004, 8:39:36 PM5/8/04
to
picDocument is a picturebox

When I do picDocument.Invalidate() the box paints.

But if instead I do picDocument.Refresh() the box does not paint.

What does Refresh do. I guessed it did an Invalidate and an Update.

Can someone shed some light?

Thanks


yEaH rIgHt

unread,
May 8, 2004, 9:42:43 PM5/8/04
to
Refresh doesn't send a paint message to the control. It's telling the
control to redraw itself.


" SamSpade" <stillpro...@REMOVEaol.com> wrote in message
news:O$vEa4VNE...@TK2MSFTNGP11.phx.gbl...

Herfried K. Wagner [MVP]

unread,
May 9, 2004, 7:20:03 AM5/9/04
to
* "yEaH rIgHt" <nospam@haha> scripsit:

> Refresh doesn't send a paint message to the control. It's telling the
> control to redraw itself.

What's the difference?

(I know the difference, but I want to hear it ;-))

--
Herfried K. Wagner [MVP]
<URL:http://dotnet.mvps.org/>

SamSpade

unread,
May 9, 2004, 9:31:01 AM5/9/04
to

> > Refresh doesn't send a paint message to the control. It's telling the
> > control to redraw itself.
>
> What's the difference?
>
> (I know the difference, but I want to hear it ;-))

I don't think the >> above answers my question but let me take a stab at
answering yours.
By paint message I think he means paint event so sending a paint message
means raising the paint event.

Telling a contoll to redraw itself might means sending an Update message.

What do you think??

I know of the WindowsAPI's Invalidate and Update.
I'd guess Refresh does them both but that does not agree with what I
observed.
What I'd like to know is:
When I does picDocument.Invalidate() the box paints.

Jay B. Harlow [MVP - Outlook]

unread,
May 9, 2004, 9:43:36 AM5/9/04
to
SamSpade,
Control.Refresh - does a Control.Invalidate immediately followed by
Control.Update.

Control.Invalidate - invalidates a specific region of the Control (defaults
to entire client area) and causes a paint message to be sent to the control.

Control.Update - causes the Paint event to occur immediately (Windows will
normally wait until there are no other messages for the window to process,
before raising the Paint event).


Refresh can be overridden, have you overridden it to change its behavior?


The paint event of course is where all the drawing of your PictureBox
occurs. Note there is only one pending Paint event, if you call Invalidate 3
times, you will still only receive one Paint event.

Hope this helps
Jay

" SamSpade" <stillpro...@REMOVEaol.com> wrote in message
news:O$vEa4VNE...@TK2MSFTNGP11.phx.gbl...

yEaH rIgHt

unread,
May 9, 2004, 9:49:44 AM5/9/04
to
>By paint message I think he means paint event so sending a paint message
> means raising the paint event.

That's what I meant. It doesn't raise an paint event for you to use.


" SamSpade" <stillpro...@REMOVEaol.com> wrote in message

news:Oy2MencN...@TK2MSFTNGP12.phx.gbl...

yEaH rIgHt

unread,
May 9, 2004, 9:51:00 AM5/9/04
to
If you know the answer then why don't you tell us, master?

"Herfried K. Wagner [MVP]" <hirf-spa...@gmx.at> wrote in message
news:OThaaebN...@TK2MSFTNGP11.phx.gbl...

Jay B. Harlow [MVP - Outlook]

unread,
May 9, 2004, 9:52:26 AM5/9/04
to
Yeah Right,
Are you certain?

In VS.NET 2002 & VS.NET 2003 Refresh calls Invalidate & Update methods, the
Update method sends the paint message to the control.

For details see:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWindowsFormsControlClassInvalidateTopic1.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWindowsFormsControlClassUpdateTopic.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWindowsFormsControlClassRefreshTopic.asp


Or are you using Mono? Is it different in Mono? Or are you simply stating
that Refresh does not directly send the paint message, that it sends it
indirectly via the Update?

Just curious
Jay

"yEaH rIgHt" <nospam@haha> wrote in message
news:109r34g...@corp.supernews.com...

Herfried K. Wagner [MVP]

unread,
May 9, 2004, 9:58:05 AM5/9/04
to
* "yEaH rIgHt" <nospam@haha> scripsit:
> If you know the answer then why don't you tell us, master?

Because Jay has already done it ;-).

yEaH rIgHt

unread,
May 9, 2004, 10:05:18 AM5/9/04
to
Jay, you're right. I made a stupid blunder. I had a button click event with
the ReFresh method in it but I was hitting the wrong button. I guess I
shouldn't answer questions late at night. D'OH!!!


"Jay B. Harlow [MVP - Outlook]" <Jay_Har...@msn.com> wrote in message
news:eQAkezcN...@TK2MSFTNGP09.phx.gbl...

Jay B. Harlow [MVP - Outlook]

unread,
May 9, 2004, 10:21:26 AM5/9/04
to
Yes, I know what you mean about answering questions late at night...

Jay

"yEaH rIgHt" <nospam@haha> wrote in message

news:109seks...@corp.supernews.com...


> Jay, you're right. I made a stupid blunder. I had a button click event
with
> the ReFresh method in it but I was hitting the wrong button. I guess I
> shouldn't answer questions late at night. D'OH!!!
>
>
> "Jay B. Harlow [MVP - Outlook]" <Jay_Har...@msn.com> wrote in message
> news:eQAkezcN...@TK2MSFTNGP09.phx.gbl...
> > Yeah Right,
> > Are you certain?
> >

<<snip>>


SamSpade

unread,
May 9, 2004, 11:51:23 AM5/9/04
to
Thanks for the info.


I had two statements, The Invalidate one and the Refresh one.
I'd comment one of them out and run.
Tried it a few times and it always painted with the Invalidate and never
with the Refresh.
So I wanted to be sure they worked as I thought.
Now that I know for sure I'll keep looking to see what else is happening to
confuse the issue.
It won't be the first time some seemly paradox got resolved.

Thanks again


"Jay B. Harlow [MVP - Outlook]" <Jay_Har...@msn.com> wrote in message

news:uzl1iucN...@TK2MSFTNGP10.phx.gbl...

Jay B. Harlow [MVP - Outlook]

unread,
May 9, 2004, 2:28:53 PM5/9/04
to
SamSpade,
How are you "painting" on the PictureBox?

Does the following from the GDI+ FAQ help?
http://www.bobpowell.net/pictureboxhowto.htm

The GDI+ FAQ itself can be found at:
http://www.bobpowell.net/faqmain.htm

Rather then attempt to paint on a PictureBox, which is really designed to
display image files. I normally create a custom control that inherits
directly from Control or UserControl and do the painting in its Paint event
(OnPaint method really).

Are you flat out running your code or are you trying to single step it? Are
you on dual monitors so the debugger does not cause a repaint before the
Refresh itself causes the repaint?

Can you post a short 15-20 line program that fully demonstrates the problem
you are having?

Hope this helps
Jay


" SamSpade" <stillpro...@REMOVEaol.com> wrote in message

news:e8y651dN...@TK2MSFTNGP12.phx.gbl...

SamSpade

unread,
May 10, 2004, 5:40:03 AM5/10/04
to
Jay, You have given me much to think about. Before I answer your questions
I wonder about my basic design (which really came from a VB6 UserControl)
and want to thank you up front!

I have a UserControl which contains a Picturebox. I thus get picturebox that
scrolls. also if the control is larger than the box, the box is centered and
has a colored area around it.

If I drew directly on the Usercontrol how would I get scrollbars to appear.
Wouldn't the control just clip?

==================


To make the picturebox persistent I do not draw on it but rather draw on a
bitmap using a Graphics object obtained as follows:

Public Function PicCreateGraphics() As Graphics
'Client should dispose this
PicCreateGraphics = Graphics.FromImage(mDocumentImage)
End Function

and do:
Private Sub picDocument_Paint(ByVal sender As Object, ByVal e As--snip
e.Graphics.DrawImage(mDocumentImage, 0, 0)
-snip

Now I wonder if I couldn't just use the Picturebox's Image instead of an
additional bitmap.
Can't I draw on the Picturebox's Image like I now draw on the bitmap?
And to get presistance do:
e.Graphics.DrawImage(mMyPicturebox.Image, 0, 0)
=======================

The only nonControl thing I use from the PictureBox is the Image.
The following is an example (picDocument is the Picturebox):
Public Sub PSet(ByVal x As Integer, ByVal y As Integer, ByVal NewColor As
Color)
CType(picDocument.Image, Drawing.Bitmap).SetPixel(PixelToUnitX(x),
PixelToUnitY(y), NewColor)
End Sub
Haven't used this yet but how would I do this if I used a Control instead
of a Picturebox?
====
I read some of the stuff at the bobpowell site and will read more. Thanks
for showing me that.

"Jay B. Harlow [MVP - Outlook]" <Jay_Har...@msn.com> wrote in message

news:%23U4%239NfN...@TK2MSFTNGP12.phx.gbl...


> SamSpade,
> How are you "painting" on the PictureBox?
>
> Does the following from the GDI+ FAQ help?
> http://www.bobpowell.net/pictureboxhowto.htm
>
> The GDI+ FAQ itself can be found at:
> http://www.bobpowell.net/faqmain.htm
>
> Rather then attempt to paint on a PictureBox, which is really designed to
> display image files. I normally create a custom control that inherits
> directly from Control or UserControl and do the painting in its Paint
event
> (OnPaint method really).
>
> Are you flat out running your code or are you trying to single step it?
Are
> you on dual monitors so the debugger does not cause a repaint before the
> Refresh itself causes the repaint?

Single stepping with single montior - never gave this a thought!

>
> Can you post a short 15-20 line program that fully demonstrates the
problem
> you are having?

I looked and think it would have to be quite long.

>
> Hope this helps

Much

Jay B. Harlow [MVP - Outlook]

unread,
May 10, 2004, 10:23:17 AM5/10/04
to
SamSpade,
If you are drawing on an Image, then you are painting this image on the
PictureBox you should be OK. this is a form of double buffering...

UserControl inherits from ScrollableControl. Which means you can make the
"drawing" surface larger then the "display" surface.

I don't have a simple example right now. Basically setting
ScrollableControl.AutoScroll to true and setting
ScrollableControl.AutoScrollMinSize to the size of your "drawing" surface
will cause the UserControl to scroll your "drawing" surface. You can then
simply draw using the Graphics object passed in the Paint event, of course
this will not support "PSet", I would use a 1x1 bitmap or a Line 1 pixel
long if I really needed "PSet".

I normally check the clipping area of the Graphics object so I only paint
the part of the control, that is visible & that needs to be redrawn, rather
then redraw the entire "drawing" surface.

If you are using a PictureBox, why paint the Image, why not just set the
PictureBox.Image property to the image you are painting?

Hope this helps
Jay


" SamSpade" <stillpro...@REMOVEaol.com> wrote in message

news:%23lWdELn...@TK2MSFTNGP10.phx.gbl...

SamSpade

unread,
May 10, 2004, 11:03:07 AM5/10/04
to
Thanks for taking so much time to help. I don't have a lot of insight into
this but I will after I try what you suggested. If I understand I do not
need the PictureBox on the usercontrol - instead I can simply control the
UserControls "drawing" surface.

But how should I get persistence. Should I still draw on a Bitmap and in
Paint used DrawImage to place it on the drawing surface?

Thanks again


"Jay B. Harlow [MVP - Outlook]" <Jay_Har...@msn.com> wrote in message

news:e3DLXpp...@tk2msftngp13.phx.gbl...

Jay B. Harlow [MVP - Outlook]

unread,
May 10, 2004, 11:40:46 AM5/10/04
to
SamSpade,
If you need persistence in the form of an image file, then yes it might be
easier to draw on the image first, then use DrawImage in the Paint event.

Which actually simplifies the example ;-)

In your user control's constructor you should use the following:
' Stop the flicker
Me.SetStyle(ControlStyles.UserPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.ResizeRedraw, True)
Me.UpdateStyles()

In your user control you can add the following:

Private m_image As Image

Public Property Image() As Image
Get
Return m_image
End Get
Set(ByVal value As Image)
m_image = value
If value Is Nothing Then
Me.AutoScrollMinSize = Size.Empty
Else
Me.AutoScrollMinSize = m_image.Size
End If
End Set
End Property

Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
If Image Is Nothing Then Exit Sub
e.Graphics.DrawImage(m_image, 0, 0)
End Sub

In my main form I have

Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
Dim image As New Bitmap(600, 600)
Dim gr As Graphics = Graphics.FromImage(image)
Dim pageUnit As GraphicsUnit = gr.PageUnit
Dim bounds As RectangleF = image.GetBounds(pageUnit)
gr.FillRectangle(Brushes.White, bounds)
For x As Integer = 0 To 600 Step 25
For y As Integer = 0 To 600 Step 25
gr.DrawLine(Pens.Blue, x, 0, x, y)
gr.DrawLine(Pens.Blue, 0, y, x, y)
Next
Next
gr.Dispose()
Me.SamSpadeControl1.Image = image
End Sub

However! I am missing something as scrolling the image is not repainting it
nicely. I don't see what I am missing from my larger sample, as I thought I
fixed my control from doing that ;-)

Hope this helps
Jay


" SamSpade" <stillpro...@REMOVEaol.com> wrote in message

news:u$9sl$pNEH...@TK2MSFTNGP12.phx.gbl...

SamSpade

unread,
May 10, 2004, 12:32:21 PM5/10/04
to
Thanks a lot. You won't hear from me for a while because I need to study
all you've given me. Much of it is new to me.


"Jay B. Harlow [MVP - Outlook]" <Jay_Har...@msn.com> wrote in message

news:O6SDqUqN...@TK2MSFTNGP11.phx.gbl...

0 new messages