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_Harlow_MVP@msn.com> wrote in message
news:O6SDqUqNEHA.3668@TK2MSFTNGP11.phx.gbl...[color=blue]
> 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[/color]
it[color=blue]
> nicely. I don't see what I am missing from my larger sample, as I thought[/color]
I[color=blue]
> fixed my control from doing that ;-)
>
> Hope this helps
> Jay
>
>
> " SamSpade" <stillprogramming@REMOVEaol.com> wrote in message
> news:u$9sl$pNEHA.640@TK2MSFTNGP12.phx.gbl...[color=green]
> > Thanks for taking so much time to help. I don't have a lot of insight[/color][/color]
into[color=blue][color=green]
> > this but I will after I try what you suggested. If I understand I do[/color][/color]
not[color=blue][color=green]
> > need the PictureBox on the usercontrol - instead I can simply control[/color][/color]
the[color=blue][color=green]
> > 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_Harlow_MVP@msn.com> wrote in[/color][/color]
message[color=blue][color=green]
> > news:e3DLXppNEHA.556@tk2msftngp13.phx.gbl...[color=darkred]
> > > SamSpade,
> > > If you are drawing on an Image, then you are painting this image on[/color][/color][/color]
the[color=blue][color=green][color=darkred]
> > > PictureBox you should be OK. this is a form of double buffering...
> > >
> > > UserControl inherits from ScrollableControl. Which means you can make[/color][/color]
> the[color=green][color=darkred]
> > > "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"[/color][/color]
> surface[color=green][color=darkred]
> > > will cause the UserControl to scroll your "drawing" surface. You can[/color][/color]
> then[color=green][color=darkred]
> > > simply draw using the Graphics object passed in the Paint event, of[/color][/color]
> course[color=green][color=darkred]
> > > this will not support "PSet", I would use a 1x1 bitmap or a Line 1[/color][/color][/color]
pixel[color=blue][color=green][color=darkred]
> > > long if I really needed "PSet".
> > >
> > > I normally check the clipping area of the Graphics object so I only[/color][/color]
> paint[color=green][color=darkred]
> > > the part of the control, that is visible & that needs to be redrawn,[/color]
> > rather[color=darkred]
> > > then redraw the entire "drawing" surface.
> > >
> > > If you are using a PictureBox, why paint the Image, why not just set[/color][/color][/color]
the[color=blue][color=green][color=darkred]
> > > PictureBox.Image property to the image you are painting?
> > >
> > > Hope this helps
> > > Jay
> > >
> > >
> > > " SamSpade" <stillprogramming@REMOVEaol.com> wrote in message
> > > news:%23lWdELnNEHA.3452@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[/color]
> > UserControl)[color=darkred]
> > > > and want to thank you up front!
> > > >
> > > > I have a UserControl which contains a Picturebox. I thus get[/color][/color]
> picturebox[color=green][color=darkred]
> > > that
> > > > scrolls. also if the control is larger than the box, the box is[/color][/color]
> centered[color=green][color=darkred]
> > > 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[/color][/color][/color]
draw[color=blue]
> on[color=green]
> > a[color=darkred]
> > > > 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[/color][/color][/color]
As--snip[color=blue][color=green][color=darkred]
> > > > e.Graphics.DrawImage(mDocumentImage, 0, 0)
> > > > -snip
> > > >
> > > > Now I wonder if I couldn't just use the Picturebox's Image instead[/color][/color][/color]
of[color=blue]
> an[color=green][color=darkred]
> > > > additional bitmap.
> > > > Can't I draw on the Picturebox's Image like I now draw on the[/color][/color][/color]
bitmap?[color=blue][color=green][color=darkred]
> > > > 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[/color][/color][/color]
NewColor[color=blue][color=green]
> > As[color=darkred]
> > > > Color)
> > > > CType(picDocument.Image,[/color][/color][/color]
Drawing.Bitmap).SetPixel(PixelToUnitX(x),[color=blue][color=green][color=darkred]
> > > > PixelToUnitY(y), NewColor)
> > > > End Sub
> > > > Haven't used this yet but how would I do this if I used a Control[/color]
> > instead[color=darkred]
> > > > of a Picturebox?
> > > > ====
> > > > I read some of the stuff at the bobpowell site and will read more.[/color]
> > Thanks[color=darkred]
> > > > for showing me that.
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > "Jay B. Harlow [MVP - Outlook]" <Jay_Harlow_MVP@msn.com> wrote in[/color]
> > message[color=darkred]
> > > > news:%23U4%239NfNEHA.640@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[/color][/color]
> designed[color=green][color=darkred]
> > > to
> > > > > display image files. I normally create a custom control that[/color][/color]
> inherits[color=green][color=darkred]
> > > > > directly from Control or UserControl and do the painting in its[/color][/color]
> Paint[color=green][color=darkred]
> > > > event
> > > > > (OnPaint method really).
> > > > >
> > > > > Are you flat out running your code or are you trying to single[/color][/color][/color]
step[color=blue][color=green]
> > it?[color=darkred]
> > > > Are
> > > > > you on dual monitors so the debugger does not cause a repaint[/color][/color][/color]
before[color=blue][color=green]
> > the[color=darkred]
> > > > > 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[/color][/color][/color]
the[color=blue][color=green][color=darkred]
> > > > problem
> > > > > you are having?
> > > >
> > > > I looked and think it would have to be quite long.
> > > >
> > > > >
> > > > > Hope this helps
> > > >
> > > > Much
> > > >
> > > > > Jay
> > > > >
> > > > >
> > > > > " SamSpade" <stillprogramming@REMOVEaol.com> wrote in message
> > > > > news:e8y651dNEHA.3052@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[/color][/color][/color]
and[color=blue][color=green][color=darkred]
> > > 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_Harlow_MVP@msn.com> wrote[/color][/color][/color]
in[color=blue][color=green][color=darkred]
> > > > message
> > > > > > news:uzl1iucNEHA.1208@TK2MSFTNGP10.phx.gbl...
> > > > > > > SamSpade,
> > > > > > > Control.Refresh - does a Control.Invalidate immediately[/color][/color][/color]
followed[color=blue][color=green]
> > by[color=darkred]
> > > > > > > Control.Update.
> > > > > > >
> > > > > > > Control.Invalidate - invalidates a specific region of the[/color][/color]
> Control[color=green][color=darkred]
> > > > > > (defaults
> > > > > > > to entire client area) and causes a paint message to be sent[/color][/color][/color]
to[color=blue][color=green]
> > the[color=darkred]
> > > > > > control.
> > > > > > >
> > > > > > > Control.Update - causes the Paint event to occur immediately
> > > (Windows
> > > > > will
> > > > > > > normally wait until there are no other messages for the window[/color][/color]
> to[color=green][color=darkred]
> > > > > process,
> > > > > > > before raising the Paint event).
> > > > > > >
> > > > > > >
> > > > > > > Refresh can be overridden, have you overridden it to change[/color][/color][/color]
its[color=blue][color=green][color=darkred]
> > > > > 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[/color][/color][/color]
call[color=blue][color=green][color=darkred]
> > > > > Invalidate
> > > > > > 3
> > > > > > > times, you will still only receive one Paint event.
> > > > > > >
> > > > > > > Hope this helps
> > > > > > > Jay
> > > > > > >
> > > > > > > " SamSpade" <stillprogramming@REMOVEaol.com> wrote in message
> > > > > > > news:O$vEa4VNEHA.3668@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[/color]
> > paint.[color=darkred]
> > > > > > > >
> > > > > > > > What does Refresh do. I guessed it did an Invalidate and an
> > > Update.
> > > > > > > >
> > > > > > > > Can someone shed some light?
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > Thanks
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >[/color]
> >
> >[/color]
>
>[/color]