C#寫的截圖功能

 

public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
        }
        #region 用戶變量
        private Point DownPoint = Point.Empty;//記錄鼠標按下座標,用來確定繪圖起點
        private bool CatchFinished = false;//用來表示是否截圖完成
        private bool CatchStart = false;//表示截圖開始
        private Bitmap originBmp;//用來保存原始圖像
        private Rectangle CatchRect;//用來保存截圖的矩形
        #endregion

        private void Form4_Load(object sender, EventArgs e)
        {
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
            this.UpdateStyles();
            //以上兩句是爲了設置控件樣式爲雙緩衝,這可以有效減少圖片閃爍的問題,關於這個大家可以自己去搜索下
            originBmp = new Bitmap(this.BackgroundImage);//BackgroundImage爲全屏圖片,我們另用變量來保存全屏圖片
        }

        private void Form4_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (!CatchStart)
                {//如果捕捉沒有開始
                    CatchStart = true;
                    DownPoint = new Point(e.X, e.Y);//保存鼠標按下座標
                }
            }

        }

        private void Form4_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                this.DialogResult = DialogResult.OK;
                this.Close();
            }
        }

        private void Form4_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 Form4_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (CatchStart)
                {
                    CatchStart = false;
                    CatchFinished = true;
                }
            }
        }

        private void Form4_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();
                }
            }
        }
    }

//以下是聊天窗體的點擊事件
 private void button2_Click(object sender, EventArgs e)
        {
            this.Hide();//隱藏當前窗體
            Thread.Sleep(50);//讓線程睡眠一段時間,窗體消失需要一點時間
            Form4 CatchForm = new Form4();
            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);
                    //richtextbox1.Paste(myFormat);
                    Clipboard.Clear();//清除剪貼板中的對象
                }
                this.Show();//重新顯示窗體
            }

        }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章