亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

深入c# GDI+簡單繪圖的具體操作步驟(三)

2020-01-24 03:17:00
字體:
來源:轉載
供稿:網友
關于這個的例子其實網上已經有這方面的資料了,但是為了文章的完整性,還是覺得有必要講解.
我們先來看一下效果:
  
                                                                                                                  (圖(圖1)
                                                      20083191642.JPG

( 圖2 )

接下來看看這是如何做到的. 
思路:聊天窗體上有一個截圖按鈕,點擊按鈕后,程序將整個屏幕畫在一個新的全屏窗體上,然后顯示這個窗體.因為是全屏的窗體,并且隱藏了菜單欄、工具欄等,所以在我們看來就好像是一個桌面的截圖,然后在這個新窗體上畫矩形,最后保存矩形中的內容并顯示在原來的聊天窗體中.
步驟:
A.新建一個窗體.命名為Catch.然后設置這個窗體的FormBorderStyle為None,WindowState為Maximized.
B.我們對代碼進行編輯:
復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace Client
{
    public partial class Catch : Form
    {
        public Catch()
        {
            InitializeComponent();
        }
        用戶變量#region 用戶變量
        private Point DownPoint = Point.Empty;//記錄鼠標按下坐標,用來確定繪圖起點
        private bool CatchFinished = false;//用來表示是否截圖完成
        private bool CatchStart = false;//表示截圖開始
        private Bitmap originBmp;//用來保存原始圖像
        private Rectangle CatchRect;//用來保存截圖的矩形
        #endregion
        //窗體初始化操作
        private void Catch_Load(object sender, EventArgs e)
        {
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
            this.UpdateStyles();
            //以上兩句是為了設置控件樣式為雙緩沖,這可以有效減少圖片閃爍的問題,關于這個大家可以自己去搜索下
            originBmp = new Bitmap(this.BackgroundImage);//BackgroundImage為全屏圖片,我們另用變量來保存全屏圖片
        }
        //鼠標右鍵點擊結束截圖
        private void Catch_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                this.DialogResult = DialogResult.OK;
                this.Close();
            }
        }
        //鼠標左鍵按下時動作
        private void Catch_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (!CatchStart)
                {//如果捕捉沒有開始
                    CatchStart = true;
                    DownPoint = new Point(e.X, e.Y);//保存鼠標按下坐標
                }
            }
        }
        private void Catch_MouseMove(object sender, MouseEventArgs e)
        {
            if (CatchStart)
            {//如果捕捉開始
                Bitmap destBmp = (Bitmap)originBmp.Clone();//新建一個圖片對象,并讓它與原始圖片相同
                Point newPoint = new Point(DownPoint.X, DownPoint.Y);//獲取鼠標的坐標
                Graphics g = Graphics.FromImage(destBmp);//在剛才新建的圖片上新建一個畫板
                Pen p = new Pen(Color.Blue,1);
                int width = Math.Abs(e.X - DownPoint.X), height = Math.Abs(e.Y - DownPoint.Y);//獲取矩形的長和寬
                if (e.X < DownPoint.X)
                {
                    newPoint.X = e.X;
                }
                if (e.Y < DownPoint.Y)
                {
                    newPoint.Y = e.Y;
                }
                CatchRect = new Rectangle(newPoint,new Size(width,height));//保存矩形
                g.DrawRectangle(p,CatchRect);//將矩形畫在這個畫板上
                g.Dispose();//釋放目前的這個畫板
                p.Dispose();
                Graphics g1 = this.CreateGraphics();//重新新建一個Graphics類
                //如果之前那個畫板不釋放,而直接g=this.CreateGraphics()這樣的話無法釋放掉第一次創建的g,因為只是把地址轉到新的g了.如同string一樣
                g1 = this.CreateGraphics();//在整個全屏窗體上新建畫板
                g1.DrawImage(destBmp,new Point(0,0));//將剛才所畫的圖片畫到這個窗體上
                //這個也可以屬于二次緩沖技術,如果直接將矩形畫在窗體上,會造成圖片抖動并且會有無數個矩形.
                g1.Dispose();
                destBmp.Dispose();//要及時釋放,不然內存將會被大量消耗

            }
        }
        private void Catch_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (CatchStart)
                {
                    CatchStart = false;
                    CatchFinished = true;

                }
            }
        }
        //鼠標雙擊事件,如果鼠標位于矩形內,則將矩形內的圖片保存到剪貼板中
        private void Catch_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left&&CatchFinished)
            {
                if (CatchRect.Contains(new Point(e.X, e.Y)))
                {
                    Bitmap CatchedBmp = new Bitmap(CatchRect.Width, CatchRect.Height);//新建一個于矩形等大的空白圖片
                    Graphics g = Graphics.FromImage(CatchedBmp);
                    g.DrawImage(originBmp, new Rectangle(0, 0, CatchRect.Width, CatchRect.Height), CatchRect, GraphicsUnit.Pixel);
                    //把orginBmp中的指定部分按照指定大小畫在畫板上
                    Clipboard.SetImage(CatchedBmp);//將圖片保存到剪貼板
                    g.Dispose();
                    CatchFinished = false;
                    this.BackgroundImage = originBmp;
                    CatchedBmp.Dispose();
                    this.DialogResult = DialogResult.OK;
                    this.Close();
                }
            }
        }
    }
}

C.創建了Catch窗體后,我們在截圖按鈕(位于聊天窗體上)上加入以下事件:
復制代碼 代碼如下:

 private void bCatch_Click(object sender, EventArgs e)
        {
            if (bCatch_HideCurrent.Checked)
            {
                this.Hide();//隱藏當前窗體
                Thread.Sleep(50);//讓線程睡眠一段時間,窗體消失需要一點時間
                Catch CatchForm = new Catch();
                Bitmap CatchBmp = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);//新建一個和屏幕大小相同的圖片        
                Graphics g = Graphics.FromImage(CatchBmp);
                g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height));//保存全屏圖片
                CatchForm.BackgroundImage = CatchBmp;//將Catch窗體的背景設為全屏時的圖片
                if (CatchForm.ShowDialog() == DialogResult.OK)
                {//如果Catch窗體結束,就將剪貼板中的圖片放到信息發送框中
                    IDataObject iData = Clipboard.GetDataObject();
                    DataFormats.Format myFormat = DataFormats.GetFormat(DataFormats.Bitmap);
                    if (iData.GetDataPresent(DataFormats.Bitmap))
                    {
                        richtextbox1.Paste(myFormat);
                        Clipboard.Clear();//清除剪貼板中的對象
                    }
                    this.Show();//重新顯示窗體
                }
            }
        }

這樣我們的截圖功能便完成了.
我想對于初學者來說如何消去第一次繪制的圖片是個比較困難的問題.如果沒有采取措施,你會發現只要你鼠標移動,就會畫一個矩形,這樣便會出現N多的矩形,而我們只是要最后的那一個.
一般解決這種問題的方法有兩種:
1.就是在繪制第二個圖形時,我們先用與底色相同的顏色將上次繪制的圖形重新繪制一下.但這往往需要底色為純色時使用.
2.我們并不直接將圖形畫在畫板上,我們用一個圖片A來保存原畫板上的圖片.然后再新建一個與圖片A相同的圖片B,將我們要繪制的圖形畫在該圖片B上,然后再將該圖片B畫在畫板上.這樣圖片A并沒有被改變.于是第二次畫的時候我們還是同樣新建一個與圖片A相同的圖片進行繪制.那么上一次的圖形就不會被保留下來.問題也就解決了.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜免费在线观看精品视频| 97视频在线观看视频免费视频| 久久噜噜噜精品国产亚洲综合| 亚洲欧洲在线看| 亚洲一区二区三区在线视频| 欧美另类极品videosbest最新版本| 欧美国产日韩中文字幕在线| 日韩亚洲欧美中文在线| 91精品国产免费久久久久久| 日韩av在线看| 国产免费一区二区三区在线能观看| 日韩精品视频在线免费观看| 91精品国产综合久久久久久久久| 日韩综合视频在线观看| 国产精品久久久久一区二区| 国产精品人成电影| 亚洲影院在线看| 国产精品视频色| 欧美日韩国产精品一区二区不卡中文| 久热精品视频在线免费观看| 正在播放欧美一区| 91丨九色丨国产在线| 国产精品久久一区| 国产一区二区精品丝袜| 欧美精品电影在线| 最近2019中文字幕在线高清| 国产精品欧美日韩一区二区| 亚洲成人网在线观看| 亚洲一区二区三区久久| 国产一区二区美女视频| 精品福利免费观看| 亚洲一区二区自拍| 九九热99久久久国产盗摄| 97超碰国产精品女人人人爽| 一本一本久久a久久精品牛牛影视| 欧洲成人性视频| 国产精品久久久久久久久影视| 精品久久久中文| 97视频免费在线观看| 色哟哟入口国产精品| 国产一区二中文字幕在线看| 国产亚洲精品久久| 一区二区三区四区在线观看视频| 国产成人涩涩涩视频在线观看| 色噜噜狠狠狠综合曰曰曰88av| 精品久久久久久亚洲精品| 成人免费福利视频| 国产午夜精品全部视频在线播放| 中文字幕v亚洲ⅴv天堂| 欧美激情精品久久久久久| 亚洲美女在线视频| 久久成人18免费网站| 97精品免费视频| 青青草国产精品一区二区| 精品久久久久久| 亚洲精品98久久久久久中文字幕| 国产精品第1页| 国产精品美女久久久久av超清| 色综合导航网站| 国模吧一区二区三区| 亚洲人成电影网站色xx| 欧美巨大黑人极品精男| 日本成人激情视频| 国产香蕉一区二区三区在线视频| 欧美性猛交xxxx久久久| 久久视频在线看| 欧美国产日韩一区二区三区| 热久久99这里有精品| 亚洲精品国产精品久久清纯直播| 亚洲精品日韩欧美| 亚洲人成在线观看网站高清| 成人久久久久爱| 5278欧美一区二区三区| 日韩电影免费观看在线| 在线看福利67194| 91社区国产高清| 亚洲精品99999| 欧美日韩在线观看视频| 日本精品久久中文字幕佐佐木| 亚洲国产精品va在线看黑人动漫| 亚洲国产天堂久久综合| 国产精品久久久久久av下载红粉| 欧美激情喷水视频| 人九九综合九九宗合| 98精品在线视频| 中文字幕在线观看日韩| 亚洲精品aⅴ中文字幕乱码| xxxxx成人.com| 国产视频精品一区二区三区| 日韩视频中文字幕| 亚洲xxxx3d| 国产91ⅴ在线精品免费观看| 夜夜嗨av色综合久久久综合网| 免费91在线视频| 精品久久久久久久久久久久久| 欧美激情一区二区三区在线视频观看| 欧美xxxx做受欧美| 91av成人在线| 91久久久久久久久久久| 欧美成人中文字幕在线| 日韩免费在线看| 欧美激情视频一区| 久久影视电视剧免费网站清宫辞电视| 日韩福利在线播放| 欧洲成人在线视频| 欧美日韩一区二区免费视频| 国产在线观看一区二区三区| 亚洲网站视频福利| 国产91对白在线播放| 91高清视频免费| 久久久久久久国产精品| 欧美国产第一页| 热99精品只有里视频精品| 久热精品在线视频| 国产欧美精品一区二区三区-老狼| 亚洲精品福利视频| 久久中文字幕一区| 欧美成年人视频网站欧美| 91高清视频免费观看| 影音先锋欧美精品| 亚洲精品国产精品自产a区红杏吧| 亚洲欧美精品中文字幕在线| 欧美日韩成人精品| 综合国产在线视频| 色悠久久久久综合先锋影音下载| 成人黄色av网| 亚洲无线码在线一区观看| 国产欧美va欧美va香蕉在| 国产香蕉精品视频一区二区三区| 国产精品成人av在线| 亚洲第一中文字幕在线观看| 社区色欧美激情 | 欧美日韩国产成人高清视频| 日韩av影片在线观看| 91精品视频在线| 一本色道久久综合亚洲精品小说| 国产精品丝袜久久久久久不卡| 国产精品第二页| 欧美性猛交xxxx| 91网站在线免费观看| 91av在线不卡| 日韩av一区在线| 国产精品久久久久av| 国产精品久久久久久久美男| 日韩二区三区在线| 激情成人在线视频| 国产精品三级在线| 91福利视频网| 精品国产自在精品国产浪潮| 欧美日韩国产综合新一区| 欧美激情国产精品| 亚洲激情久久久| 成人午夜两性视频| 亚洲色无码播放| 国产日韩亚洲欧美| 亚洲国产精品字幕| 97视频在线观看成人| 久久久久一本一区二区青青蜜月| 国产精品免费视频xxxx| 国产99久久精品一区二区 夜夜躁日日躁| 国产精国产精品| 亚洲天堂av图片| 成人444kkkk在线观看| 亚洲男人的天堂网站|