C# 如何制作具有真正透明背景的面板

C# 如何制作具有真正透明背景的面板,c#,winforms,transparent-control,C#,Winforms,Transparent Control,我在Photoshop中制作了一个透明的图像,它的不透明度为30% 现在我试图把它作为一个面板的背景图像。但普通面板即使将背景颜色设置为透明,也会显示白色/控制背景。面板不会变得透明 所以我找到了TransparentPanel类。但是当我使用面板时,我看不到我放在代码中的图像 我知道我可以将面板的背景色设置为与父面板相同的颜色。但在这种情况下,这将不起作用,因为面板位于视频控件的顶部,图像在其下方移动 所以我需要一个完全透明的控件来显示图像。我不确定是否可以使用此TransparentPane

我在Photoshop中制作了一个透明的图像,它的不透明度为30%

现在我试图把它作为一个面板的背景图像。但普通面板即使将背景颜色设置为透明,也会显示白色/控制背景。面板不会变得透明

所以我找到了
TransparentPanel
类。但是当我使用面板时,我看不到我放在代码中的图像

我知道我可以将面板的背景色设置为与父面板相同的颜色。但在这种情况下,这将不起作用,因为面板位于视频控件的顶部,图像在其下方移动

所以我需要一个完全透明的控件来显示图像。我不确定是否可以使用此
TransparentPanel

void addpanel()
{
TransparentPanel tp=新的TransparentPanel();
//面板tp=新面板();
tp.BackColor=Color.Transparent;//这不起作用?
tp.BackgroundImage=Properties.Resources.arrowup;//此图像为30%透明图像(不透明度30%)
tp.尺寸=新系统图纸尺寸(54,54);
tp.位置=新点(20,20);
面板219.控件。添加(tp);
tp.BringToFront();
}
公共类透明面板:面板
{
受保护的重写CreateParams CreateParams
{
得到
{
CreateParams cp=base.CreateParams;
cp.ExStyle |=0x00000020;//WS_EX_透明
返回cp;
}
}
PaintBackground上受保护的覆盖无效(PaintEventArgs e)
{
//根据背景(e);
}
}
编辑

我也尝试过这种方法。但面板中的图像仍然具有几乎为白色的控制颜色。你应该看穿我的图像,因为它是30%的不透明度

void addpanel()
{
TransparentPanel tp=新的TransparentPanel(Properties.Resources.arrowup);
tp.BackColor=Color.Transparent;//这不起作用?
tp.尺寸=新系统图纸尺寸(54,54);
tp.位置=新点(20,20);
面板219.控件。添加(tp);
tp.BringToFront();
}
类透明面板:面板
{
公共映像映像{get;set;}
公共透明电话(图像img)
{
图像=img;
设置样式(ControlStyles.AllPaintingInWmPaint|
ControlStyles.OptimizedDubleBuffer|
ControlStyles.ResizerDraw|
ControlStyles.SupportsTransparentBackColor|
ControlStyles.UserPaint,true);
UpdateStyles();
}
PaintBackground上受保护的覆盖无效(PaintEventArgs pevent)
{
//基于paintbackground(pevent);
}
受保护的覆盖无效OnPaint(PaintEventArgs pevent)
{
基础漆(pevent);
var g=事件图形;
如果(父项!=null)
{
矩形rect=新矩形(左、上、宽、高);
g、 TranslateTransform(-rect.X,-rect.Y);
尝试
{
使用(PaintEventArgs-pea)=
新的PaintEventArgs(g,rect))
{
pea.Graphics.SetClip(rect);
InvokePaintBackground(父级,pea);
调用点(父项,pea);
}
}
最后
{
g、 TranslateTransform(rect.X,rect.Y);
}
}
如果(图像!=null)
{
g、 SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.HighQuality;
var rectSrc=新矩形(0,0,image.Width,image.Height);
var rectDes=新矩形(0,0,宽度,高度);
//if(State==MouseState.Over)
直肠充气(2,2);
g、 DrawImage(image、rectDes、rectSrc、GraphicsUnit.Pixel);
}
}
}
应该是这样的:

公共类透明面板:面板
{
公共透明电话()
{
设置样式(ControlStyles.AllPaintingInWmPaint|
ControlStyles.OptimizedDubleBuffer|
ControlStyles.ResizerDraw|
ControlStyles.SupportsTransparentBackColor|
ControlStyles.UserPaint,true);
UpdateStyles();
}
公共透明电话(图像img):this()
{
图像=img;
}
公共映像映像{get;set;}
PaintBackground上受保护的覆盖无效(PaintEventArgs pevent)
{
//基于paintbackground(pevent);
}
受保护的覆盖无效OnPaint(PaintEventArgs pevent)
{
基础漆(pevent);
var g=事件图形;
如果(父项!=null)
{
矩形rect=新矩形(左、上、宽、高);
g、 TranslateTransform(-rect.X,-rect.Y);
尝试
{
使用(PaintEventArgs-pea)=
新的PaintEventArgs(g,rect))
{
pea.Graphics.SetClip(rect);
InvokePaintBackground(父级,pea);
调用点(父项,pea);
}
}
最后
{
g、 TranslateTransform(rect.X,rect.Y);
}
}
如果(图像!=null)
{
g、 SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.HighQuality;
var rectSrc=新矩形(0,0,image.Width,image.Height);
var rectDes=新矩形(0,0,宽度,高度);
//if(State==MouseState.Over)
直肠充气(2,2);
g、 DrawImage(image、rectDes、rectSrc、GraphicsUnit.Pixel);
}
}
}

试着看看这个:谢谢,我在帖子中试过了:
panel1.BackColor=Color.FromArgb(0,0,0,0)但这与以下结果相同:
panel1.BackColor=Color.Transparent。面板并没有变得真正透明。面板似乎有一个控件背景色,几乎是白色的
Co