Winform 透明窗体一二三谈

097c54b91c49677d7402e5c89e4585c1.png

前言

915e08368a34a8998745a72634af6d0a.png

ef8a951064baf2c8565056aa3392e8d9.png

   在Winform应用程序开发中,透明窗体是一种常见的界面设计需求。透明窗体可以为用户提供更加个性化和美观的用户界面体验,同时也可以实现一些特殊效果,如半透明、渐变等。

本文将介绍一些实现Winform透明窗体的方式,帮助读者在自己的应用程序中实现透明窗体效果。我们将探讨两种常见的方法:使用窗体属性和使用API函数。

7a5dc39ee87b003b0b609dddc25aa9a4.png

18fe975d9132d3507434cd1fc1b568ac.gif

90f3aefdc58a6fcc88649f43d38d66b7.jpeg

开发环境:.NET Framework版本:4.8

开发工具:Visual Studio 2022

7cf5fc788c5c25dfc648501d1925bac3.png

实现步骤

e7efbf561430f717e7dc5e735be92087.png

  1. 第一种方式:使用窗体的Opacity属性,取值范围0~1,0表示透明,1表示不透明,除了设置0外基本是保持了窗体所有的事件(移动、点击、获取焦点、输入等),不过窗体上的所有子控件都会跟随窗体的透明度

private void button1_Click(object sender, EventArgs e)
        {
            Form2 form = new Form2();
            form.Show();
        }




 public Form2()
        {
            InitializeComponent();
            Opacity = 0.5;
        }
  1. 第二种方式:窗体的TransparencyKey属性,取值为颜色属性,当设置此属性后,窗体上所有与TransparencyKey属性一样的颜色都会变成透明色(包括子控件)

public Form3()
        {
            InitializeComponent();
            TransparencyKey = Color.Black;
            BackColor = Color.Black;
        }
  1. 第三种方式:使用WinApi函数,效果与设置Opacity属性类似,但针对事件处理等没有Opacity效果好

private const int WS_EX_LAYERED = 0x80000;
        private const int LWA_COLORKEY = 0x1;
        private const int LWA_ALPHA = 0x2;


        [DllImport("user32.dll")]
        private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);


        [DllImport("user32.dll")]
        private static extern bool SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte alpha, int dwFlags);
        public Form4()
        {
            InitializeComponent();


            // 设置窗体样式为 WS_EX_LAYERED
            SetWindowLong(this.Handle, -20, WS_EX_LAYERED);


            // 设置颜色键和透明度
            SetLayeredWindowAttributes(this.Handle, Color.Black.ToArgb(), 128, LWA_COLORKEY | LWA_ALPHA);
        }

最后,还有一种需求,就是如何实现窗体半透明而控件不透明的情况,这里建议使用窗体叠加来实现会简单些。

57f48158e6633f2072ed7f5f601b7ef3.png

实现效果

70ed6ad719cd87a21c833efcbbe9ca6f.png

f7005d18d7e34dac3140412266588138.gif

-

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值