By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
434,795 Members | 1,242 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 434,795 IT Pros & Developers. It's quick & easy.

Invalidate() compared to Refresh()

P: n/a
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


Nov 20 '05 #1
Share this Question
Share on Google+
17 Replies


P: n/a
Refresh doesn't send a paint message to the control. It's telling the
control to redraw itself.
" SamSpade" <st**************@REMOVEaol.com> wrote in message
news:O$**************@TK2MSFTNGP11.phx.gbl...
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

Nov 20 '05 #2

P: n/a
* "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/>
Nov 20 '05 #3

P: n/a
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.
But if instead I do picDocument.Refresh() the box does not paint.

Nov 20 '05 #4

P: n/a
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" <st**************@REMOVEaol.com> wrote in message
news:O$**************@TK2MSFTNGP11.phx.gbl...
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

Nov 20 '05 #5

P: n/a
>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" <st**************@REMOVEaol.com> wrote in message
news:Oy**************@TK2MSFTNGP12.phx.gbl...
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.
But if instead I do picDocument.Refresh() the box does not paint.

Nov 20 '05 #6

P: n/a
If you know the answer then why don't you tell us, master?

"Herfried K. Wagner [MVP]" <hi***************@gmx.at> wrote in message
news:OT**************@TK2MSFTNGP11.phx.gbl...
* "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/>

Nov 20 '05 #7

P: n/a
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/de...dateTopic1.asp

http://msdn.microsoft.com/library/de...pdateTopic.asp

http://msdn.microsoft.com/library/de...freshTopic.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:10*************@corp.supernews.com...
Refresh doesn't send a paint message to the control. It's telling the
control to redraw itself.
" SamSpade" <st**************@REMOVEaol.com> wrote in message
news:O$**************@TK2MSFTNGP11.phx.gbl...
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


Nov 20 '05 #8

P: n/a
* "yEaH rIgHt" <nospam@haha> scripsit:
If you know the answer then why don't you tell us, master?


Because Jay has already done it ;-).

--
Herfried K. Wagner [MVP]
<URL:http://dotnet.mvps.org/>
Nov 20 '05 #9

P: n/a
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]" <Ja************@msn.com> wrote in message
news:eQ**************@TK2MSFTNGP09.phx.gbl...
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/de...dateTopic1.asp
http://msdn.microsoft.com/library/de...pdateTopic.asp
http://msdn.microsoft.com/library/de...freshTopic.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:10*************@corp.supernews.com...
Refresh doesn't send a paint message to the control. It's telling the
control to redraw itself.
" SamSpade" <st**************@REMOVEaol.com> wrote in message
news:O$**************@TK2MSFTNGP11.phx.gbl...
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



Nov 20 '05 #10

P: n/a
Yes, I know what you mean about answering questions late at night...

Jay

"yEaH rIgHt" <nospam@haha> wrote in message
news:10*************@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]" <Ja************@msn.com> wrote in message
news:eQ**************@TK2MSFTNGP09.phx.gbl...
Yeah Right,
Are you certain?

<<snip>>
Nov 20 '05 #11

P: n/a
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]" <Ja************@msn.com> wrote in message
news:uz**************@TK2MSFTNGP10.phx.gbl...
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" <st**************@REMOVEaol.com> wrote in message
news:O$**************@TK2MSFTNGP11.phx.gbl...
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


Nov 20 '05 #12

P: n/a
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" <st**************@REMOVEaol.com> wrote in message
news:e8**************@TK2MSFTNGP12.phx.gbl...
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]" <Ja************@msn.com> wrote in message
news:uz**************@TK2MSFTNGP10.phx.gbl...
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" <st**************@REMOVEaol.com> wrote in message
news:O$**************@TK2MSFTNGP11.phx.gbl...
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



Nov 20 '05 #13

P: n/a
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]" <Ja************@msn.com> wrote in message
news:%2*****************@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
" SamSpade" <st**************@REMOVEaol.com> wrote in message
news:e8**************@TK2MSFTNGP12.phx.gbl...
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]" <Ja************@msn.com> wrote in message
news:uz**************@TK2MSFTNGP10.phx.gbl...
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" <st**************@REMOVEaol.com> wrote in message
news:O$**************@TK2MSFTNGP11.phx.gbl...
> 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
>
>
>
>



Nov 20 '05 #14

P: n/a
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" <st**************@REMOVEaol.com> wrote in message
news:%2****************@TK2MSFTNGP10.phx.gbl...
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]" <Ja************@msn.com> wrote in message
news:%2*****************@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
" SamSpade" <st**************@REMOVEaol.com> wrote in message
news:e8**************@TK2MSFTNGP12.phx.gbl...
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]" <Ja************@msn.com> wrote in message news:uz**************@TK2MSFTNGP10.phx.gbl...
> 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" <st**************@REMOVEaol.com> wrote in message
> news:O$**************@TK2MSFTNGP11.phx.gbl...
> > 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
> >
> >
> >
> >
>
>



Nov 20 '05 #15

P: n/a
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]" <Ja************@msn.com> wrote in message
news:e3*************@tk2msftngp13.phx.gbl...
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" <st**************@REMOVEaol.com> wrote in message
news:%2****************@TK2MSFTNGP10.phx.gbl...
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]" <Ja************@msn.com> wrote in message news:%2*****************@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
" SamSpade" <st**************@REMOVEaol.com> wrote in message
news:e8**************@TK2MSFTNGP12.phx.gbl...
> 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]" <Ja************@msn.com> wrote in

message
> news:uz**************@TK2MSFTNGP10.phx.gbl...
> > 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" <st**************@REMOVEaol.com> wrote in message
> > news:O$**************@TK2MSFTNGP11.phx.gbl...
> > > 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
> > >
> > >
> > >
> > >
> >
> >
>
>



Nov 20 '05 #16

P: n/a
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" <st**************@REMOVEaol.com> wrote in message
news:u$*************@TK2MSFTNGP12.phx.gbl...
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]" <Ja************@msn.com> wrote in message
news:e3*************@tk2msftngp13.phx.gbl...
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" <st**************@REMOVEaol.com> wrote in message
news:%2****************@TK2MSFTNGP10.phx.gbl...
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]" <Ja************@msn.com> wrote in message news:%2*****************@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
>
>
> " SamSpade" <st**************@REMOVEaol.com> wrote in message
> news:e8**************@TK2MSFTNGP12.phx.gbl...
> > 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]" <Ja************@msn.com> wrote in
message
> > news:uz**************@TK2MSFTNGP10.phx.gbl...
> > > 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" <st**************@REMOVEaol.com> wrote in message
> > > news:O$**************@TK2MSFTNGP11.phx.gbl...
> > > > 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
> > > >
> > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>



Nov 20 '05 #17

P: n/a
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]" <Ja************@msn.com> wrote in message
news:O6**************@TK2MSFTNGP11.phx.gbl...
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" <st**************@REMOVEaol.com> wrote in message
news:u$*************@TK2MSFTNGP12.phx.gbl...
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]" <Ja************@msn.com> wrote in message news:e3*************@tk2msftngp13.phx.gbl...
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" <st**************@REMOVEaol.com> wrote in message
news:%2****************@TK2MSFTNGP10.phx.gbl...
> 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]" <Ja************@msn.com> wrote in

message
> news:%2*****************@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
> >
> >
> > " SamSpade" <st**************@REMOVEaol.com> wrote in message
> > news:e8**************@TK2MSFTNGP12.phx.gbl...
> > > 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]" <Ja************@msn.com> wrote in > message
> > > news:uz**************@TK2MSFTNGP10.phx.gbl...
> > > > 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" <st**************@REMOVEaol.com> wrote in message
> > > > news:O$**************@TK2MSFTNGP11.phx.gbl...
> > > > > 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
> > > > >
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>



Nov 20 '05 #18

This discussion thread is closed

Replies have been disabled for this discussion.