分享

Winform 半透明+穿透点击控件

 Csharp小记 2023-10-29 发布于江苏

前言

    如果是写一个透明或者半透明的窗体,那么可能简单的设置几个属性即可完成;但是如果写一个半透明的控件,还是略微有点小麻烦,再加上可穿透点击的话,已经不知道用什么属性可以实现了。。。

本篇主要就是实现上述功能,其使用场景是来源于之前要做一个拼图的功能,需要有一个类似九宫格指示的线条,如果不采用遮罩的方式的话,会有明显的线条痕迹(虽然最后这个方案没采用,但我觉得依然需要记录下来)






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

开发工具:Visual Studio 2022










实现步骤

  1. 首先创建一个自定义控件,然后设置不绘制背景,交给自定义绘制

public TransparentPanel()        {            InitializeComponent();            SetStyle(ControlStyles.Opaque, true);        }

  1. 创建可以设置透明度以及穿透点击的属性

 private uint opacity = 50;
[Description("透明度")] public uint Opacity { get { return opacity; } set { if (value > 100) opacity = 100; else opacity = value; } }
[Description("穿透点击")] public bool ThroughClick { get; set; } = false;
  1. OnPaint事件中绘制半透明背景,主要利用ARGB的alpha通道

 using (var brush = new SolidBrush(Color.FromArgb((int)opacity * 255 / 100, Color.Black)))            {                e.Graphics.FillRectangle(brush, ClientRectangle);            }            base.OnPaint(e);


  1. WndProc中实现穿透点击

  protected override void WndProc(ref Message m)        {            if (m.Msg == WM_NCHITTEST && ThroughClick)            {                //在同一线程当前由另一个窗口覆盖的窗口中(消息将发送到同一线程中的基础窗口,直到其中一个窗口返回不是 HTTRANSPARENT 的代码)                m.Result = (IntPtr)HTTRANSPARENT;            }            else            {                base.WndProc(ref m);            }        }



实现效果

☛☛☛点击此处下载源码☚☚☚


    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多