前几天要做一个微信调一调的外挂,里面用到了尺子测量距离,然后就自己下载了一个电子尺,最近要升级我的跳一跳外挂,然后就准备自己做一个电子尺,嵌入到我的外挂里面,在嵌入到我的外挂之前,我自己做了一个完整版的电子纸,相当于一个小工具,这个电子尺的制作就涉及到了在透明窗体WinForm上绘图的知识。先放图看看

 

其中第二张图片就是在透明窗体上绘图实现,在这里用到窗体的TransparencyKey属性,该属性是指绘制到窗体上时将要显示的透明的颜色,好吧,我还是给你解释解释吧,之前我看到这句话的时候也不明白,最后自己实践之后才发现原理:

我喜欢举例子,假如TransparencyKey=Color.Red;也就是说把这个属性设置为红色,那么当你在窗体上绘制红色的图案时,红色就会透明,也就是你是看不到红色的,会在红色画笔经过的地方出现透明现象(能看到你的桌面上面的东西),也就是这个属性会把红色的地方全部变成透明,这样就好理解了吧,

如果这样的话,我们就可以直接用了,怎么用呢,如果我们把我们的窗体全部涂成红色呢,那是不是就看不到窗体了,可以直接透明看到你的桌面了,这样我们就可以在这个透明窗体绘制颜色了,只要不是红色就行(因为红色会透明)

那么在这里就会有一个疑问,怎么把整个窗体改成红色呢?很好弄,只要把窗体的BackColor(背景色)改成红色不就行了。

然后就可以自由自在的在窗体上绘图了,但是这里需要注意一个细节,就是我们这里是选择的红色,你可以选择其他颜色,但是这个颜色时有条件的,也就是颜色的值R,G,B,三原色中,R不能和B是一样的值,我们选择红色时,它的RGB分别是(255,0,0),所以红色是可以的,但是你不能选择灰色和黑白色的,因为黑白色的和不同程度的灰色他们的RGB都是相等的,

有人就该问了,如果我选择的颜色R=B时会出现什么情况,答:会出现鼠标穿透的情况,你会问,鼠标穿透是什么意思,我会回答说:鼠标穿透就是你的鼠标放在窗体上面时会穿透到窗体后面,也就是只能控制窗体后面的东西,你的窗体是捕捉不到鼠标事件的,如果这样的话,在窗体上绘制图像是不是不太容易实现了。

如何通过鼠标左键触发绘制鼠标移动轨迹呢(通俗的讲就是用鼠标当铅笔用,写写画画),你可以参考这个博文,这个博文给出了具体代码,但是,这个作者没有意识到在透明窗体上画图是如此的简单,他用了复杂的方式实现的,而我只用了设置两个属性就可以实现了,哈哈哈哈哈哈哈!另外,我的电子尺的工具与源码在这里,很方便的一个小工具哦,而且界面简洁,仿电脑微信界面哦,我就是用WinForm做的,没有用到WPF就能实现这样的界面效果,有没有很酷!

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

namespace _1._2Transform
{
public partial class Form1 : Form
{

private Pen pen;//画笔
private Pen pen1;//画笔
private Graphics gs;
int x, y;
int click_x, click_y;
Boolean flag = false;
public Start s;
String distance;
public Form1(Start start)
{
InitializeComponent();
TransparencyKey = BackColor;
WindowState = FormWindowState.Maximized;//本窗体最大化

SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲

pen = new Pen(Color.Black, 1f);//画笔
pen1 = new Pen(Color.Red, 2f);//画笔
gs = this.CreateGraphics();//创建窗体画板
label2.Visible = false;
this.s=start;

}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{

flag = !flag;
if (flag == false)
{
s.Show();
s.textBox1.Text = distance;
s.textBox2.Text = click_x.ToString();
s.textBox3.Text = click_y.ToString();
s.textBox5.Text = e.X.ToString();
s.textBox4.Text = e.Y.ToString();
this.Close();
}
else
{
click_x = e.X;
click_y = e.Y;
gs.Clear(BackColor);
gs.DrawLine(pen1, new Point(click_x-10, click_y), new Point(click_x+10, click_y));
gs.DrawLine(pen1, new Point(click_x, click_y-10), new Point(click_x, click_y+10));
}

}
}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
x = e.X;
y = e.Y;

label1.Location = new Point( x+20,y+20);
label1.Text ="当前位置:"+x + "," + y;

gs.Clear(BackColor);
gs.DrawLine(pen, new Point(0,y), new Point(this.Width,y));
gs.DrawLine(pen,new Point(x,0),new Point(x,this.Height));
if (flag)
{
label2.Visible = true;
label2.Location = new Point(x+20, y-20);
distance =Math.Sqrt((x - click_x) * (x - click_x) + (y - click_y) * (y - click_y)).ToString("0.00");
label2.Text ="距离:"+ distance;
gs.DrawLine(pen1, new Point(click_x - 10, click_y), new Point(click_x + 10, click_y));
gs.DrawLine(pen1, new Point(click_x, click_y - 10), new Point(click_x, click_y + 10));
gs.DrawLine(pen, new Point(click_x, click_y), new Point(x, y));
}

// gs.DrawLine(pen,new Point())
// startpt = e.Location;

}

}
}

---------------------
作者:冯爽朗
来源:CSDN
原文:https://blog.csdn.net/mieleizhi0522/article/details/79063368
版权声明:本文为博主原创文章,转载请附上博文链接!

C#在透明窗体WinForm上面画图(电子尺小工具的实现)的更多相关文章

  1. C# 制作透明窗体

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. gdi+ 高速绘制透明窗体

    gdi+ 高速绘制透明窗体: 方法一: 1.用Iamge对象载入png资源, 2.调用drawimage函数讲图片绘制出了 3.UpdateLayeredWindow对窗体进行布局 方法二: 1.用B ...

  3. qt 获取windows 的消息(通过MFC的DLL的透明窗体转发消息)good

    qt 给win32 发送消息很简单,但是要获取windows 消息却十分复杂,最后想了一个不是很完美 但是也是以现在本人能力所能实现的唯一途径了,基本原理是 利用vc编写一个mfc 的dll ,这个d ...

  4. DSAPI实现简单的透明窗体

    代码 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim B As New Bitmap( ...

  5. 【转载】Layered Window(分层窗体,透明窗体)

    本文转载自花间醉卧<Layered Window(分层窗体,透明窗体)> //为窗体添加WS_EX_LAYERED属性,该属性使窗体支持透明 ModifyStyleEx(0, WS_EX_ ...

  6. WPF透明窗体不支持缩放解决方案

    方案一 WPF中的无边框透明窗体,由于没有边并且透明,窗体无法进行缩放操作,今天来讲解如何解决这个问题. 先说一下思路,我们先手为该窗体添加4个边,4个角用于缩放操作,然后再为他们写事件,完成拖放操作 ...

  7. Winform 动态 画图 不闪

    一.问题:解决winform动态画图闪的问题,网上搜的方法,大部分都是: “this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlSty ...

  8. win32下实现透明窗体

    最開始写透明窗体的代码,在百度了之后,找到了SetLayeredWindowAttributes()这一个函数,可是因为网上案列的缺少,使得非常多人无法非常好的使用这一个方法,我花了几天的时间写了一个 ...

  9. WPF透明窗体制作

    原文:WPF透明窗体制作 窗体的样式: <Grid Width="{Binding Width, ElementName=w}" Height="{Binding ...

随机推荐

  1. 【WIP_S9】图论算法

    创建: 2018/06/01 图的概念 有向边 有向图 无向边 无向图 点的次数: 点连接的边的数量 闭路: 起点和重点一样 连接图: 任意两点之间都可到达 无闭路有向图: 没有闭路的有向图 森林: ...

  2. windows7激活及office2013激活

    步骤 1.安装KMSpico 密码:dzit 2.安装.NET Framework 4 密码:vnus 3.解压KMSpico,运行文件,等待语音结束即可激活windows7及office2013 注 ...

  3. 商务系统的构造思路(无源码!)+如何用jsp实现点击单选框内容显示在另一个jsp页面

    敲码经验总结: 之前犯了一个错误就是,没有从底层开始学起,有啥问题,就直接博客园找源码,去CSDN找源代码,看到代码就复制粘贴,结果从新梳理知识点的时候,貌似除了复制粘贴,印象深刻的知识啥也没学到. ...

  4. 洛谷1941(dp)

    常规的dp,当前有值且碰不到管子就转移,可以连跳的操作我就加了一维表示当前是不是连跳过来的.第二问前缀和即可得(不对啊边走边记录就行了吧我冗了Orz). #include <cstdio> ...

  5. Ubuntu安装指定版本的docker

    系统环境: Ubuntu 16.0.4 安装版本: docker  17.03.2 在进现在这家公司初期,需要使用rancher部署一个k8s集群,由于rancher也是由docker启动的,加上k8 ...

  6. C51存储的优化

    我们知道51单片机只有128BYTE的RAM, 有的增强型有XRAM,此时编程时就要注意,否则就有可能超出空间 1 对于各模块的全局变量.静态变量.全局枚举型常量,静态枚举型常量.个别操作存储(如外部 ...

  7. 牛客网Java刷题知识点之方法覆盖(方法重写)和方法重载的区别

    不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?query=&asc=true&order=&page=6 ...

  8. ecshop属性 {$goods.goods_attr|nl2br} 标签的赋值相关

    1.nl2br() 函数在字符串中的每个新行 (\n) 之前插入 HTML 换行符 (<br />). 2. 如果要向{$goods.goods_attr|nl2br}赋新值,这个值是保存 ...

  9. watir-webdriver使用过程中异常

    1.在jruby版本1.6.7中,报异常:not such file to load --watir-webdriver 解决方法 :在文件的首行添加:require 'rubygems'       ...

  10. 极简的css浮动窗口

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...