亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2013年05月20日 15:40:02   作者:  
前兩篇已經(jīng)基本向大家介紹了繪圖的基本知識(shí).那么,我就用我們上兩篇所學(xué)的,做幾個(gè)例子.我們先來(lái)做一個(gè)簡(jiǎn)單的--仿QQ截圖
關(guān)于這個(gè)的例子其實(shí)網(wǎng)上已經(jīng)有這方面的資料了,但是為了文章的完整性,還是覺(jué)得有必要講解.
我們先來(lái)看一下效果:
  
                                                                                                                  (圖(圖1)
                                                      20083191642.JPG

( 圖2 )

接下來(lái)看看這是如何做到的. 
思路:聊天窗體上有一個(gè)截圖按鈕,點(diǎn)擊按鈕后,程序?qū)⒄麄€(gè)屏幕畫在一個(gè)新的全屏窗體上,然后顯示這個(gè)窗體.因?yàn)槭侨恋拇绑w,并且隱藏了菜單欄、工具欄等,所以在我們看來(lái)就好像是一個(gè)桌面的截圖,然后在這個(gè)新窗體上畫矩形,最后保存矩形中的內(nèi)容并顯示在原來(lái)的聊天窗體中.
步驟:
A.新建一個(gè)窗體.命名為Catch.然后設(shè)置這個(gè)窗體的FormBorderStyle為None,WindowState為Maximized.
B.我們對(duì)代碼進(jìn)行編輯:
復(fù)制代碼 代碼如下:

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;//記錄鼠標(biāo)按下坐標(biāo),用來(lái)確定繪圖起點(diǎn)
        private bool CatchFinished = false;//用來(lái)表示是否截圖完成
        private bool CatchStart = false;//表示截圖開(kāi)始
        private Bitmap originBmp;//用來(lái)保存原始圖像
        private Rectangle CatchRect;//用來(lái)保存截圖的矩形
        #endregion
        //窗體初始化操作
        private void Catch_Load(object sender, EventArgs e)
        {
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
            this.UpdateStyles();
            //以上兩句是為了設(shè)置控件樣式為雙緩沖,這可以有效減少圖片閃爍的問(wèn)題,關(guān)于這個(gè)大家可以自己去搜索下
            originBmp = new Bitmap(this.BackgroundImage);//BackgroundImage為全屏圖片,我們另用變量來(lái)保存全屏圖片
        }
        //鼠標(biāo)右鍵點(diǎn)擊結(jié)束截圖
        private void Catch_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                this.DialogResult = DialogResult.OK;
                this.Close();
            }
        }
        //鼠標(biāo)左鍵按下時(shí)動(dòng)作
        private void Catch_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (!CatchStart)
                {//如果捕捉?jīng)]有開(kāi)始
                    CatchStart = true;
                    DownPoint = new Point(e.X, e.Y);//保存鼠標(biāo)按下坐標(biāo)
                }
            }
        }
        private void Catch_MouseMove(object sender, MouseEventArgs e)
        {
            if (CatchStart)
            {//如果捕捉開(kāi)始
                Bitmap destBmp = (Bitmap)originBmp.Clone();//新建一個(gè)圖片對(duì)象,并讓它與原始圖片相同
                Point newPoint = new Point(DownPoint.X, DownPoint.Y);//獲取鼠標(biāo)的坐標(biāo)
                Graphics g = Graphics.FromImage(destBmp);//在剛才新建的圖片上新建一個(gè)畫板
                Pen p = new Pen(Color.Blue,1);
                int width = Math.Abs(e.X - DownPoint.X), height = Math.Abs(e.Y - DownPoint.Y);//獲取矩形的長(zhǎng)和寬
                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è)畫板上
                g.Dispose();//釋放目前的這個(gè)畫板
                p.Dispose();
                Graphics g1 = this.CreateGraphics();//重新新建一個(gè)Graphics類
                //如果之前那個(gè)畫板不釋放,而直接g=this.CreateGraphics()這樣的話無(wú)法釋放掉第一次創(chuàng)建的g,因?yàn)橹皇前训刂忿D(zhuǎn)到新的g了.如同string一樣
                g1 = this.CreateGraphics();//在整個(gè)全屏窗體上新建畫板
                g1.DrawImage(destBmp,new Point(0,0));//將剛才所畫的圖片畫到這個(gè)窗體上
                //這個(gè)也可以屬于二次緩沖技術(shù),如果直接將矩形畫在窗體上,會(huì)造成圖片抖動(dòng)并且會(huì)有無(wú)數(shù)個(gè)矩形.
                g1.Dispose();
                destBmp.Dispose();//要及時(shí)釋放,不然內(nèi)存將會(huì)被大量消耗

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

                }
            }
        }
        //鼠標(biāo)雙擊事件,如果鼠標(biāo)位于矩形內(nèi),則將矩形內(nèi)的圖片保存到剪貼板中
        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);//新建一個(gè)于矩形等大的空白圖片
                    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.創(chuàng)建了Catch窗體后,我們?cè)诮貓D按鈕(位于聊天窗體上)上加入以下事件:
復(fù)制代碼 代碼如下:

 private void bCatch_Click(object sender, EventArgs e)
        {
            if (bCatch_HideCurrent.Checked)
            {
                this.Hide();//隱藏當(dāng)前窗體
                Thread.Sleep(50);//讓線程睡眠一段時(shí)間,窗體消失需要一點(diǎn)時(shí)間
                Catch CatchForm = new Catch();
                Bitmap CatchBmp = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);//新建一個(gè)和屏幕大小相同的圖片        
                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窗體的背景設(shè)為全屏?xí)r的圖片
                if (CatchForm.ShowDialog() == DialogResult.OK)
                {//如果Catch窗體結(jié)束,就將剪貼板中的圖片放到信息發(fā)送框中
                    IDataObject iData = Clipboard.GetDataObject();
                    DataFormats.Format myFormat = DataFormats.GetFormat(DataFormats.Bitmap);
                    if (iData.GetDataPresent(DataFormats.Bitmap))
                    {
                        richtextbox1.Paste(myFormat);
                        Clipboard.Clear();//清除剪貼板中的對(duì)象
                    }
                    this.Show();//重新顯示窗體
                }
            }
        }

這樣我們的截圖功能便完成了.
我想對(duì)于初學(xué)者來(lái)說(shuō)如何消去第一次繪制的圖片是個(gè)比較困難的問(wèn)題.如果沒(méi)有采取措施,你會(huì)發(fā)現(xiàn)只要你鼠標(biāo)移動(dòng),就會(huì)畫一個(gè)矩形,這樣便會(huì)出現(xiàn)N多的矩形,而我們只是要最后的那一個(gè).
一般解決這種問(wèn)題的方法有兩種:
1.就是在繪制第二個(gè)圖形時(shí),我們先用與底色相同的顏色將上次繪制的圖形重新繪制一下.但這往往需要底色為純色時(shí)使用.
2.我們并不直接將圖形畫在畫板上,我們用一個(gè)圖片A來(lái)保存原畫板上的圖片.然后再新建一個(gè)與圖片A相同的圖片B,將我們要繪制的圖形畫在該圖片B上,然后再將該圖片B畫在畫板上.這樣圖片A并沒(méi)有被改變.于是第二次畫的時(shí)候我們還是同樣新建一個(gè)與圖片A相同的圖片進(jìn)行繪制.那么上一次的圖形就不會(huì)被保留下來(lái).問(wèn)題也就解決了.

相關(guān)文章

  • Unity?UGUI的Canvas畫布組件使用示例詳解

    Unity?UGUI的Canvas畫布組件使用示例詳解

    這篇文章主要介紹了Unity?UGUI的Canvas畫布組件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • C#基于UDP進(jìn)行異步通信的方法

    C#基于UDP進(jìn)行異步通信的方法

    這篇文章主要介紹了C#基于UDP進(jìn)行異步通信的方法,實(shí)例分析了C#基于UDP實(shí)現(xiàn)異步通信的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • 深入理解C#中回調(diào)函數(shù)

    深入理解C#中回調(diào)函數(shù)

    回調(diào)函數(shù)是一種在編程中常用的概念,本文將介紹回調(diào)函數(shù)的概念、語(yǔ)法和應(yīng)用,并討論如何設(shè)計(jì)優(yōu)化和重用回調(diào)函數(shù),以及它們?cè)诓l(fā)編程中的用途,感興趣的可以了解一下
    2024-02-02
  • C#啟動(dòng)進(jìn)程的幾種常用方法

    C#啟動(dòng)進(jìn)程的幾種常用方法

    這篇文章主要介紹了C#啟動(dòng)進(jìn)程的幾種常用方法,實(shí)例分析了C#對(duì)系統(tǒng)進(jìn)行的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • 基于C#的圖表控件庫(kù) ScottPlot編譯visual studio 2022

    基于C#的圖表控件庫(kù) ScottPlot編譯visual studio 2022

    基于 C# 的 圖表控件庫(kù) ScottPlot,開(kāi)源免費(fèi),可以用于開(kāi)發(fā)一些上位機(jī)軟件,如電壓、電流波形的顯示,開(kāi)發(fā)【示波器】圖形界面,可以顯示一些圖表、波形,總之功能比較的強(qiáng)大,本文介紹了基于C#的圖表控件庫(kù) ScottPlot編譯visual studio 2022,需要的朋友可以參考下
    2022-06-06
  • 使用C#實(shí)現(xiàn)阿拉伯?dāng)?shù)字到大寫中文的轉(zhuǎn)換

    使用C#實(shí)現(xiàn)阿拉伯?dāng)?shù)字到大寫中文的轉(zhuǎn)換

    這篇文章主要介紹了C#實(shí)現(xiàn)阿拉伯?dāng)?shù)字轉(zhuǎn)為大寫中文的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2007-03-03
  • C#修改MAC地址類的實(shí)例

    C#修改MAC地址類的實(shí)例

    C#修改MAC地址類的實(shí)例,需要的朋友可以參考一下
    2013-03-03
  • unity實(shí)現(xiàn)鼠標(biāo)拖住3D物體

    unity實(shí)現(xiàn)鼠標(biāo)拖住3D物體

    這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)鼠標(biāo)拖住3D物體,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 簡(jiǎn)單談?wù)凜#中深拷貝、淺拷貝

    簡(jiǎn)單談?wù)凜#中深拷貝、淺拷貝

    深拷貝和淺拷貝都是對(duì)對(duì)象進(jìn)行的拷貝復(fù)制。而他們的不同就在于:一個(gè)對(duì)象中可能會(huì)有值類型的字段,也可能會(huì)有引用類型的字段。淺拷貝直接拷貝值、引用類型的指針。而深拷貝則是重新構(gòu)造字段指針?biāo)赶虻膶?duì)象,并沒(méi)有拷貝該字段的指針,或是與該字段指針指向同一塊內(nèi)存
    2015-06-06
  • C#字體池技術(shù)實(shí)現(xiàn)代碼詳解

    C#字體池技術(shù)實(shí)現(xiàn)代碼詳解

    在本篇文章里小編給大家整理的是關(guān)于C#字體池技術(shù)實(shí)現(xiàn)代碼詳解內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2019-11-11

最新評(píng)論