C#在透明窗体WinForm上面画图(电子尺小工具的实现)
? ? ? ?前幾天要做一個(gè)微信調(diào)一調(diào)的外掛,里面用到了尺子測(cè)量距離,然后就自己下載了一個(gè)電子尺,最近要升級(jí)我的跳一跳外掛,然后就準(zhǔn)備自己做一個(gè)電子尺,嵌入到我的外掛里面,在嵌入到我的外掛之前,我自己做了一個(gè)完整版的電子紙,相當(dāng)于一個(gè)小工具,這個(gè)電子尺的制作就涉及到了在透明窗體WinForm上繪圖的知識(shí)。先放圖看看
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? 其中第二張圖片就是在透明窗體上繪圖實(shí)現(xiàn),在這里用到窗體的TransparencyKey屬性,該屬性是指繪制到窗體上時(shí)將要顯示的透明的顏色,好吧,我還是給你解釋解釋吧,之前我看到這句話的時(shí)候也不明白,最后自己實(shí)踐之后才發(fā)現(xiàn)原理:
? ? ? ? ? 我喜歡舉例子,假如TransparencyKey=Color.Red;也就是說(shuō)把這個(gè)屬性設(shè)置為紅色,那么當(dāng)你在窗體上繪制紅色的圖案時(shí),紅色就會(huì)透明,也就是你是看不到紅色的,會(huì)在紅色畫筆經(jīng)過的地方出現(xiàn)透明現(xiàn)象(能看到你的桌面上面的東西),也就是這個(gè)屬性會(huì)把紅色的地方全部變成透明,這樣就好理解了吧,
? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? 如果這樣的話,我們就可以直接用了,怎么用呢,如果我們把我們的窗體全部涂成紅色呢,那是不是就看不到窗體了,可以直接透明看到你的桌面了,這樣我們就可以在這個(gè)透明窗體繪制顏色了,只要不是紅色就行(因?yàn)榧t色會(huì)透明)
? ? ? 那么在這里就會(huì)有一個(gè)疑問,怎么把整個(gè)窗體改成紅色呢?很好弄,只要把窗體的BackColor(背景色)改成紅色不就行了。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? 然后就可以自由自在的在窗體上繪圖了,但是這里需要注意一個(gè)細(xì)節(jié),就是我們這里是選擇的紅色,你可以選擇其他顏色,但是這個(gè)顏色時(shí)有條件的,也就是顏色的值R,G,B,三原色中,R不能和B是一樣的值,我們選擇紅色時(shí),它的RGB分別是(255,0,0),所以紅色是可以的,但是你不能選擇灰色和黑白色的,因?yàn)楹诎咨暮筒煌潭鹊幕疑麄兊腞GB都是相等的,
? ? ? ? 有人就該問了,如果我選擇的顏色R=B時(shí)會(huì)出現(xiàn)什么情況,答:會(huì)出現(xiàn)鼠標(biāo)穿透的情況,你會(huì)問,鼠標(biāo)穿透是什么意思,我會(huì)回答說(shuō):鼠標(biāo)穿透就是你的鼠標(biāo)放在窗體上面時(shí)會(huì)穿透到窗體后面,也就是只能控制窗體后面的東西,你的窗體是捕捉不到鼠標(biāo)事件的,如果這樣的話,在窗體上繪制圖像是不是不太容易實(shí)現(xiàn)了。
? ? ? 如何通過鼠標(biāo)左鍵觸發(fā)繪制鼠標(biāo)移動(dòng)軌跡呢(通俗的講就是用鼠標(biāo)當(dāng)鉛筆用,寫寫畫畫),你可以參考這個(gè)博文,這個(gè)博文給出了具體代碼,但是,這個(gè)作者沒有意識(shí)到在透明窗體上畫圖是如此的簡(jiǎn)單,他用了復(fù)雜的方式實(shí)現(xiàn)的,而我只用了設(shè)置兩個(gè)屬性就可以實(shí)現(xiàn)了,哈哈哈哈哈哈哈!另外,我的電子尺的工具與源碼在這里,很方便的一個(gè)小工具哦,而且界面簡(jiǎn)潔,仿電腦微信界面哦,我就是用WinForm做的,沒有用到WPF就能實(shí)現(xiàn)這樣的界面效果,有沒有很酷!
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();//創(chuàng)建窗體畫板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 ="當(dāng)前位置:"+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;}} }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
總結(jié)
以上是生活随笔為你收集整理的C#在透明窗体WinForm上面画图(电子尺小工具的实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TI高精度实验室-运算放大器-第五节-带
- 下一篇: ArcGIS for JavaScrip