C#中透明窗体的制作实现方法比较有不同的方式,本攻略将分别介绍三种用于制作透明窗体的方法,并分析比较它们的优缺点。
方式一:使用 Form 的 Opacity 属性
使用该方法,制作出的透明窗体是基于整个窗体的透明度来实现的,可使用 Form 的 Opacity 属性来设置窗体的透明程度,取值范围是0-1之间。
private void Form1_Load(object sender, EventArgs e)
{
this.Opacity = 0.5;
}
优点:使用简单,不需要太多的代码即可实现透明窗体。
缺点:该方法只能实现整个窗体的透明度控制,不能控制窗体上单独控件的透明度,且不能设置透明窗体的层级关系。
方式二:使用窗体的双缓冲技术实现透明效果
使用该方法,可通过设置ExStyles属性以及DeviceContext属性实现窗体的透明效果。
public class TransparentForm : Form
{
private const int WS_EX_TRANSPARENT = 0x00000020;
private const int WS_EX_LAYERED = 0x00080000;
private const int WS_EX_NOACTIVATE = 0x08000000;
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle |= WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_NOACTIVATE;
return createParams;
}
}
public TransparentForm()
{
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawRectangle(Pens.Black, this.ClientRectangle);
}
}
优点:可以实现窗体上单个控件和整个控件渐变的透明度控制,可以设置窗体的层级关系。
缺点:使用该方法需要编写较多的代码并且易产生闪烁的问题,需要在制作窗体时保证窗体的层级关系以及窗体每个控件的尺寸。
方式三:使用 Windows API 实现窗体透明
使用该方法,可以通过引用 Windows API 的特性,并且使用UpdateLayeredWindow函数来实现透明的窗体。
public class TransparentForm : Form
{
[DllImport("user32.dll")]
private static extern IntPtr GetDC(IntPtr handle);
[DllImport("user32.dll")]
private static extern int ReleaseDC(IntPtr handle, IntPtr hdc);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr handle, int nIndex, int dwNewLong);
[DllImport("user32.dll")]
private static extern int SetLayeredWindowAttributes(IntPtr handle, int crKey, int bAlpha, int dwFlags);
private const int GWL_EXSTYLE = -20;
private const int LWA_ALPHA = 0x00000002;
public TransparentForm()
{
this.BackColor = Color.White;
this.TransparencyKey = Color.White;
}
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle |= 0x00000020 | 0x00080000;
return createParams;
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawRectangle(Pens.Black, new Rectangle(0, 0, Width - 1, Height - 1));
}
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
SetWindowLong(this.Handle, GWL_EXSTYLE, (int)GetWindowLong(this.Handle, GWL_EXSTYLE) | 0x80000 | 0x20);
int argb = Color.White.ToArgb();
SetLayeredWindowAttributes(this.Handle, argb, 100, LWA_ALPHA);
}
}
优点:使用API调用可以精细地控制窗体的透明度,控制窗体每个控件的透明效果。
缺点:需要引用 API,写的代码比较多,容易出错,需要掌握一定的技术水平。
示例一:窗体背景透明
设置窗体背景图片透明,覆盖在其他窗体上方,添加显示内容。
public Form1()
{
InitializeComponent();
this.BackColor = Color.Black;
this.TransparencyKey = Color.Black;
}
private void Form1_Load(object sender, EventArgs e)
{
this.TopMost = true;
this.BackgroundImageLayout = ImageLayout.Zoom;
this.BackgroundImage = Image.FromFile(@"E:\background.png");
Label label = new Label
{
Text = "这是透明窗体内容",
Font = new Font("Microsoft YaHei UI", 18F, FontStyle.Regular, GraphicsUnit.Point, 134),
ForeColor = Color.White,
AutoSize = true
};
this.Controls.Add(label);
label.Location = new Point(this.Width / 2 - label.Width / 2, this.Height / 2 - label.Height / 2);
}
示例二:实现窗体的部分透明
使用示例一的代码,在 Form1 的构造函数中添加上 SetLayeredWindowAttributes 函数实现窗体的部分透明。
public Form1()
{
InitializeComponent();
this.BackColor = Color.Black;
this.TransparencyKey = Color.Black;
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent;
SetLayeredWindowAttributes(this.Handle, 0, 128, 2);
}
以上就是制作 C# 透明窗体和实现方法比较的详细攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 透明窗体制作实现方法比较分析 - Python技术站