问题
I created a TransparentTableLayoutPanel:
class TransTablePanel : TableLayoutPanel
{
public TransTablePanel()
{
}
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
return createParams;
}
}
protected override void OnPaintBackground(PaintEventArgs e)
{
// Do not paint background.
}
}
And a transparent PictureBox (I tried just using BackColor = Transparent and it didn't work)
class TransPicBox : PictureBox
{
public TransPicBox()
{
}
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
return createParams;
}
}
protected override void OnPaintBackground(PaintEventArgs e)
{
// Do not paint background.
}
}
Here is the result:

First cell is the PictureBox with this paint event:
private void picBoxCompass_Paint(object sender, PaintEventArgs e)
{
Bitmap b = Properties.Resources.Compass_Rose;
float rot = PitControl.GetPitbullRotation();
e.Graphics.DrawImage(rotateImage(b, rot), 0, 0, picBoxCompass.Width, picBoxCompass.Height);
e.Graphics.DrawLine(LinePen, picBoxCompass.Width / 2, 0, picBoxCompass.Width / 2, picBoxCompass.Height / 2);
e.Graphics.FillPie(Brushes.Green, picBoxCompass.Width / 2 - 10, picBoxCompass.Height / 2 - 10, 20, 20, 0, 360);
}
And you can see that is not Transparent (Black Background) and second cell is transparent (you can see my form's background image).
How can i make the PictureBox Transparent ?
回答1:
Ok Iam adding code that worked for me. Its not very nice(I would like to hear how it could be done better), but maybe it will help you
public class TransPicBox : Control
{
public Image Image
{
get;
set;
}
public TransPicBox()
{
SetStyle(ControlStyles.AllPaintingInWmPaint |
ControlStyles.SupportsTransparentBackColor, true);
base.BackColor = Color.FromArgb(0, 0, 0, 0);//Added this because image wasnt redrawn when resizing form
}
protected override void OnPaintBackground(PaintEventArgs e)
{
}
protected override void OnPaint(PaintEventArgs e)
{
if (Image != null)
{
e.Graphics.DrawImage(Image, 0, 0, Image.Width, Image.Height);
}
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20;
return cp;
}
}
}
You will need to set Image
property.
Edit: Note: Image should be with transparent background (tested with *.png format)
Result:

来源:https://stackoverflow.com/questions/7874134/transparent-control-on-transparent-control