C# WINFORM 制作真正的 透明窗体 桌面画图 的完美解决方案

原创 2015年09月15日 14:31:00

通过长时间研究终于找到关于在C# WINFORM下制作真正的透明窗体在系统桌面上画图的完美解决方案;

可以避免解决与其网上其它画图工具的很多不足,网上实现思路如下几种:

1、使用API透明窗体+底层鼠标钩子可以实现,但要重新实现鼠标的监听操作,实再太麻烦了;

2、使用第三方透明窗体控件(如LayeredSkin等),也可成功但需通过UpdateLayeredWindow实现,而且记录轨迹多层画布也会出现不透明无法透视到系统桌面问题;

3、大部分画图工具都采用抓假桌面背景图进行画图,不能完全时时看到桌面其它程序运行的界面;

4、直接在透明窗体上画,使用TransparencyKey会出现透明窗体鼠标穿透现像,而使用Opacity则字迹也会被透明看不清;

5、使用Paint重绘窗体画布背色为Color.FromArgb(1, 255, 255, 255)强制透明在XP系统下可以用,但在WIN7以上系统还是会穿透,因为FrameWork底层透明操作都是使用API的SetLayeredWindowAttributes参数实现的。

以上方式我都试过,通过总结教训取长补短最终简单有效解决方案思路如下:

我的解决方案为两层透明窗体重叠,一层透明窗体showForm显示图像(TransparencyKey因为鼠标穿透,但字迹显示清楚正常),用另一层窗体drawForm做绘图轨迹(Opacity鼠标不穿透,可以不必显示图像),两个都为透明窗体,Opacity透明绘图层的轨迹在透明窗体TransparencyKey图画层上显示,直接上代码:

drawForm.cs只新建窗体drawForm即可,可以不用写其它代码,功能都在showForm中完成;

showForm.cs如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;


namespace draw
{
    public partial class showForm : Form
    {
        private drawForm df;//透明窗体不穿透鼠标
        private bool startdraw = false;//是否开始画图
        private Graphics gs;//画版
        private Pen pen;//画笔
        private Point startpt;//画图起点
        public showForm()
        {
            InitializeComponent();


            WindowState = FormWindowState.Maximized;//本窗体最大化
            TransparencyKey = BackColor;//背景透明(鼠标穿透)
            DoubleBuffered = true;//双缓存处理

            df = new drawForm();//不穿透鼠标透明窗体
            //设置不穿透鼠标透明窗体画板鼠标事件为本显示画图窗体鼠标事件进行同步
            df.MouseDown += showForm_MouseDown;//鼠标按下事件
            df.MouseMove += showForm_MouseMove;//鼠标移动事件
            df.MouseUp += showForm_MouseUp;//鼠标弹起事件

            //不穿透鼠标透明窗体参数设置如下
            df.WindowState = FormWindowState.Maximized;//最大化
            df.Opacity = 0.1;//背景透明不穿透鼠标
            df.TopMost = true;//让不穿透鼠标透明窗体画板为最上层
            df.DoubleBuffered = true;//双缓存处理
            df.Show();//显示
            gs = CreateGraphics();//创建窗体画板
            pen = new Pen(Color.Black, 3f);//画笔
        }

        private void showForm_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                startdraw = true;//开始画图
                startpt = e.Location;
            }
        }

        private void showForm_MouseMove(object sender, MouseEventArgs e)
        {
            if (startdraw)
            {
                gs.DrawLine(pen, startpt, e.Location);
                startpt = e.Location;
            }
        }

        private void showForm_MouseUp(object sender, MouseEventArgs e)
        {
            startdraw = false;//结束画图
        }
    }
}


下载地址:http://download.csdn.net/detail/litongshun/9108699

C# WINFORM 使用鼠标钩子实现透明窗体桌面画图

接上次关于在C# WINFORM下制作透明窗体在系统桌面上画图方案是通过两个透明窗体实现的,现在讨论一下使用API底层鼠标钩子+透明窗体实现方法,这种实现方法比效麻烦,需要重新监听实现鼠标操作,在这儿...
  • litongshun
  • litongshun
  • 2015年09月17日 13:53
  • 2206

Winform窗体半透明,控件不透明,皮肤美化效果

  • 2012年05月10日 13:47
  • 1.79MB
  • 下载

在透明窗体上显示标准Winform控件

透明窗体指的是利用UpdateLayeredWindows函数完成窗体绘制过程的特殊窗体,采用这种技术的最大优势在于支持含Alpha通道的PNG格式图片作为背景图,从而得到非常漂亮的异型窗体。可惜的是...
  • zjarcher
  • zjarcher
  • 2011年03月21日 19:21
  • 2184

通过设置子窗体透明度,解决C# winform 子窗体设置背景图卡的问题

c是子窗体,currentSelectedTemplate.BackgroundPic是背景图片路径  绘制完背景,c显示一下就可以了c.Show(); 由于SetStyle(Control...
  • Afterwards_
  • Afterwards_
  • 2014年12月23日 10:35
  • 2206

C# 实现真正的透明控件(Windows桌面程序)

C# 实现真正的透明控件
  • yangshengchuan
  • yangshengchuan
  • 2017年02月07日 14:41
  • 4529

C#制作透明窗体效果 透视窗体的例子

  • 2013年11月20日 13:24
  • 520KB
  • 下载

c# 透明窗体

网上也看过很多做.NET窗体的例子,我只是把网上的这些东西综合了一下,主要有下面这些特点: 1、边框是半透明的,透明度可根据需要自己更改; 2、可以改变窗体的大小,改变后样式不变; ...
  • zanfeng
  • zanfeng
  • 2012年09月20日 09:35
  • 4601

[C#]桌面模式下GDI绘制(全透明背景)

有时候我们需要这样的需求:在桌面模式下当画板用,在上面写写画画,添加一些批注等。 很自然我们会想到用GDI绘制,可是用GDI,免不了要有一块“板”绘制,也就是免不了窗体,既然要在桌面模式下,那现在的...
  • luols
  • luols
  • 2014年04月16日 17:25
  • 7071

C#绘制半透明窗体,只让窗体背景半透明,而窗体里面的控件不透明

        Form f = new Form(); //创建一个新窗体        Label lab = new Label(); //要显示的文本        private void ...
  • zwk_9
  • zwk_9
  • 2011年05月20日 10:15
  • 4652

C#按钮及窗体透明设置

C# 实现透明窗体及透明按钮效果 源码   2011-03-12 01:25:12|  分类: C#.NET |  标签:透明窗体  c#  透明按钮  关闭特效   |字号大中小 订阅 ...
  • xiaopangzi_3
  • xiaopangzi_3
  • 2013年03月07日 10:35
  • 1695
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# WINFORM 制作真正的 透明窗体 桌面画图 的完美解决方案
举报原因:
原因补充:

(最多只允许输入30个字)