Topmost window wipes graphics of window below

I have a form that contains a panel with a gradient drawn in 2 colours. I have a call to the procedure that draws the gradient in the form paint and form resize events otherwise it gets wiped out. However, I have now noticed that when a new form is opened on top, as you move the new form around it wipes out the colour gradient drawn on the form below just like a photoshop eraser tool. How can I stop this happening, do I have to start calling the gradient drawing procedure from the new form or is there another event in the original form that I need to put the call in. Hopefully ther latter, or having a gradient is going to be more trouble than its worth! Any help appreciated.
LVL 3
JeffvClaytonAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
Fernando SotoConnect With a Mentor RetiredCommented:
Hi JeffvClayton;

This sample code will draw a Gradient on the Panel control and will persist without a need to do anything else the system will handle it, so no need to place code in paint events.

Imports System.Drawing
Imports System.Drawing.Drawing2D

        Dim gradientImage As New Bitmap(Panel1.Width, Panel1.Height, Panel1.CreateGraphics)
        Dim gradientArea As Graphics = Graphics.FromImage(gradientImage)
        Dim mode As New LinearGradientMode
        mode = LinearGradientMode.Horizontal
        Dim startColor As Color = Color.Blue
        Dim endColor As Color = Color.Yellow
        Dim rect As New Rectangle(0, 0, Panel1.Width, Panel1.Height)
        Dim lgBrush As New LinearGradientBrush(rect, startColor, endColor, mode)
        gradientArea.FillRectangle(lgBrush, rect)
        Panel1.BackgroundImage = gradientImage
        If Not lgBrush Is Nothing Then
            lgBrush.Dispose()
        End If
        gradientArea.Dispose()


Fernando
0
 
Jayadev NairConnect With a Mentor Application DeveloperCommented:
Your drawing just makes the current window drawn and just left the process. Any window on its top will erase the same drawing. While using GDI, draw the same on the Paint_Event of the Panel which will solve your issue.
0
 
JeffvClaytonAuthor Commented:
Thanks for the reply compued, I have tried that out and it works fine (with a bit of flicker on the painted text on top of the gradient)

Fernando, I get a syntax error with the word imports. However, here is the code I have used (in a module) which is now called by form resize,paint,load, and panel paint. I am using VB.Net 2003. To me it looks like it basically does the same thing so I don't understand why it would be persistant!

Public Sub DrawGradient(ByVal pan As System.Windows.Forms.Control, ByVal color1 As Color, ByVal color2 As Color, ByVal mode As System.Drawing.Drawing2D.LinearGradientMode)


        If pan.Width > 0 And pan.Height > 0 Then

            Dim a As New System.Drawing.Drawing2D.LinearGradientBrush(New RectangleF(0, 0, pan.Width, pan.Height), color1, color2, mode)
            Dim g As Graphics = pan.CreateGraphics

             g.FillRectangle(a, New RectangleF(0, 0, pan.Width, pan.Height))

            Dim myBrush As New SolidBrush(Color.White)
            pan.CreateGraphics.DrawString("Company Name", pan.Font, myBrush, pan.Width - 200, 10)
            g.Dispose()

        End If
     
    End Sub
0
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
JeffvClaytonAuthor Commented:
Here is how  I call the above

DrawGradienC(Me.Panel1, Color.Gainsboro, Color.SteelBlue, Drawing.Drawing2D.LinearGradientMode.Horizontal)
0
 
Fernando SotoRetiredCommented:
My code is persistant because I create an image and then assign that image to the Panel1.BackgroundImage = gradientImage. In doing this the system will handle the painting no need to execute the code again, no flicker.

The Imports statement should not give a syntax error unless you do not have a reference to System.Drawing or System.Drawing.Drawing2D.

Fernando
0
 
JeffvClaytonAuthor Commented:
Thanks to both of you for giving 2 ways to solve the problem.


I have gone with the solution from Fernando for most of the points as I only need to draw the graphics once i.e. the graphics are persistant. I solved the Imports syntax error by putting the imports statements above the following lines


Imports System.Drawing
Imports System.Drawing.Drawing2D

Public Class Form3
    Inherits System.Windows.Forms.Form

Thanks for the help.

Regards

Jeff.
0
 
Fernando SotoRetiredCommented:
Glad I was able to help. ;=)
0
 
Jayadev NairApplication DeveloperCommented:
ThanX Jeff
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.