Transparent control

O

Olo

Hi,

I have to write transparent control - simple red rectangle. When I mouse
move control should change position(left and top). The problem is when
red rectangle is moving over other controls such Buttons, PictureBoxes
it flicker.

Below is code of rectangle control :


public class TransRectangle : System.Windows.Forms.UserControl
{

public TransRectangle()
{
InitializeComponent();
}

protected override CreateParams CreateParams
{
get
{
CreateParams cp=base.CreateParams;
cp.ExStyle|=0x00000020; //WS_EX_TRANSPARENT
return cp;
}
}

//Override the OnPaintBackground event. This is ecessary //to
prevent the background to be painted.
protected override void OnPaintBackground(PaintEventArgs e)
{
// do nothing
}

protected void InvalidateEx()
{
if(Parent==null)
return;
Rectangle rc=new Rectangle(this.Location,this.Size);
Parent.Invalidate(rc,true);
}


protected override void OnMove(EventArgs e)
{
this.InvalidateEx();
Graphics g = this.CreateGraphics();
g.DrawRectangle(Pens.Red, 0, 0, this.Width - 1,
this.Height -1);
g.Dispose();

}



protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawRectangle(Pens.Red, 0, 0, this.Width - 1,
this.Height -1);
}

protected override void OnMouseMove(MouseEventArgs e)
{
this.Left += e.X;
this.Top += e.Y;
base.OnMouseMove (e);
}

public void pInvalidate()
{
this.InvalidateEx();
}

}


Regards,
Olo
 
R

RBischoff

Hello Olo,

This was a post I ran into on the web that might help you out.

Take a look at Control.SetStyle, and especially
ControlStyles.AllPaintingInWmPaint and ControlStyles.DoubleBuffer
If you set both of these styles to true for your control you'll get
double-buffering (painting to an off-screen bitmap) without having to write
additional code.

- Paul Harrington [Visual Studio .NET Performance Team]

This posting is provided "AS IS" with no warranties, and confers no rights.


Best of luck!

Your C# ally ,
RBischoff


O> Hi,
O>
O> I have to write transparent control - simple red rectangle. When I
O> mouse
O> move control should change position(left and top). The problem is
O> when
O> red rectangle is moving over other controls such Buttons,
O> PictureBoxes
O> it flicker.
O>
O> Below is code of rectangle control :
O>
O> public class TransRectangle : System.Windows.Forms.UserControl
O> {
O> public TransRectangle()
O> {
O> InitializeComponent();
O> }
O> protected override CreateParams CreateParams
O> {
O> get
O> {
O> CreateParams cp=base.CreateParams;
O> cp.ExStyle|=0x00000020; //WS_EX_TRANSPARENT
O> return cp;
O> }
O> }
O> //Override the OnPaintBackground event. This is ecessary //to
O> prevent the background to be painted.
O> protected override void OnPaintBackground(PaintEventArgs e)
O> {
O> // do nothing
O> }
O> protected void InvalidateEx()
O> {
O> if(Parent==null)
O> return;
O> Rectangle rc=new Rectangle(this.Location,this.Size);
O> Parent.Invalidate(rc,true);
O> }
O> protected override void OnMove(EventArgs e)
O> {
O> this.InvalidateEx();
O> Graphics g = this.CreateGraphics();
O> g.DrawRectangle(Pens.Red, 0, 0, this.Width - 1,
O> this.Height -1);
O> g.Dispose();
O> }
O>
O> protected override void OnPaint(PaintEventArgs e)
O> {
O> e.Graphics.DrawRectangle(Pens.Red, 0, 0, this.Width - 1,
O> this.Height -1);
O> }
O> protected override void OnMouseMove(MouseEventArgs e)
O> {
O> this.Left += e.X;
O> this.Top += e.Y;
O> base.OnMouseMove (e);
O> }
O> public void pInvalidate()
O> {
O> this.InvalidateEx();
O> }
O> }
O>
O> Regards,
O> Olo
 
O

Olo

Hi,

I tested SetStyle method but it not works for transparent control.
Beside when we set ControlStyles.AllPaintingInWmPaint flag, background
of control become black and still flicker.
this.SetStyle ( ControlStyles.DoubleBuffer |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.Opaque , true);

Regards,
Olo.
 

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