fritz_the_blank
asked on
VB.net PaintEventArgs Handling.
I am working on a graphics intensive project and would like to create a class that includes a number of drawing routines. These routines could then be called from any number of places in the code. Here's an example of the type of function that I'd like to include in the class:
Private Sub DrawEllipseGeom(
ByVal numX As Integer,
ByVal numY As Integer,
ByVal numWidth As Integer,
ByVal numHeight As Integer,
ByVal colColor As Color,
ByVal LineWidth As Long)
Dim penDraw As New Pen(Drawing.Color.Black)
Dim PenColor As Color = colColor
penDraw.Color = PenColor
penDraw.Width = LineWidth
e.graphics.DrawEllipse(pen Draw, numX, numY, numWidth, numHeight)
Me.Invalidate()
penDraw.Dispose()
End Sub
The problem I'm trying to solve concerns passing e as PaintEventArgs to the functions in the class. Is there a way to do this or do I need to rethink my approach? I understand that the example above is trivial, but some of the functions will create multiple paths, perform transformations, etc. I would prefer not to have to recreate the code on each form by overriding the paint on each form.
Any ideas?
Thank you for reading my post.
Private Sub DrawEllipseGeom(
ByVal numX As Integer,
ByVal numY As Integer,
ByVal numWidth As Integer,
ByVal numHeight As Integer,
ByVal colColor As Color,
ByVal LineWidth As Long)
Dim penDraw As New Pen(Drawing.Color.Black)
Dim PenColor As Color = colColor
penDraw.Color = PenColor
penDraw.Width = LineWidth
e.graphics.DrawEllipse(pen
Me.Invalidate()
penDraw.Dispose()
End Sub
The problem I'm trying to solve concerns passing e as PaintEventArgs to the functions in the class. Is there a way to do this or do I need to rethink my approach? I understand that the example above is trivial, but some of the functions will create multiple paths, perform transformations, etc. I would prefer not to have to recreate the code on each form by overriding the paint on each form.
Any ideas?
Thank you for reading my post.
ASKER
Thank you for answering. Let's say that I'd like to fire the code above from a button. The function expects e as PaintEventArgs as a parameter. I can't seem to pass that to the function via a click event.
Have a look at:
https://msdn.microsoft.com/en-us/library/5y289054(v=vs.110).aspx
I've not tried it but this might be what you want
' Create a Graphics object for the Control.
Dim g As Graphics = Me.CreateGraphics()
MyCustomDrawingRoutine(g)
g.Dispose()
https://msdn.microsoft.com/en-us/library/5y289054(v=vs.110).aspx
I've not tried it but this might be what you want
' Create a Graphics object for the Control.
Dim g As Graphics = Me.CreateGraphics()
MyCustomDrawingRoutine(g)
g.Dispose()
ASKER
Thank you for your comment.
I'm able to do that, but there's a big difference between using .CreateGraphics and e. as PaintEventArgs. I need to be able to create paths and figures from a variety of functions and have them work with the same event handler. This allows me to create layers, manipulate them, stack them, and then finally output them in the order needed.
I'm able to do that, but there's a big difference between using .CreateGraphics and e. as PaintEventArgs. I need to be able to create paths and figures from a variety of functions and have them work with the same event handler. This allows me to create layers, manipulate them, stack them, and then finally output them in the order needed.
If you use Invalidate in the button click then a paint event will be fired. You might have to then call your routines from the paint event after all.
However I don't understand your problem. the PaintEventArgs contains the graphics object, the rectangle needing redrawing and nothing else for drawing.
However I don't understand your problem. the PaintEventArgs contains the graphics object, the rectangle needing redrawing and nothing else for drawing.
ASKER
I'm sorry. Let me provide some code...
I override the paint handler like this:
Private Sub frmDrawTestPaint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles MyBase.Paint
Dim g As Graphics = e.Graphics
End Sub
Now, what I'd like to do is to pass g to different subroutines or functions.
I override the paint handler like this:
Private Sub frmDrawTestPaint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles MyBase.Paint
Dim g As Graphics = e.Graphics
End Sub
Now, what I'd like to do is to pass g to different subroutines or functions.
As mentioned in an earlier comment - you pass it like you would any other parameter a function requires
Private Sub frmDrawTestPaint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles MyBase.Paint
Dim g As Graphics = e.Graphics
MyCustomDrawingRoutine(g)
End Sub
Private Sub frmDrawTestPaint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles MyBase.Paint
Dim g As Graphics = e.Graphics
MyCustomDrawingRoutine(g)
End Sub
ASKER
Andy--
Thank you for staying with me! I've been away from programming for a while, and I haven't had time to study event handling in .Net as yet. So, let's say I call the routine from a form button:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
frmDrawTestPaint(Me, e)
End Sub
I receive an error indicating that the mouse click event cannot be converted to a paint event. That makes sense, but I don't know how to get around that.
Thank you for staying with me! I've been away from programming for a while, and I haven't had time to study event handling in .Net as yet. So, let's say I call the routine from a form button:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
frmDrawTestPaint(Me, e)
End Sub
I receive an error indicating that the mouse click event cannot be converted to a paint event. That makes sense, but I don't know how to get around that.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thank you very much. That's just what I needed.
Why is that a problem?