wpf实现简易画板功能(带截取画板,签名截图等等)
参照自:https://www.cnblogs.com/jixin/p/4730170.html
https://blog.csdn.net/u012408847/article/details/86482399
截图功能将会把红色方块区域内的内容截取下来,保存在img文件夹中。
window1.xaml
<Window x:Class="_1_5GraphicsWpf.Window1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:_1_5GraphicsWpf"xmlns:cvr="clr-namespace:_1_5GraphicsWpf.ControlValidationRule"mc:Ignorable="d"Title="Window1" Height="450" Width="800"><Grid><DockPanel Background="AliceBlue"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="5*"></ColumnDefinition><ColumnDefinition Width="13*"></ColumnDefinition></Grid.ColumnDefinitions><Canvas Grid.Column="1" x:Name="myCanvas" DockPanel.Dock="Right" Background="LightGray" PreviewMouseLeftButtonDown="Canvas_PreviewMouseLeftButtonDown" PreviewMouseMove="Canvas_PreviewMouseMove"MouseLeftButtonUp="MyCanvas_MouseLeftButtonUp" ></Canvas><Grid DockPanel.Dock="Left" x:Name="LeftDockPanel"><Grid.ColumnDefinitions><ColumnDefinition Width="*"></ColumnDefinition><ColumnDefinition Width="3*"></ColumnDefinition></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height="30px"></RowDefinition><RowDefinition Height="30px"></RowDefinition><RowDefinition Height="30px"></RowDefinition><RowDefinition Height="30px"></RowDefinition><RowDefinition Height="30px"></RowDefinition><RowDefinition Height="30px"></RowDefinition><RowDefinition Height="30px"></RowDefinition></Grid.RowDefinitions><Label Grid.Column="0" Grid.Row="0">颜色œ˜œ˜œ˜œ˜</Label><ComboBox x:Name="ComboColor" Grid.Row="0" Grid.Column="1" Margin="6 3"SelectedValuePath="{Binding Path=ID}" SelectedIndex="{Binding Path=Combo_ColorIndex}" ><ComboBox.ItemTemplate><DataTemplate><StackPanel Orientation="Horizontal"><TextBlock Text="{Binding Path=PColor}"></TextBlock></StackPanel></DataTemplate></ComboBox.ItemTemplate></ComboBox><Label Grid.Column="0" Grid.Row="1">线条粗细œ˜œ˜œ˜œ˜</Label><TextBox x:Name="textBoxThick" Grid.Row="1" Grid.Column="1" Margin="6,3" ><TextBox.Text><Binding Path="Thickness" NotifyOnValidationError="True" NotifyOnSourceUpdated="True" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"><Binding.ValidationRules><cvr:DataValidationRule ValidatesOnTargetUpdated="True"></cvr:DataValidationRule></Binding.ValidationRules></Binding></TextBox.Text></TextBox><Slider Minimum="0" Maximum="100" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="2" Value="{Binding Path=Thickness, Mode=TwoWay}"></Slider><Label Grid.Column="0" Grid.Row="3">样式œ˜œ˜œ˜œ˜</Label><ComboBox x:Name="ComboStyle" Grid.Row="3" Grid.Column="1" Margin="6 3"SelectedValuePath="{Binding Path=ID}" SelectedIndex="{Binding Path=Combo_StyleIndex}" ><ComboBox.ItemTemplate><DataTemplate><StackPanel Orientation="Horizontal"><TextBlock Text="{Binding Path=PStyle}"></TextBlock></StackPanel></DataTemplate></ComboBox.ItemTemplate></ComboBox><Button Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" Margin="10 3" Content="清除" Click="Button_Click"></Button><Button Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="2" Margin="10 3" Content="截图" Click="Button_Click_1"></Button></Grid></Grid></DockPanel></Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using _1_5GraphicsWpf.ViewModel;
using _1_5GraphicsWpf.ControlValidationRule;
using System.Drawing;namespace _1_5GraphicsWpf
{public partial class Window1 : Window{public Window1(){InitializeComponent();Init();}ObservableCollection<VMColor> ColorCollection;ObservableCollection<VMStyle> StyleCollection;Global_Window1 GlobalVaries;void Init(){ColorCollection = new ObservableCollection<VMColor> {new VMColor{ID = 0,PColor="默认"},new VMColor{ID = 1,PColor="红色"},new VMColor{ID = 2,PColor="绿色" }};StyleCollection = new ObservableCollection<VMStyle> {new VMStyle{ID = 0,PStyle="平坦"},new VMStyle{ID = 1,PStyle="直角"},new VMStyle{ID = 2,PStyle="三角"},new VMStyle{ID = 3,PStyle="圆形"}};GlobalVaries = new Global_Window1() {Combo_ColorIndex = 0,Combo_StyleIndex = 0,Thickness = 1};this.ComboColor.ItemsSource = ColorCollection;this.ComboStyle.ItemsSource = StyleCollection; this.DataContext = GlobalVaries;this.textBoxThick.AddHandler(Validation.ErrorEvent,new RoutedEventHandler(this.ValidationError));}void ValidationError(object sender,RoutedEventArgs e){TextBox obj = sender as TextBox;if (Validation.GetErrors(obj).Count>0){obj.ToolTip = Validation.GetErrors(this.textBoxThick)[0].ErrorContent.ToString();}}System.Windows.Point startPoint;List<System.Windows.Point> pointList = new List<System.Windows.Point>();private void Canvas_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e){startPoint = e.GetPosition(myCanvas);}private void Canvas_PreviewMouseMove(object sender, MouseEventArgs e){if (e.LeftButton == MouseButtonState.Pressed){// 返回指针相对于Canvas的位置System.Windows.Point point = e.GetPosition(myCanvas);if (pointList.Count == 0){// 加入起始点pointList.Add(new System.Windows.Point(this.startPoint.X, this.startPoint.Y));}else{// 加入移动过程中的point 颜色pointList.Add(point);}// 去重复点var disList = pointList.Distinct().ToList();var count = disList.Count(); // 总点数if (point != this.startPoint && this.startPoint != null){var l = new Line();//string color = (ComboColor.SelectedItem as ComboBoxItem).Content as string;int color = int.Parse((ComboColor.SelectedValue as VMColor).ID.ToString());switch (color){case 0:l.Stroke = System.Windows.Media.Brushes.Black;break;case 1:l.Stroke = System.Windows.Media.Brushes.Red;break;case 2:l.Stroke = System.Windows.Media.Brushes.Green;break;default:l.Stroke = System.Windows.Media.Brushes.Black;break;}int style = int.Parse((ComboStyle.SelectedValue as VMStyle).ID.ToString());switch (style){case 0:l.StrokeDashCap = PenLineCap.Flat;l.StrokeStartLineCap = PenLineCap.Flat;l.StrokeEndLineCap = PenLineCap.Flat;break;case 1:l.StrokeDashCap = PenLineCap.Square;l.StrokeStartLineCap = PenLineCap.Square;l.StrokeEndLineCap = PenLineCap.Square;break;case 2:l.StrokeDashCap = PenLineCap.Triangle;l.StrokeStartLineCap = PenLineCap.Triangle;l.StrokeEndLineCap = PenLineCap.Triangle;break;case 3:l.StrokeDashCap = PenLineCap.Round;l.StrokeStartLineCap = PenLineCap.Round;l.StrokeEndLineCap = PenLineCap.Round;break;default:l.StrokeDashCap = PenLineCap.Round;l.StrokeStartLineCap = PenLineCap.Round;l.StrokeEndLineCap = PenLineCap.Round;break;}//l.StrokeLineJoin = PenLineJoin.Round;//l.StrokeStartLineCap = PenLineCap.Triangle;l.StrokeThickness = this.GlobalVaries.Thickness ;if (count < 2)return;l.X1 = disList[count - 2].X; // count-2 保证 line的起始点为点集合中的倒数第二个点。l.Y1 = disList[count - 2].Y;// 终点X,Y 为当前point的X,Y l.X2 = point.X;l.Y2 = point.Y;myCanvas.Children.Add(l);}}}private void MyCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e){pointList.Clear();}private void Button_Click(object sender, RoutedEventArgs e){this.myCanvas.Children.Clear();//清除pointList.Clear();}#region 截图public static Shape CreateShape(){//矩形区域return new System.Windows.Shapes.Rectangle() { Fill = null, Stroke = System.Windows.Media.Brushes.Red, StrokeThickness = 1 };//圆形区域//return new System.Windows.Shapes.Ellipse() { Fill = null, Stroke = System.Windows.Media.Brushes.Red, StrokeThickness = 1 };}bool drawFlag = false;Shape insertShape;System.Windows.Point startPosition;private void Mask_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){insertShape = CreateShape();if (insertShape != null){drawFlag = true;Canvas board = sender as Canvas;//board.Children.Clear();startPosition = e.GetPosition(board);insertShape.Opacity = 1;Canvas.SetLeft(insertShape, e.GetPosition(board).X);Canvas.SetTop(insertShape, e.GetPosition(board).Y);board.Children.Add(insertShape);}}private void image_MouseMove(object sender, MouseEventArgs e){Canvas board = sender as Canvas;if (drawFlag && insertShape != null){if (e.GetPosition(board).X > startPosition.X){insertShape.Width = e.GetPosition(board).X - startPosition.X;//Canvas.SetRight(insertShape, startPosition.X);}else{insertShape.Width = startPosition.X - e.GetPosition(board).X;Canvas.SetLeft(insertShape, e.GetPosition(board).X);}if (e.GetPosition(board).Y > startPosition.Y){insertShape.Height = e.GetPosition(board).Y - startPosition.Y;//Canvas.SetBottom(insertShape, startPosition.Y);}else{insertShape.Height = startPosition.Y - e.GetPosition(board).Y;Canvas.SetTop(insertShape, e.GetPosition(board).Y);}}}private void Mask_MouseLeftButtonUp(object sender, MouseButtonEventArgs e){Canvas board = sender as Canvas;System.Windows.Point position = board.PointToScreen(new System.Windows.Point(0, 0));drawFlag = false;int width = (int)insertShape.Width +150 ;int height = (int)insertShape.Height +110 ;System.Drawing.Size size = new System.Drawing.Size(width, height);int startX = (e.GetPosition(board).X < startPosition.X) ? (int)e.GetPosition(board).X : (int)startPosition.X ;int startY = (e.GetPosition(board).Y < startPosition.Y) ? (int)e.GetPosition(board).Y : (int)startPosition.Y ;//int endX = (e.GetPosition(board).X > startPosition.X) ? (int)e.GetPosition(board).X + 10 : (int)startPosition.X + 10;//int endY = (e.GetPosition(board).Y > startPosition.Y) ? (int)e.GetPosition(board).Y + 10 : (int)startPosition.Y + 10;if (insertShape != null){insertShape.Opacity = 1;System.Windows.Point p = e.GetPosition(board);//BitmapSource memory = new Bitmap(width, height);//Graphics g = Graphics.FromImage(memory);//g.CopyFromScreen(this.Location.X + 1, this.Location.Y + 1, 0, 0, new System.Drawing.Size(width, height));Clipboard.SetImage(memory);//把图片放到剪切板中//bmp.Save("C:\\Screenshots\\" + filename);using (Bitmap bmp = new Bitmap(width, height)){using (Graphics g = Graphics.FromImage(bmp)){String filename = "ScreenCapture-" + DateTime.Now.ToString("ddMMyyyy-hhmmss") + ".png";g.CopyFromScreen(startX+(int)position.X, startY+(int)position.Y, 0, 0, size);bmp.Save("..\\..\\img\\" + filename);Button_Click_2();}}}}#endregionbool canShot = false;private void Button_Click_1(object sender, RoutedEventArgs e){this.myCanvas.MouseLeftButtonDown += Mask_MouseLeftButtonDown;this.myCanvas.MouseMove += image_MouseMove;this.myCanvas.MouseLeftButtonUp += Mask_MouseLeftButtonUp;this.myCanvas.PreviewMouseLeftButtonDown -= Canvas_PreviewMouseLeftButtonDown;this.myCanvas.PreviewMouseMove -= Canvas_PreviewMouseMove;this.myCanvas.MouseLeftButtonUp -= MyCanvas_MouseLeftButtonUp;canShot = true;}private void Button_Click_2(){if (canShot ==true){this.myCanvas.MouseLeftButtonDown -= Mask_MouseLeftButtonDown;this.myCanvas.MouseMove -= image_MouseMove;this.myCanvas.MouseLeftButtonUp -= Mask_MouseLeftButtonUp;this.myCanvas.PreviewMouseLeftButtonDown += Canvas_PreviewMouseLeftButtonDown;this.myCanvas.PreviewMouseMove += Canvas_PreviewMouseMove;this.myCanvas.MouseLeftButtonUp += MyCanvas_MouseLeftButtonUp;}canShot = false;}}
}
wpf实现简易画板功能(带截取画板,签名截图等等)相关推荐
- Sketch入门基础-画布、Artboard(画板)功能介绍
Sketch mac 提供了丰富的矢量绘图和文字工具,你可以使用sketch mac来设计界面.网站.图标等,非常的实用.此次小编带大家了解Sketch入门基础-画布.Artboard(画板)功能. ...
- python怎么建立画板_Python基于opencv实现的简单画板功能示例
本文实例讲述了Python基于opencv实现的简单画板功能.分享给大家供大家参考,具体如下: import cv2 import numpy as np drawing = False # true ...
- android画板需求分析,Android编程实现画板功能的方法总结【附源码下载】
本文实例讲述了Android编程实现画板功能的方法.分享给大家供大家参考,具体如下: Android实现画板主要有2种方式,一种是用自定义View实现,另一种是通过Canvas类实现.当然自定义Vie ...
- 《Cocos Creator游戏实战》你画我猜中的画板功能
你画我猜中的画板功能 创建节点 完成脚本 本节我们来做一个画板,该画板一共有三个小功能: 调节笔刷大小 改变笔刷颜色 橡皮擦 运行效果如下: Cocos Creator版本:2.2.0 后台回复&qu ...
- 巧用canvas实现画板功能,使用画笔在图片上涂画,橡皮擦可擦除涂画,并保存
canvas 是HTML5的元素,使用JavaScript 在网页上绘制图像. canvas 拥有多种绘制路径.矩形.圆形.字符以及添加图像的方法. 而如果想实现画笔在画板涂画画笔在图片上涂画,橡皮擦 ...
- tkinter Canvas 实现 鼠标手绘画板 功能
下面代码简单实现了手绘画板功能,其实也是Canvas的教程,后面都给加了注释. 这里通过列表来存储笔画,实现撤销恢复功能,右键有菜单. import tkinter as tk from tkinte ...
- Android如何实现画板功能?
前言 Android实现画板主要有2种方式,一种是用自定义View实现,另一种是通过Canvas类实现.当然自定义View内部也是用的Canvas. 自定义View 创建一个自定义View(推荐Sur ...
- html实现画板的基本操作,javascript实现画板功能
本文实例为大家分享了javascript实现画板功能的具体代码,供大家参考,具体内容如下 画板功能的实现 *{ margin: 0; padding: 0; list-style: none; } b ...
- Android实现画板功能(一)
前言 最近看到了一些Android手写相关的功能,比如说: 钉钉手写签名功能,输入法手写功能,笔记类App的手写记录功能等.最近在工作中也遇到了类似的需求,其实实现画板功能并不复杂,所以我就打算在这里 ...
最新文章
- 快速问医生如何快速实现 患者与医生即时问诊?
- C的动态优化 约瑟夫环
- java给定_Java – 在给定示例中使用super()
- linux配置redis服务,Linux下安装Redis并设置相关服务
- 阿里云智能总裁张建锋:保护客户数据安全是第一原则
- 【计算机网络】复习荟萃(四)
- 【小程序开发】微信小程序开发中遇到的那些坑...
- 2014 百度之星 1003 题解 Xor Sum
- nvidia控制面板只有3d设置?
- ESRI大赛三维模块介绍
- 聊聊docker【二】基本命令
- 制作一个App的完整流程是哪些
- CAD文件零基础批量转换DWG格式
- 奔图打印机驱动linux安装方法,奔图3100打印机驱动
- 计算某一点绕另一点旋转一定角度后的坐标
- 缺失值处理(Imputation)
- 爱情三十九课,爱的礼物
- Oracle 执行计划(Explain Plan)
- 执行matlab 部分程序
- 爬取百大弹幕,大家还是喜欢上罗老师的课!
热门文章
- 史上最强最全网站资源整理
- 小程序记录页面停留时间
- linux服务器配置与管理_【13】进大厂必须掌握的面试题-配置管理面试 - Java架构师社区...
- 电子科技大学现代电子信息系统综合实验课程部分模拟试题
- 设置VirtualBox共享文件夹的方法
- ubuntu20.04界面黑屏,有光标闪烁,解决方法
- WEB 渗透之SSTI 模板注入
- python找数字做加法升级版答案_python学数学1-2:认识数字--自然数加法
- Java网络编程入门,包含网络相关概念、InetAddress类、套接字Socket、网络上传和下载文件等
- OpenGL原理与实践——核心模式(六):光照贴图、光源分类以及多光源场景主要源码实现