Transparent Panel

S

Simon

Hey gang.

I am working on making a transparent panel control. How this control works
is making itself invisible then invalidating its parent.

This works great until you get panels in panels & using auto scroll on the
Panel because the flickering that occurs when scrolling.

I am thinking this is because its invalidating a parent which invalidates
its parent etc and I believe its probably getting up to invalidating the form
level.

I am trying to achieve Panels that are transparent so if there is a
PictureBox behind them, it will show through.

As follows:

protected override void OnPaintBackground(PaintEventArgs e)
{
if (this.BackColor == Color.Transparent)
return;

base.OnPaintBackground(e);
}

protected override void OnPaint(PaintEventArgs e)
{
if (this.BackColor == Color.Transparent)
{
if (!isPaintBackgroundComplete)
{
this.Visible = false;
this.Parent.Invalidate(Bounds);
this.Parent.Update();
this.Visible = true;
isPaintBackgroundComplete = true;

return;
}
isPaintBackgroundComplete = false;
}
}

Is there a better way to achieve this? As mentioned this mostly flickers
when scrolling because I think its invalidating 2-3-4 parents up to the form
level.

Is there any PInvoke support that could help out here? I could not find
anything on google. Everything I saw was for the full framework.

I would appreciate any help.

Thanks and take care.
 
S

Simon

I can't read that post however it looks like its just doing transparent
bitmaps?

I am wanting a Panel to be transparent. So if a panel is ontop of a
PictureBox any controls in the Panel won't render a big white rectangle on
the Panel.

Thanks and take care.
 
F

Fabien

Yes ok sorry I didn't understand what you needed. I think you can't
with a panel but you can create a Form and override the OnPaint method
of your Form and draw and fill the form you want. You will obtain 2
Forms but the second one will have transparent background.

Hope this help you

BR

Fabien Decret (Device Application Development MVP)
Windows Embedded Consultant

ADENEO (ADESET)
http://www.adeneo.adetelgroup.com/ | http://fabdecret.blogspot.com/
 
S

Simon

I suggest reading my code a little further. I don't think your understanding
my question or I am misunderstanding your responses my apologies.

I want transparent panels because I want other objects behind it to be
visible. Don't be confused with a window being transparent. I do not want to
see what is in behind the application.

Panels paint their BackColor. So do many controls such as Label etc.

If you look at my code, how it "hacks" a transparent panel is by hidding
itself then invalidating its region on the Parent control thus rendering it
with the Panel "not visible" then it sets it back to visible.

By doing this, if you have a PictureBox behind the Panel, the PictureBox
shows through.

This works great until you run into a situation where painting occurs more
frequent such as scrolling. Because if you have nested panels its essentially
forcing each parent up the tree to repaint thus causing the children to
repaint as well each time.

This causes much flickering when scrolling because eventually it gets up to
the Form level.

Take a look at the code. It is very smart code I am surprised it works
however its not entirely efficient so anything that needs to repaint a few
times in a row such as when scrolling occurs it becomes very flickery.

Thanks and take care.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top