winform螢幕截圖

來源:互聯網
上載者:User

標籤:winform   style   class   blog   code   java   

原文:winform螢幕

螢幕是一個比較常用的功能,在項目中出現的比例也比較高,至少我做過的每個項目都有螢幕這個功能,從全屏到地區都有出現過。當然地區已然包含了全屏。

全屏方式有好幾種,調用API、叫用作業系統的然後到剪下板去取(當然這種方式幾乎沒人會去用)、用Graphics去畫螢幕等等。

下面上Graphics畫螢幕的代碼,畢竟這種方式代碼量最少。

?
1 2 3 4 5 //截取螢幕 Bitmap myImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); Graphics g = Graphics.FromImage(myImage); g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height));        g.Dispose();

上面的代碼即可截取當前螢幕的映像。註:由於WPF是使用DirectX進行渲染的,此方式在部分系統會不到wpf的表單。(win7,windows server2008,windows vista均能截取到wpf表單,windows XP無法截取到WPF表單,原因可能是windows xp出現時還沒有WPF呢)

實現地區,主要有四個步驟,一截取全屏,彈出遮罩層,畫選擇區,截取選擇地區

一、截取全屏可用上面代碼實現,這裡就不寫了。

二、彈出遮罩層

     遮罩層的目的是用來畫地區,一般採用半透明方式。代碼如下:

?
1 2 3 4 this.BackColor = Color.Gray; this.Opacity = 0.5; this.FormBorderStyle = FormBorderStyle.None; this.WindowState = FormWindowState.Maximized;

  設定表單背景顏色,通明度,邊框樣式及使其最大化。即可彈出全屏遮罩層。

三、畫選擇區

  這個就是截屏中最重要的部分了

  我們需要在表單中加入pictureBox控制項,且Dock屬性設定為Fill,這樣才能在螢幕上畫選擇區

跟隨滑鼠在 pictureBox的圖片上畫矩形        private int intStartX = 0;        private int intStartY = 0;        private bool isMouseDraw = false;         private void pictureBox_Src_MouseDown(object sender, MouseEventArgs e)        {            isMouseDraw = true;             intStartX = e.X;            intStartY = e.Y;        }         private void pictureBox_Src_MouseMove(object sender, MouseEventArgs e)        {            if (isMouseDraw)            {                try                {                    Graphics g = this.pictureBox_Src.CreateGraphics();                    //清空上次畫下的痕迹                    g.Clear(this.pictureBox_Src.BackColor);                    Brush brush = new SolidBrush(Color.Red);                    Pen pen = new Pen(brush, 1);                    pen.DashStyle = DashStyle.Solid;                    g.DrawRectangle(pen, new Rectangle(intStartX > e.X ? e.X : intStartX, intStartY > e.Y ? e.Y : intStartY, Math.Abs(e.X - intStartX), Math.Abs(e.Y - intStartY)));                    g.Dispose();                }                catch (Exception ex)                {                    ex.ToString();                }            }        }         private void pictureBox_Src_MouseUp(object sender, MouseEventArgs e)        {            isMouseDraw = false;             intStartX = 0;            intStartY = 0;        }

當然這隻是在圖片上畫了一個紅色的矩形,沒法二次調整矩形大小,移動矩形,且畫圖時會不停的清除畫下的痕迹,導致螢幕閃爍,且平時使用的螢幕在選擇區的地區亮度都會高些,這些都沒實現,不過既然能畫地區了那這些就都不是問題了,只需稍作修改即可,以下給出部分修改代碼:

填充選擇區

?
1 2 3 4 SolidBrush soldwhite = new SolidBrush(Color.White); Rectangle rec = new Rectangle(StartX, StartY, ScreenWidth, ScreenHeight);   g.FillRectangle(soldwhite, rec);//用來填充矩形地區

螢幕閃爍

清除時螢幕閃爍是由於清除的整個圖片,然後在重新繪製的,這樣若加上填充區設定為白色,我們能看到填充地區閃爍的很厲害,解決方式為採用填充的方式清除選擇地區外的部分,這樣整個圖片總共分5此填充和一次劃線。

?
1 2 3 4 5 6 7 Graphics g = this.pictureBox1.CreateGraphics();         //清空上次畫下的痕迹        // g.Clear(this.pictureBox1.BackColor);         g.FillRectangle(soldgray, 0, 0, pictureBox1.Width, StartY);//清除上         g.FillRectangle(soldgray, 0, StartY + ScreenHeight, pictureBox1.Width, pictureBox1.Height - (StartY + ScreenHeight));//清除下         g.FillRectangle(soldgray, 0, StartY, StartX, ScreenHeight + 1);//清除左         g.FillRectangle(soldgray, StartX + ScreenWidth, StartY, pictureBox1.Width - (StartX + ScreenWidth), ScreenHeight + 1);//清除右

二次調整大小及選擇區移動

當我們對地區進行選擇後,想二次調整大小通常會看到滑鼠樣式變化,表示可以對其進行修改或移動

        /// <summary>        /// 設定滑鼠樣式        /// </summary>        /// <param name="p"></param>        private void SetCursorStyle(Point p)        {            if (p.X > StartX && p.X < StartX + ScreenWidth && p.Y > StartY && p.Y < StartY + ScreenHeight)            {this.Cursor = Cursors.SizeAll;            }            else if (p.X >= StartX - 10 && p.X <= StartX && p.Y >= StartY - 10 && p.Y <= StartY)            {this.Cursor = Cursors.SizeNWSE;            }            else if (p.X >= StartX + ScreenWidth && p.X <= StartX + ScreenWidth + 10 && p.Y <= StartY + ScreenHeight + 10 && p.Y >= StartY + ScreenHeight)            {this.Cursor = Cursors.SizeNWSE;            }            else if ((p.X >= StartX + ScreenWidth && p.X <= StartX + ScreenWidth + 10 && p.Y >= StartY - 10 && p.Y <= StartY))            {this.Cursor = Cursors.SizeNESW;            }            else if (p.X >= StartX - 10 && p.X <= StartX && p.Y <= StartY + ScreenHeight + 10 && p.Y >= StartY + ScreenHeight)            {this.Cursor = Cursors.SizeNESW;            }            else            {this.Cursor = Cursors.Default;            }        }

這是設定滑鼠在選擇地區內的樣式和四個角的樣式,若是在4個角,只需將起始座標設定好之後和原來一樣畫地區就行,若是在地區中,移動選擇區則需根據當前座標和開始座標計算出差值,在移動時更改開始座標,固定寬高畫地區即可,若移動到螢幕邊緣需加上判斷。

四、截取選擇地區

畫好地區後,需要選擇是否截取,通常會給出按鈕選擇我們只需在MouseUP和MouseDown事件中加上按鈕的隱藏和顯示即可,顯示時根據選擇區計算顯示的座標位置。

截取選擇區代碼

?
1 Bitmap map = myImage.Clone(new Rectangle(StartX, StartY, ScreenWidth, ScreenHeight), System.Drawing.Imaging.PixelFormat.Format32bppArgb);

這樣即可實現簡單的地區了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.