具有橢圓、矩形、箭頭、畫筆、文字涂鴉功能的截圖工具,效果如圖: 
思路: 用泛型集合存儲涂鴉的數(shù)據(jù),每一次涂鴉后都存儲進(jìn)去,最后在OnPaint中遍歷該集合,通過GDI繪出。
重點講涂鴉部分: 1、橢圓、矩形、箭頭,都只需確定起點和終點。 2、畫筆需要確定點集合。 3、文字涂鴉通過透明Richtextbox寫上內(nèi)容后區(qū)域截屏成一個bitmap。
實現(xiàn)方法: 涂鴉通過GDI畫圖實現(xiàn):
PRivate void DrawTools(Graphics g, DrawToolData data) { Point beginPoint = data.beginPoint; Point endPoint = data.endPoint; ColorToolChose(); Rectangle rect = GetToolRect(beginPoint, endPoint); Pen pen = new Pen(data.penColor, data.penWidth); g.SmoothingMode = SmoothingMode.AntiAlias; switch (data.Type) { case 1://橢圓 using (pen) { g.DrawEllipse(pen, rect); } break; case 2://矩形 using (pen) { g.DrawRectangle(pen, rect); } break; case 3://箭頭 using (pen) { pen.EndCap = LineCap.ArrowAnchor; pen.EndCap = LineCap.Custom; pen.CustomEndCap = new AdjustableArrowCap(4, 4, true); g.DrawLine(pen, beginPoint, endPoint); } break; case 4://畫筆 if (data.pointList.Count < 2) return; Point[] points = data.pointList.ToArray(); using (pen) { g.DrawLines(new Pen(data.penColor, data.penWidth), points); } break; case 5://文字 if (data.textBmp.Width < 2) return; g.DrawImage(data.textBmp, data.beginPoint); break; } }寫一個類用來存儲涂鴉數(shù)據(jù),然后用“List<>” 把每一次涂鴉的數(shù)據(jù)存起來。
//存儲畫筆工具 所有線段的 點集合、畫筆顏色寬度的類 的集合private List<DrawToolData> drawData = new List<DrawToolData>(); /// <summary> /// 存儲畫圖信息 /// </summary>public class DrawToolData { public int Type { get; set; } = 0; /// <summary> /// 畫筆工具線段點集合 /// </summary> public List<Point> pointList { get; set; } = new List<Point>(); public Color penColor { get; set; } public int penWidth { get; set; } public Point beginPoint { get; set; } = Point.Empty; public Point endPoint { get; set; } = Point.Empty; public float textSize { get; set; } = 16; //存文字分割后的字符串?dāng)?shù)組 public string textInfo { get; set; } public Bitmap textBmp { get; set; } = new Bitmap(1, 1); }每次畫完一個圖形后都調(diào)用存儲數(shù)據(jù)的方法,存儲到數(shù)據(jù)集合的末尾。
private void addDrawData() { if (drawData.Count == 0) drawData.Add(new DrawToolData()); drawData[drawData.Count - 1].Type = clickType; drawData[drawData.Count - 1].penColor = selectedColor; drawData[drawData.Count - 1].penWidth = penWidth; switch (clickType) { case 1: case 2: case 3: drawData[drawData.Count - 1].beginPoint = BeginPoint; drawData[drawData.Count - 1].endPoint = EndPoint; break; case 4: (drawData[drawData.Count - 1].pointList).Add(EndPoint); break; case 5: drawData[drawData.Count - 1].beginPoint = BeginPoint; drawData[drawData.Count - 1].textSize = colorWithText1.textSize; drawData[drawData.Count - 1].textInfo = drawTextTool1.Text; drawData[drawData.Count - 1].textBmp = GetTextBmp(); break; }最后在OnPaint中遍歷數(shù)據(jù)畫出圖形。
foreach (DrawToolData data in drawData) { DrawTools(g, data); }文字涂鴉:做一個透明的RichtextBox控件(百度一下),然后截屏CopyFromScreen,得到bitmap。
/// <summary> /// 得到文字涂鴉的圖片 /// </summary> private Bitmap GetTextBmp() { Bitmap bmp = new Bitmap(drawTextTool1.Width, drawTextTool1.Height); Graphics g = Graphics.FromImage(bmp); Point point = new Point(drawTextTool1.Location.X + this.Location.X + myLocation.X, drawTextTool1.Location.Y + this.Location.Y + myLocation.Y); g.CopyFromScreen(point, Point.Empty, drawTextTool1.Size); return bmp; }新聞熱點
疑難解答