当前位置:首页 > Windows程序 > 正文

【WPF】WPF截屏

2021-05-26 Windows程序

.NET的截图控件在网上流传得不多啊,难得发现一个精品截图控件( 传送门),但是无奈是winform的,无鄙视winform的意思,纯偏爱WPF罢了.后来又找到一个周银辉做的WPF截图(继续传送门),发现截屏是实现了,但是功能略少了点.So,打算自己用WPF去实现一个,无奈略渣,还是简单分享一下吧.

一个Window和一个Canvas

Window是截图的主界面,但是设置好WindowStyle和WindowState就基本没它什么事了,Window里面放个Canvas,Canvas主要承载当前的截屏和画板DrawingPannel以及工具控件.先看看Window和Canvas的代码吧,如下

<Window x:Class="WpfCapture.Window3" xmlns="" xmlns:x="" xmlns:wpfCapture="clr-namespace:WpfCapture" Title="Window3" Height="300" Width="300" WindowStyle="None" WindowState="Maximized"> <Canvas Name="xgrid" > </Canvas> </Window>

什么时候加载当前截屏,怎样加载,看代码

public Window3() { InitializeComponent(); screenSnapshot = GetScreenSnapshot(); var bmp = ToBitmapSource(screenSnapshot); bmp.Freeze(); this.xgrid.Background = new ImageBrush(bmp); } public Bitmap GetScreenSnapshot() { try { System.Drawing.Rectangle rc = SystemInformation.VirtualScreen; var bitmap = new Bitmap(rc.Width, rc.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); using (Graphics memoryGrahics = Graphics.FromImage(bitmap)) { memoryGrahics.CopyFromScreen(rc.X, rc.Y, 0, 0, rc.Size, CopyPixelOperation.SourceCopy); } return bitmap; } catch (Exception) { } return null; }

画板DrawingPannel

画板DrawingPannel是自定义的一个布局控件类,主要是用来显示DrawingVisual对象的,类定义如下:

public class DrawingCanvas : Panel { private List<Visual> visuals = new List<Visual>(); protected override Visual GetVisualChild(int index) { return visuals[index]; } protected override int VisualChildrenCount { get { return visuals.Count; } } public void RemoveLastVisual() { if (visuals.Count > 0) { var item= visuals.FindLast(x => true); DeleteVisual(item); } } public void AddVisual(Visual visual) { visuals.Add(visual); base.AddVisualChild(visual); base.AddLogicalChild(visual); Console.WriteLine(visuals.Count); } public void DeleteVisual(Visual visual) { visuals.Remove(visual); base.RemoveVisualChild(visual); base.RemoveLogicalChild(visual); } }

既然画板有了,当然不能漏了画笔等操作工具,所以最终界面XAML描述如下

<Window x:Class="WpfCapture.Window3" xmlns="" xmlns:x="" xmlns:wpfCapture="clr-namespace:WpfCapture" Title="Window3" Height="300" Width="300" WindowStyle="None" WindowState="Maximized"> <Canvas Name="xgrid" > <wpfCapture:DrawingCanvas x:Name="grid" Background="AliceBlue" Canvas.Top="0" Canvas.Left="0" Width="{Binding ActualWidth,ElementName=xgrid}" Height="{Binding ActualHeight,ElementName=xgrid}" Opacity="0.8" MouseLeftButtonDown="Grid_OnMouseLeftButtonDown" PreviewMouseMove="grid_PreviewMouseMove_1" MouseLeftButtonUp="Grid_OnMouseLeftButtonUp" MouseMove="grid_MouseMove_2" MouseRightButtonDown="grid_MouseRightButtonDown_1" > </wpfCapture:DrawingCanvas> <StackPanel Orientation="Horizontal" Name="toolpanel" Visibility="Collapsed" Height="28" Width="160"> <ToolBar> <RadioButton GroupName="tool" Name="Arrow" > <Image Source="./icons/Arrow.ico"></Image> </RadioButton> <RadioButton GroupName="tool" Name="Rectangular"> <Image Source="./icons/Rectangular.ico"></Image> </RadioButton> <RadioButton GroupName="tool" Name="Line"> <Image Source="./icons/Line.ico"></Image> </RadioButton> <Button Click="Button_Click_2"> <Image Source="./icons/Redo.png"></Image> </Button> <Button> <Image Source="./icons/Exit.ico"></Image> </Button> <Button Click="Button_Click_1"> <Image Source="./icons/Accept.ico"></Image> </Button> </ToolBar> </StackPanel> </Canvas> </Window>

如何指定截图方框

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/71257.html