標籤: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); |
這樣即可實現簡單的地區了。