C# 表單(WinForm)半透明(背景有顏色),元件不透明
C# 表單(WinForm)半透明(背景有顏色),元件不透明
資料來源: https://www.twblogs.net/a/5d03a528bd9eee487be9938c
GITHUB: https://github.com/jash-git/CS_OnlyWinFormTranslucent_project
main_FrmBackgound.Designer.cs
namespace CS_OnlyWinFormTranslucent
{
partial class main_FrmBackgound
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(189, 108);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(229, 136);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// main_FrmBackgound
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Controls.Add(this.button1);
this.Name = "main_FrmBackgound";
this.Text = "main_FrmBackgound";
this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
this.ResumeLayout(false);
}
#endregion
private Button button1;
}
}
main_FrmBackgound.cs
namespace CS_OnlyWinFormTranslucent
{
public partial class main_FrmBackgound : Form
{
public static Form frmBack;
sub_FrmForeground sub_FrmForeground;//
public main_FrmBackgound()
{
InitializeComponent();
}
public static void Show(Form frmTop, Form frmBackOwner, Color frmBackColor, double frmBackOpacity)
{
// I´ºµ¡Åé³]¸m
frmBack.FormBorderStyle = FormBorderStyle.None;
frmBack.StartPosition = FormStartPosition.Manual;
frmBack.ShowIcon = false;
frmBack.ShowInTaskbar = false;
frmBack.Opacity = frmBackOpacity;
frmBack.BackColor = frmBackColor;
frmBack.Owner = frmBackOwner;
frmBack.Size = frmTop.Size;
frmBack.Location = frmTop.Location;
// ³»³¡µ¡Åé³]¸m
frmTop.Owner = frmBack;
frmTop.StartPosition = FormStartPosition.Manual;
frmTop.LocationChanged += (o, args) => { frmBack.Location = frmTop.Location; };
// Åã¥Üµ¡Åé
frmTop.Show();
frmBack.Show();
}
private void button1_Click(object sender, EventArgs e)
{
if(frmBack!=null)
{
frmBack.Close();
frmBack = null;
}
frmBack = new Form();
sub_FrmForeground = new sub_FrmForeground();
Show(sub_FrmForeground, this, Color.Yellow, 0.8);
}
}
}
sub_FrmForeground.Designer.cs
namespace CS_OnlyWinFormTranslucent
{
partial class sub_FrmForeground
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(41, 31);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(287, 38);
this.label1.TabIndex = 0;
this.label1.Text = "我是在半透明窗體上";
//
// button1
//
this.button1.Location = new System.Drawing.Point(86, 108);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(624, 141);
this.button1.TabIndex = 1;
this.button1.Text = "我是在半透明窗體上";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// sub_FrmForeground
//
this.AutoScaleDimensions = new System.Drawing.SizeF(18F, 38F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(128)))));
this.ClientSize = new System.Drawing.Size(874, 552);
this.Controls.Add(this.button1);
this.Controls.Add(this.label1);
this.Font = new System.Drawing.Font("Microsoft JhengHei UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.Margin = new System.Windows.Forms.Padding(6);
this.Name = "sub_FrmForeground";
this.Text = "sub_FrmForeground";
this.Load += new System.EventHandler(this.sub_FrmForeground_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private Label label1;
private Button button1;
}
}
sub_FrmForeground.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CS_OnlyWinFormTranslucent
{
public partial class sub_FrmForeground : Form
{
#region win32 api
private const uint WS_EX_LAYERED = 0x80000;
private const int WS_EX_TRANSPARENT = 0x20;
private const int GWL_STYLE = (-16);
private const int GWL_EXSTYLE = (-20);
private const int LWA_ALPHA = 0;
[DllImport("user32", EntryPoint = "SetWindowLong")]
private static extern uint SetWindowLong(
IntPtr hwnd,
int nIndex,
uint dwNewLong
);
[DllImport("user32", EntryPoint = "GetWindowLong")]
private static extern uint GetWindowLong(
IntPtr hwnd,
int nIndex
);
[DllImport("user32", EntryPoint = "SetLayeredWindowAttributes")]
private static extern int SetLayeredWindowAttributes(
IntPtr hwnd,
int crKey,
int bAlpha,
int dwFlags
);
#endregion
public void SetPenetrate()
{
GetWindowLong(this.Handle, GWL_EXSTYLE);
SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED);
}
public sub_FrmForeground()
{
InitializeComponent();
}
private void sub_FrmForeground_Load(object sender, EventArgs e)
{
// 設置背景全透明
this.BackColor = Color.AliceBlue;
this.TransparencyKey = Color.AliceBlue;
// 設置窗體鼠標穿透
//SetPenetrate();
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
結果圖:
