InkCanvasForClass/Ink Canvas/MainWindow.xaml.cs
2021-09-28 23:08:20 +08:00

1817 lines
64 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using ModernWpf;
using System;
using System.IO;
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.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Office.Interop.PowerPoint;
using System.Runtime.InteropServices;
using Application = System.Windows.Application;
using System.Timers;
using System.Threading;
using Timer = System.Timers.Timer;
using System.Diagnostics;
using Newtonsoft.Json;
using IWshRuntimeLibrary;
using File = System.IO.File;
using System.Collections.ObjectModel;
using System.Net;
using Microsoft.VisualBasic;
using System.Reflection;
using System.Collections.Generic;
using Point = System.Windows.Point;
namespace Ink_Canvas
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
BorderSettings.Visibility = Visibility.Collapsed;
}
Timer timerCheckPPT = new Timer();
Settings Settings = new Settings();
private void Button_Click(object sender, RoutedEventArgs e)
{
Close();
}
Color Ink_DefaultColor = Colors.Red;
DrawingAttributes drawingAttributes;
private void loadPenCanvas()
{
try
{
//drawingAttributes = new DrawingAttributes();
drawingAttributes = inkCanvas.DefaultDrawingAttributes;
drawingAttributes.Color = Ink_DefaultColor;
drawingAttributes.Height = 2.5;
drawingAttributes.Width = 2.5;
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
inkCanvas.Gesture += InkCanvas_Gesture;
}
catch { }
}
ApplicationGesture lastApplicationGesture = ApplicationGesture.AllGestures;
DateTime lastGestureTime = DateTime.Now;
private void InkCanvas_Gesture(object sender, InkCanvasGestureEventArgs e)
{
ReadOnlyCollection<GestureRecognitionResult> gestures = e.GetGestureRecognitionResults();
foreach (GestureRecognitionResult gest in gestures)
{
//Trace.WriteLine(string.Format("Gesture: {0}, Confidence: {1}", gest.ApplicationGesture, gest.RecognitionConfidence));
if ((DateTime.Now - lastGestureTime).TotalMilliseconds <= 1500 &&
StackPanelPPTControls.Visibility == Visibility.Visible &&
lastApplicationGesture == gest.ApplicationGesture)
{
if (gest.ApplicationGesture == ApplicationGesture.Left)
{
BtnPPTSlidesDown_Click(BtnPPTSlidesDown, null);
}
if (gest.ApplicationGesture == ApplicationGesture.Right)
{
BtnPPTSlidesDown_Click(BtnPPTSlidesDown, null);
}
}
lastApplicationGesture = gest.ApplicationGesture;
lastGestureTime = DateTime.Now;
}
inkCanvas.Strokes.Add(e.Strokes);
}
private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
bool isInkCanvasVisible = true;
bool isAutoUpdateEnabled = false;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//检查
new Thread(new ThreadStart(() =>
{
try
{
string response = GetWebClient("http://ink.wxriw.cn:1957");
if (response.Contains("Special Version"))
{
isAutoUpdateEnabled = true;
if (response.Contains("<notice>"))
{
string str = Strings.Mid(response, response.IndexOf("<notice>") + 9);
if (str.Contains("<notice>"))
{
str = Strings.Left(str, str.IndexOf("<notice>")).Trim();
if (str.Length > 0)
{
Application.Current.Dispatcher.Invoke(() =>
{
GroupBoxMASEZVersion.Visibility = Visibility.Visible;
TextBlockMASEZNotice.Text = str;
});
}
}
}
try
{
if (response.Contains("<update>"))
{
string str = Strings.Mid(response, response.IndexOf("<update>") + 9);
if (str.Contains("<update>"))
{
str = Strings.Left(str, str.IndexOf("<update>")).Trim();
if (str.Length > 0)
{
string updateIP;
int updatePort;
string[] vs = str.Split(':');
updateIP = vs[0];
updatePort = int.Parse(vs[1]);
if (OAUS.Core.VersionHelper.HasNewVersion(GetIp(updateIP), updatePort))
{
string updateExePath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater\\AutoUpdater.exe";
System.Diagnostics.Process myProcess = System.Diagnostics.Process.Start(updateExePath);
Application.Current.Dispatcher.Invoke(() =>
{
Application.Current.Shutdown();
});
}
}
}
}
}
catch { }
}
}
catch { }
})).Start();
loadPenCanvas();
//加载设置
LoadSettings();
Version version = Assembly.GetExecutingAssembly().GetName().Version;
TextBlockVersion.Text = version.ToString();
ThemeManager.Current.ApplicationTheme = ApplicationTheme.Light;
string lastVersion = "";
try
{
lastVersion = File.ReadAllText("versions.ini");
}
catch { }
if (!lastVersion.Contains(version.ToString()))
{
new ChangeLogWindow().ShowDialog();
lastVersion += "\n" + version.ToString();
File.WriteAllText("versions.ini", lastVersion.Trim());
}
isLoaded = true;
}
private void LoadSettings(bool isStartup = true)
{
if (File.Exists(settingsFileName))
{
try
{
string text = File.ReadAllText(settingsFileName);
Settings = JsonConvert.DeserializeObject<Settings>(text);
}
catch { }
}
if (Settings.Startup.IsAutoEnterModeFinger)
{
ToggleSwitchModeFinger.IsOn = true;
ToggleSwitchAutoEnterModeFinger.IsOn = true;
}
else
{
ToggleSwitchAutoEnterModeFinger.IsOn = false;
}
if (Settings.Startup.IsAutoHideCanvas)
{
if (isStartup)
{
BtnHideInkCanvas_Click(BtnHideInkCanvas, null);
}
ToggleSwitchAutoHideCanvas.IsOn = true;
}
else
{
ToggleSwitchAutoHideCanvas.IsOn = false;
}
if (Settings.Appearance.IsShowEraserButton)
{
BtnErase.Visibility = Visibility.Visible;
ToggleSwitchShowButtonEraser.IsOn = true;
}
else
{
BtnErase.Visibility = Visibility.Collapsed;
ToggleSwitchShowButtonEraser.IsOn = false;
}
if (Settings.Appearance.IsShowExitButton)
{
BtnExit.Visibility = Visibility.Visible;
ToggleSwitchShowButtonExit.IsOn = true;
}
else
{
BtnExit.Visibility = Visibility.Collapsed;
ToggleSwitchShowButtonExit.IsOn = false;
}
if (Settings.Appearance.IsShowHideControlButton)
{
BtnHideControl.Visibility = Visibility.Visible;
ToggleSwitchShowButtonHideControl.IsOn = true;
}
else
{
BtnHideControl.Visibility = Visibility.Collapsed;
}
if (Settings.Appearance.IsShowLRSwitchButton)
{
BtnSwitchSide.Visibility = Visibility.Visible;
ToggleSwitchShowButtonLRSwitch.IsOn = true;
}
else
{
BtnSwitchSide.Visibility = Visibility.Collapsed;
}
if (Settings.Appearance.IsShowModeFingerToggleSwitch)
{
StackPanelModeFinger.Visibility = Visibility.Visible;
ToggleSwitchShowButtonModeFinger.IsOn = true;
}
else
{
StackPanelModeFinger.Visibility = Visibility.Collapsed;
ToggleSwitchShowButtonModeFinger.IsOn = false;
}
if (Settings.Appearance.IsTransparentButtonBackground)
{
BtnExit.Background = new SolidColorBrush(StringToColor("#7F909090"));
}
else
{
if (BtnSwitchTheme.Content.ToString() == "深色")
{
//Light
BtnExit.Background = new SolidColorBrush(StringToColor("#FFCCCCCC"));
}
else
{
//Dark
BtnExit.Background = new SolidColorBrush(StringToColor("#FF555555"));
}
}
if (Settings.Behavior.PowerPointSupport)
{
timerCheckPPT.Elapsed += TimerCheckPPT_Elapsed;
timerCheckPPT.Interval = 1000;
timerCheckPPT.Start();
}
else
{
ToggleSwitchSupportPowerPoint.IsOn = false;
timerCheckPPT.Stop();
}
if (Settings.Behavior.IsShowCanvasAtNewSlideShow)
{
ToggleSwitchShowCanvasAtNewSlideShow.IsOn = true;
}
else
{
ToggleSwitchShowCanvasAtNewSlideShow.IsOn = false;
}
if (Settings.Gesture == null)
{
Settings.Gesture = new Gesture();
}
if (Settings.Gesture.IsEnableTwoFingerRotation)
{
ToggleSwitchEnableTwoFingerRotation.IsOn = true;
}
else
{
ToggleSwitchEnableTwoFingerRotation.IsOn = false;
}
if (Settings.Gesture.IsEnableTwoFingerGestureInPresentationMode)
{
ToggleSwitchEnableTwoFingerGestureInPresentationMode.IsOn = true;
}
else
{
ToggleSwitchEnableTwoFingerGestureInPresentationMode.IsOn = false;
}
if (File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\InkCanvas" + ".lnk"))
{
ToggleSwitchRunAtStartup.IsOn = true;
}
if (Settings.Canvas != null)
{
drawingAttributes.Height = Settings.Canvas.InkWidth;
drawingAttributes.Width = Settings.Canvas.InkWidth;
InkWidthSlider.Value = Settings.Canvas.InkWidth * 2;
if (Settings.Canvas.IsShowCursor)
{
ToggleSwitchShowCursor.IsOn = true;
inkCanvas.ForceCursor = true;
}
else
{
ToggleSwitchShowCursor.IsOn = false;
inkCanvas.ForceCursor = false;
}
}
else
{
Settings.Canvas = new Canvas();
}
}
string settingsFileName = "settings.json";
bool isLoaded = false;
private void back_HotKey(object sender, ExecutedRoutedEventArgs e)
{
try
{
inkCanvas.Strokes.Remove(inkCanvas.Strokes[inkCanvas.Strokes.Count - 1]);
}
catch { }
}
private void KeyExit(object sender, ExecutedRoutedEventArgs e)
{
//if (isInkCanvasVisible)
//{
// Main_Grid.Visibility = Visibility.Hidden;
// isInkCanvasVisible = false;
// //inkCanvas.Strokes.Clear();
// WindowState = WindowState.Minimized;
//}
//else
//{
// Main_Grid.Visibility = Visibility.Visible;
// isInkCanvasVisible = true;
// inkCanvas.Strokes.Clear();
// WindowState = WindowState.Maximized;
//}
}
private void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
KeyExit(null, null);
}
}
private void BtnExit_Click(object sender, RoutedEventArgs e)
{
Close();
}
private void BtnSettings_Click(object sender, RoutedEventArgs e)
{
if (BorderSettings.Visibility == Visibility.Visible)
{
BorderSettings.Visibility = Visibility.Collapsed;
}
else
{
BorderSettings.Visibility = Visibility.Visible;
}
}
private void BtnThickness_Click(object sender, RoutedEventArgs e)
{
}
bool forceEraser = false;
private void BtnErase_Click(object sender, RoutedEventArgs e)
{
forceEraser = true;
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByStroke;
drawingShapeMode = 0;
inkCanvas_EditingModeChanged(inkCanvas, null);
}
private void BtnClear_Click(object sender, RoutedEventArgs e)
{
forceEraser = false;
inkCanvas.Strokes.Clear();
}
private void BtnHideControl_Click(object sender, RoutedEventArgs e)
{
if (StackPanelControl.Visibility == Visibility.Visible)
{
StackPanelControl.Visibility = Visibility.Hidden;
}
else
{
StackPanelControl.Visibility = Visibility.Visible;
}
}
#region Buttons - Color
int inkColor = 1;
private void ColorSwitchCheck()
{
if (Main_Grid.Background == Brushes.Transparent)
{
BtnHideInkCanvas_Click(BtnHideInkCanvas, null);
if (currentMode == 1)
{
currentMode = 0;
GridBackgroundCover.Visibility = Visibility.Hidden;
}
}
inkCanvas.IsManipulationEnabled = true;
drawingShapeMode = 0;
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
}
private void BtnColorBlack_Click(object sender, RoutedEventArgs e)
{
inkColor = 0;
forceEraser = false;
if (BtnSwitchTheme.Content.ToString() == "浅色")
{
inkCanvas.DefaultDrawingAttributes.Color = Colors.White;
}
else
{
inkCanvas.DefaultDrawingAttributes.Color = Colors.Black;
}
ColorSwitchCheck();
}
private void BtnColorRed_Click(object sender, RoutedEventArgs e)
{
inkColor = 1;
forceEraser = false;
inkCanvas.DefaultDrawingAttributes.Color = Colors.Red;
ColorSwitchCheck();
}
private void BtnColorGreen_Click(object sender, RoutedEventArgs e)
{
inkColor = 2;
forceEraser = false;
inkCanvas.DefaultDrawingAttributes.Color = StringToColor("#FF1ED760");
ColorSwitchCheck();
}
private void BtnColorBlue_Click(object sender, RoutedEventArgs e)
{
inkColor = 3;
forceEraser = false;
inkCanvas.DefaultDrawingAttributes.Color = StringToColor("#FF239AD6");
ColorSwitchCheck();
}
private void BtnColorYellow_Click(object sender, RoutedEventArgs e)
{
inkColor = 4;
forceEraser = false;
inkCanvas.DefaultDrawingAttributes.Color = StringToColor("#FFFFB900");
ColorSwitchCheck();
}
private Color StringToColor(string colorStr)
{
Byte[] argb = new Byte[4];
for (int i = 0; i < 4; i++)
{
char[] charArray = colorStr.Substring(i * 2 + 1, 2).ToCharArray();
//string str = "11";
Byte b1 = toByte(charArray[0]);
Byte b2 = toByte(charArray[1]);
argb[i] = (Byte)(b2 | (b1 << 4));
}
return Color.FromArgb(argb[0], argb[1], argb[2], argb[3]);//#FFFFFFFF
}
private static byte toByte(char c)
{
byte b = (byte)"0123456789ABCDEF".IndexOf(c);
return b;
}
#endregion
bool isTouchDown = false; Point iniP = new Point(0, 0);
bool isLastTouchEraser = false;
private void Main_Grid_TouchDown(object sender, TouchEventArgs e)
{
iniP = e.GetTouchPoint(inkCanvas).Position;
if (e.GetTouchPoint(null).Bounds.Width > BoundsWidth)
{
isLastTouchEraser = true;
if (drawingShapeMode == 0 && forceEraser) return;
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByStroke;
}
else
{
isLastTouchEraser = false;
if (forceEraser) return;
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
}
}
//记录触摸设备ID
private List<int> dec = new List<int>();
//中心点
System.Windows.Point centerPoint;
InkCanvasEditingMode lastInkCanvasEditingMode = InkCanvasEditingMode.Ink;
private void inkCanvas_PreviewTouchDown(object sender, TouchEventArgs e)
{
dec.Add(e.TouchDevice.Id);
//设备1个的时候记录中心点
if (dec.Count == 1)
{
TouchPoint touchPoint = e.GetTouchPoint(inkCanvas);
centerPoint = touchPoint.Position;
}
//设备两个及两个以上,将画笔功能关闭
if (dec.Count > 1)
{
if (inkCanvas.EditingMode != InkCanvasEditingMode.None && inkCanvas.EditingMode != InkCanvasEditingMode.Select)
{
lastInkCanvasEditingMode = inkCanvas.EditingMode;
inkCanvas.EditingMode = InkCanvasEditingMode.None;
}
}
}
private void inkCanvas_PreviewTouchUp(object sender, TouchEventArgs e)
{
//手势完成后切回之前的状态
if (dec.Count > 1)
{
if (inkCanvas.EditingMode == InkCanvasEditingMode.None)
{
inkCanvas.EditingMode = lastInkCanvasEditingMode;
}
}
dec.Remove(e.TouchDevice.Id);
}
private void inkCanvas_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
{
e.Mode = ManipulationModes.All;
}
private void inkCanvas_ManipulationInertiaStarting(object sender, ManipulationInertiaStartingEventArgs e)
{
}
private void Main_Grid_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
if (e.Manipulators.Count() == 0)
{
if (forceEraser) return;
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
}
}
private MatrixTransform imageTransform;
private void Main_Grid_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
if (dec.Count >= 2 && (Settings.Gesture.IsEnableTwoFingerGestureInPresentationMode || StackPanelPPTControls.Visibility != Visibility.Visible))
{
ManipulationDelta md = e.DeltaManipulation;
Vector trans = md.Translation; // 获得位移矢量
double rotate = md.Rotation; // 获得旋转角度
Vector scale = md.Scale; // 获得缩放倍数
Matrix m = new Matrix();
// Find center of element and then transform to get current location of center
FrameworkElement fe = e.Source as FrameworkElement;
Point center = new Point(fe.ActualWidth / 2, fe.ActualHeight / 2);
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
// Update matrix to reflect translation/rotation
m.Translate(trans.X, trans.Y); // 移动
if (Settings.Gesture.IsEnableTwoFingerRotation)
{
m.RotateAt(rotate, center.X, center.Y); // 旋转
}
m.ScaleAt(scale.X, scale.Y, center.X, center.Y); // 缩放
StrokeCollection strokes = inkCanvas.GetSelectedStrokes();
if (strokes.Count != 0)
{
foreach (Stroke stroke in strokes)
{
stroke.Transform(m, false);
stroke.DrawingAttributes.Width *= md.Scale.X;
stroke.DrawingAttributes.Height *= md.Scale.Y;
}
}
else
{
foreach (Stroke stroke in inkCanvas.Strokes)
{
stroke.Transform(m, false);
stroke.DrawingAttributes.Width *= md.Scale.X;
stroke.DrawingAttributes.Height *= md.Scale.Y;
}
}
}
}
int currentMode = 0;
private void BtnSwitch_Click(object sender, RoutedEventArgs e)
{
if (Main_Grid.Background == Brushes.Transparent)
{
BtnHideInkCanvas_Click(BtnHideInkCanvas, e);
if (currentMode == 0)
{
currentMode++;
GridBackgroundCover.Visibility = Visibility.Visible;
}
}
else
{
switch ((++currentMode) % 2)
{
case 0:
GridBackgroundCover.Visibility = Visibility.Hidden;
break;
case 1:
GridBackgroundCover.Visibility = Visibility.Visible;
break;
}
}
}
private void BtnSwitchTheme_Click(object sender, RoutedEventArgs e)
{
if (BtnSwitchTheme.Content.ToString() == "深色")
{
BtnSwitchTheme.Content = "浅色";
BtnExit.Foreground = Brushes.White;
GridBackgroundCover.Background = new SolidColorBrush(StringToColor("#FF1A1A1A"));
BtnColorBlack.Background = Brushes.White;
ThemeManager.Current.ApplicationTheme = ApplicationTheme.Dark;
if (inkColor == 0)
{
inkCanvas.DefaultDrawingAttributes.Color = Colors.White;
}
}
else
{
BtnSwitchTheme.Content = "深色";
BtnExit.Foreground = Brushes.Black;
GridBackgroundCover.Background = new SolidColorBrush(StringToColor("#FFF2F2F2"));
BtnColorBlack.Background = Brushes.Black;
ThemeManager.Current.ApplicationTheme = ApplicationTheme.Light;
if (inkColor == 0)
{
inkCanvas.DefaultDrawingAttributes.Color = Colors.Black;
}
}
if (!Settings.Appearance.IsTransparentButtonBackground)
{
ToggleSwitchTransparentButtonBackground_Toggled(ToggleSwitchTransparentButtonBackground, null);
}
}
int BoundsWidth = 5;
private void ToggleSwitchModeFinger_Toggled(object sender, RoutedEventArgs e)
{
if (ToggleSwitchModeFinger.IsOn)
{
BoundsWidth = 10;
}
else
{
BoundsWidth = 5;
}
}
private void BtnHideInkCanvas_Click(object sender, RoutedEventArgs e)
{
if (Main_Grid.Background == Brushes.Transparent)
{
Main_Grid.Background = new SolidColorBrush(StringToColor("#01FFFFFF"));
inkCanvas.Visibility = Visibility.Visible;
GridBackgroundCoverHolder.Visibility = Visibility.Visible;
BtnHideInkCanvas.Content = "隐藏\n画板";
}
else
{
Main_Grid.Background = Brushes.Transparent;
inkCanvas.Visibility = Visibility.Collapsed;
GridBackgroundCoverHolder.Visibility = Visibility.Collapsed;
BtnHideInkCanvas.Content = "显示\n画板";
}
}
private void BtnSwitchSide_Click(object sender, RoutedEventArgs e)
{
if (ViewBoxStackPanelMain.HorizontalAlignment == HorizontalAlignment.Right)
{
ViewBoxStackPanelMain.HorizontalAlignment = HorizontalAlignment.Left;
StackPanelShapes.HorizontalAlignment = HorizontalAlignment.Right;
}
else
{
ViewBoxStackPanelMain.HorizontalAlignment = HorizontalAlignment.Right;
StackPanelShapes.HorizontalAlignment = HorizontalAlignment.Left;
}
}
#region PowerPoint
Microsoft.Office.Interop.PowerPoint.Application pptApplication = null;
Microsoft.Office.Interop.PowerPoint.Presentation presentation = null;
Microsoft.Office.Interop.PowerPoint.Slides slides = null;
Microsoft.Office.Interop.PowerPoint.Slide slide = null;
int slidescount = 0;
private void BtnCheckPPT_Click(object sender, RoutedEventArgs e)
{
try
{
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application");
//pptApplication.SlideShowWindows[1].View.Next();
if (pptApplication != null)
{
//获得演示文稿对象
presentation = pptApplication.ActivePresentation;
pptApplication.SlideShowBegin += PptApplication_SlideShowBegin;
pptApplication.SlideShowNextSlide += PptApplication_SlideShowNextSlide;
pptApplication.SlideShowEnd += PptApplication_SlideShowEnd;
// 获得幻灯片对象集合
slides = presentation.Slides;
// 获得幻灯片的数量
slidescount = slides.Count;
memoryStreams = new MemoryStream[slidescount + 2];
// 获得当前选中的幻灯片
try
{
// 在普通视图下这种方式可以获得当前选中的幻灯片对象
// 然而在阅读模式下,这种方式会出现异常
slide = slides[pptApplication.ActiveWindow.Selection.SlideRange.SlideNumber];
}
catch
{
// 在阅读模式下出现异常时,通过下面的方式来获得当前选中的幻灯片对象
slide = pptApplication.SlideShowWindows[1].View.Slide;
}
}
if (pptApplication == null) throw new Exception();
//BtnCheckPPT.Visibility = Visibility.Collapsed;
StackPanelPPTControls.Visibility = Visibility.Visible;
}
catch
{
//BtnCheckPPT.Visibility = Visibility.Visible;
StackPanelPPTControls.Visibility = Visibility.Collapsed;
MessageBox.Show("未找到幻灯片");
}
}
private void TimerCheckPPT_Elapsed(object sender, ElapsedEventArgs e)
{
try
{
Process[] processes = Process.GetProcessesByName("wpp");
if (processes.Length > 0)
{
return;
}
//processes = Process.GetProcessesByName("wps");
//if (processes.Length > 0)
//{
// return;
//}
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application");
if (pptApplication != null)
{
timerCheckPPT.Stop();
//获得演示文稿对象
presentation = pptApplication.ActivePresentation;
pptApplication.PresentationClose += PptApplication_PresentationClose;
pptApplication.SlideShowBegin += PptApplication_SlideShowBegin;
pptApplication.SlideShowNextSlide += PptApplication_SlideShowNextSlide;
pptApplication.SlideShowEnd += PptApplication_SlideShowEnd;
// 获得幻灯片对象集合
slides = presentation.Slides;
// 获得幻灯片的数量
slidescount = slides.Count;
memoryStreams = new MemoryStream[slidescount + 2];
// 获得当前选中的幻灯片
try
{
// 在普通视图下这种方式可以获得当前选中的幻灯片对象
// 然而在阅读模式下,这种方式会出现异常
slide = slides[pptApplication.ActiveWindow.Selection.SlideRange.SlideNumber];
}
catch
{
// 在阅读模式下出现异常时,通过下面的方式来获得当前选中的幻灯片对象
slide = pptApplication.SlideShowWindows[1].View.Slide;
}
}
if (pptApplication == null) throw new Exception();
//BtnCheckPPT.Visibility = Visibility.Collapsed;
Application.Current.Dispatcher.Invoke(() =>
{
BtnPPTSlideShow.Visibility = Visibility.Visible;
});
}
catch
{
//StackPanelPPTControls.Visibility = Visibility.Collapsed;
Application.Current.Dispatcher.Invoke(() =>
{
BtnPPTSlideShow.Visibility = Visibility.Collapsed;
});
timerCheckPPT.Start();
}
}
private void PptApplication_PresentationClose(Presentation Pres)
{
pptApplication = null;
timerCheckPPT.Start();
BtnPPTSlideShow.Visibility = Visibility.Collapsed;
BtnPPTSlideShowEnd.Visibility = Visibility.Collapsed;
}
private void PptApplication_SlideShowBegin(SlideShowWindow Wn)
{
Application.Current.Dispatcher.Invoke(() =>
{
slidescount = Wn.Presentation.Slides.Count;
memoryStreams = new MemoryStream[slidescount + 2];
StackPanelPPTControls.Visibility = Visibility.Visible;
BtnPPTSlideShow.Visibility = Visibility.Collapsed;
BtnPPTSlideShowEnd.Visibility = Visibility.Visible;
ViewBoxStackPanelMain.Margin = new Thickness(10, 10, 10, 10);
if (Settings.Behavior.IsShowCanvasAtNewSlideShow && Main_Grid.Background == Brushes.Transparent)
{
BtnHideInkCanvas_Click(BtnHideInkCanvas, null);
}
if (GridBackgroundCover.Visibility == Visibility.Visible)
{
currentMode = 0;
GridBackgroundCover.Visibility = Visibility.Hidden;
}
inkCanvas.Strokes.Clear();
});
previousSlideID = Wn.View.CurrentShowPosition;
}
private void PptApplication_SlideShowEnd(Presentation Pres)
{
Application.Current.Dispatcher.Invoke(() =>
{
BtnPPTSlideShow.Visibility = Visibility.Visible;
BtnPPTSlideShowEnd.Visibility = Visibility.Collapsed;
StackPanelPPTControls.Visibility = Visibility.Collapsed;
ViewBoxStackPanelMain.Margin = new Thickness(10, 10, 10, 55);
inkCanvas.Strokes.Clear();
if (Main_Grid.Background != Brushes.Transparent)
{
BtnHideInkCanvas_Click(BtnHideInkCanvas, null);
}
});
}
private void Main_Grid_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (StackPanelPPTControls.Visibility != Visibility.Visible) return;
if (e.Key == Key.Down || e.Key == Key.PageDown || e.Key == Key.Right)
{
BtnPPTSlidesDown_Click(BtnPPTSlidesDown, null);
}
if (e.Key == Key.Up || e.Key == Key.PageUp || e.Key == Key.Left)
{
BtnPPTSlidesUp_Click(BtnPPTSlidesUp, null);
}
}
int previousSlideID = 0;
MemoryStream[] memoryStreams = new MemoryStream[50];
private void PptApplication_SlideShowNextSlide(SlideShowWindow Wn)
{
if (Wn.View.CurrentShowPosition != previousSlideID)
{
Application.Current.Dispatcher.Invoke(() =>
{
MemoryStream ms = new MemoryStream();
inkCanvas.Strokes.Save(ms);
ms.Position = 0;
memoryStreams[previousSlideID] = ms;
inkCanvas.Strokes.Clear();
try
{
if (memoryStreams[Wn.View.CurrentShowPosition].Length > 0)
{
inkCanvas.Strokes = new System.Windows.Ink.StrokeCollection(memoryStreams[Wn.View.CurrentShowPosition]);
}
}
catch (Exception ex)
{ }
});
previousSlideID = Wn.View.CurrentShowPosition;
}
}
private void BtnPPTSlidesUp_Click(object sender, RoutedEventArgs e)
{
if (currentMode == 1)
{
GridBackgroundCover.Visibility = Visibility.Hidden;
currentMode = 0;
}
try
{
new Thread(new ThreadStart(() =>
{
pptApplication.SlideShowWindows[1].View.Application.SlideShowWindows[1].Activate();
pptApplication.SlideShowWindows[1].View.Previous();
})).Start();
}
catch
{
//BtnCheckPPT.Visibility = Visibility.Visible;
StackPanelPPTControls.Visibility = Visibility.Collapsed;
}
}
private void BtnPPTSlidesDown_Click(object sender, RoutedEventArgs e)
{
if (currentMode == 1)
{
GridBackgroundCover.Visibility = Visibility.Hidden;
currentMode = 0;
}
try
{
new Thread(new ThreadStart(() =>
{
pptApplication.SlideShowWindows[1].View.Application.SlideShowWindows[1].Activate();
pptApplication.SlideShowWindows[1].View.Next();
})).Start();
}
catch (Exception ex)
{
//BtnCheckPPT.Visibility = Visibility.Visible;
StackPanelPPTControls.Visibility = Visibility.Collapsed;
//MessageBox.Show(ex.ToString());
}
}
private void BtnPPTSlideShow_Click(object sender, RoutedEventArgs e)
{
new Thread(new ThreadStart(() =>
{
try
{
presentation.SlideShowSettings.Run();
}
catch { }
})).Start();
}
private void BtnPPTSlideShowEnd_Click(object sender, RoutedEventArgs e)
{
new Thread(new ThreadStart(() =>
{
try
{
pptApplication.SlideShowWindows[1].View.Exit();
}
catch { }
})).Start();
}
#endregion
#region Settings
#region Behavior
private void ToggleSwitchRunAtStartup_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
if (ToggleSwitchRunAtStartup.IsOn)
{
StartAutomaticallyCreate("InkCanvas");
}
else
{
StartAutomaticallyDel("InkCanvas");
}
}
private void ToggleSwitchSupportPowerPoint_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
Settings.Behavior.PowerPointSupport = ToggleSwitchSupportPowerPoint.IsOn;
SaveSettingsToFile();
}
private void ToggleSwitchShowCanvasAtNewSlideShow_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
Settings.Behavior.IsShowCanvasAtNewSlideShow = ToggleSwitchShowCanvasAtNewSlideShow.IsOn;
SaveSettingsToFile();
}
#endregion
#region Startup
private void ToggleSwitchAutoHideCanvas_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
Settings.Startup.IsAutoHideCanvas = ToggleSwitchAutoHideCanvas.IsOn;
SaveSettingsToFile();
}
private void ToggleSwitchAutoEnterModeFinger_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
Settings.Startup.IsAutoEnterModeFinger = ToggleSwitchAutoEnterModeFinger.IsOn;
SaveSettingsToFile();
}
#endregion
#region Appearance
private void ToggleSwitchShowButtonExit_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
Settings.Appearance.IsShowExitButton = ToggleSwitchShowButtonExit.IsOn;
SaveSettingsToFile();
if (ToggleSwitchShowButtonExit.IsOn)
{
BtnExit.Visibility = Visibility.Visible;
}
else
{
BtnExit.Visibility = Visibility.Collapsed;
}
}
private void ToggleSwitchShowButtonEraser_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
Settings.Appearance.IsShowEraserButton = ToggleSwitchShowButtonEraser.IsOn;
SaveSettingsToFile();
if (ToggleSwitchShowButtonEraser.IsOn)
{
BtnErase.Visibility = Visibility.Visible;
}
else
{
BtnErase.Visibility = Visibility.Collapsed;
}
}
private void ToggleSwitchShowButtonHideControl_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
Settings.Appearance.IsShowHideControlButton = ToggleSwitchShowButtonHideControl.IsOn;
SaveSettingsToFile();
if (ToggleSwitchShowButtonHideControl.IsOn)
{
BtnHideControl.Visibility = Visibility.Visible;
}
else
{
BtnHideControl.Visibility = Visibility.Collapsed;
}
}
private void ToggleSwitchShowButtonLRSwitch_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
Settings.Appearance.IsShowLRSwitchButton = ToggleSwitchShowButtonLRSwitch.IsOn;
SaveSettingsToFile();
if (ToggleSwitchShowButtonLRSwitch.IsOn)
{
BtnSwitchSide.Visibility = Visibility.Visible;
}
else
{
BtnSwitchSide.Visibility = Visibility.Collapsed;
}
}
private void ToggleSwitchShowButtonModeFinger_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
Settings.Appearance.IsShowModeFingerToggleSwitch = ToggleSwitchShowButtonModeFinger.IsOn;
SaveSettingsToFile();
if (ToggleSwitchShowButtonModeFinger.IsOn)
{
StackPanelModeFinger.Visibility = Visibility.Visible;
}
else
{
StackPanelModeFinger.Visibility = Visibility.Collapsed;
}
}
#endregion
#region Canvas
private void InkWidthSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (!isLoaded) return;
drawingAttributes.Height = ((Slider)sender).Value / 2;
drawingAttributes.Width = ((Slider)sender).Value / 2;
Settings.Canvas.InkWidth = ((Slider)sender).Value / 2;
SaveSettingsToFile();
}
#endregion
private void SaveSettingsToFile()
{
string text = JsonConvert.SerializeObject(Settings, Formatting.Indented);
try
{
File.WriteAllText(settingsFileName, text);
}
catch { }
}
private void SCManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e)
{
e.Handled = true;
}
private void HyperlinkSource_Click(object sender, RoutedEventArgs e)
{
Process.Start("https://github.com/WXRIW/Ink-Canvas");
}
#endregion
public static string GetWebClient(string url)
{
HttpWebRequest myrq = (HttpWebRequest)WebRequest.Create(url);
myrq.Proxy = null;
myrq.KeepAlive = false;
myrq.Timeout = 30 * 1000;
myrq.Method = "Get";
myrq.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
myrq.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4098.3 Safari/537.36";
HttpWebResponse myrp;
try
{
myrp = (HttpWebResponse)myrq.GetResponse();
}
catch (WebException ex)
{
myrp = (HttpWebResponse)ex.Response;
}
if (myrp.StatusCode != HttpStatusCode.OK)
{
return "null";
}
using (StreamReader sr = new StreamReader(myrp.GetResponseStream()))
{
return sr.ReadToEnd();
}
}
#region
/// <summary>
/// 开机自启创建
/// </summary>
/// <param name="exeName">程序名称</param>
/// <returns></returns>
public bool StartAutomaticallyCreate(string exeName)
{
try
{
WshShell shell = new WshShell();
IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\" + exeName + ".lnk");
//设置快捷方式的目标所在的位置(源程序完整路径)
shortcut.TargetPath = System.Windows.Forms.Application.ExecutablePath;
//应用程序的工作目录
//当用户没有指定一个具体的目录时,快捷方式的目标应用程序将使用该属性所指定的目录来装载或保存文件。
shortcut.WorkingDirectory = System.Environment.CurrentDirectory;
//目标应用程序窗口类型(1.Normal window普通窗口,3.Maximized最大化窗口,7.Minimized最小化)
shortcut.WindowStyle = 1;
//快捷方式的描述
shortcut.Description = exeName + "_Ink";
//设置快捷键(如果有必要的话.)
//shortcut.Hotkey = "CTRL+ALT+D";
shortcut.Save();
return true;
}
catch (Exception) { }
return false;
}
/// <summary>
/// 开机自启删除
/// </summary>
/// <param name="exeName">程序名称</param>
/// <returns></returns>
public bool StartAutomaticallyDel(string exeName)
{
try
{
System.IO.File.Delete(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\" + exeName + ".lnk");
return true;
}
catch (Exception) { }
return false;
}
#endregion
private void Window_Closed(object sender, EventArgs e)
{
//if (!isAutoUpdateEnabled) return;
//try
//{
// if (OAUS.Core.VersionHelper.HasNewVersion(GetIp("ink.wxriw.cn"), 19570))
// {
// string updateExePath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater\\AutoUpdater.exe";
// System.Diagnostics.Process myProcess = System.Diagnostics.Process.Start(updateExePath);
// }
//}
//catch { }
}
/// <summary>
/// 传入域名返回对应的IP
/// </summary>
/// <param name="domainName">域名</param>
/// <returns></returns>
public static string GetIp(string domainName)
{
domainName = domainName.Replace("http://", "").Replace("https://", "");
IPHostEntry hostEntry = Dns.GetHostEntry(domainName);
IPEndPoint ipEndPoint = new IPEndPoint(hostEntry.AddressList[0], 0);
return ipEndPoint.Address.ToString();
}
private void inkCanvas_EditingModeChanged(object sender, RoutedEventArgs e)
{
if (Settings.Canvas.IsShowCursor)
{
if (((InkCanvas)sender).EditingMode == InkCanvasEditingMode.Ink || drawingShapeMode != 0)
{
((InkCanvas)sender).ForceCursor = true;
}
else
{
((InkCanvas)sender).ForceCursor = false;
}
}
else
{
((InkCanvas)sender).ForceCursor = false;
}
}
private void ToggleSwitchTransparentButtonBackground_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
Settings.Appearance.IsTransparentButtonBackground = ToggleSwitchTransparentButtonBackground.IsOn;
if (Settings.Appearance.IsTransparentButtonBackground)
{
BtnExit.Background = new SolidColorBrush(StringToColor("#7F909090"));
}
else
{
if (BtnSwitchTheme.Content.ToString() == "深色")
{
//Light
BtnExit.Background = new SolidColorBrush(StringToColor("#FFCCCCCC"));
}
else
{
//Dark
BtnExit.Background = new SolidColorBrush(StringToColor("#FF555555"));
}
}
SaveSettingsToFile();
}
private void ToggleSwitchShowCursor_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
Settings.Canvas.IsShowCursor = ToggleSwitchShowCursor.IsOn;
inkCanvas_EditingModeChanged(inkCanvas, null);
SaveSettingsToFile();
}
int drawingShapeMode = 0;
private void BtnPen_Click(object sender, RoutedEventArgs e)
{
forceEraser = false;
drawingShapeMode = 0;
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
inkCanvas.IsManipulationEnabled = true;
}
private void BtnDrawLine_Click(object sender, RoutedEventArgs e)
{
forceEraser = true;
drawingShapeMode = 1;
inkCanvas.EditingMode = InkCanvasEditingMode.None;
inkCanvas.IsManipulationEnabled = true;
}
private void BtnDrawArrow_Click(object sender, RoutedEventArgs e)
{
forceEraser = true;
drawingShapeMode = 2;
inkCanvas.EditingMode = InkCanvasEditingMode.None;
inkCanvas.IsManipulationEnabled = true;
}
private void BtnDrawRectangle_Click(object sender, RoutedEventArgs e)
{
forceEraser = true;
drawingShapeMode = 3;
inkCanvas.EditingMode = InkCanvasEditingMode.None;
inkCanvas.IsManipulationEnabled = true;
}
private void BtnDrawEllipse_Click(object sender, RoutedEventArgs e)
{
forceEraser = true;
drawingShapeMode = 4;
inkCanvas.EditingMode = InkCanvasEditingMode.None;
inkCanvas.IsManipulationEnabled = true;
}
private void inkCanvas_TouchMove(object sender, TouchEventArgs e)
{
if (drawingShapeMode != 0)
{
if (isLastTouchEraser)
{
if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByStroke)
{
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByStroke;
}
return;
}
if (isWaitUntilNextTouchDown) return;
if (dec.Count > 1)
{
isWaitUntilNextTouchDown = true;
try
{
inkCanvas.Strokes.Remove(lastTempStroke);
}
catch { }
return;
}
if (inkCanvas.EditingMode != InkCanvasEditingMode.None)
{
inkCanvas.EditingMode = InkCanvasEditingMode.None;
}
}
MouseTouchMove(e.GetTouchPoint(inkCanvas).Position);
}
private void MouseTouchMove(Point endP)
{
//System.Windows.Point endP = e.GetTouchPoint(inkCanvas).Position;
List<System.Windows.Point> pointList;
StylusPointCollection point;
Stroke stroke;
switch (drawingShapeMode)
{
case 1:
pointList = new List<System.Windows.Point>{
new System.Windows.Point(iniP.X, iniP.Y),
new System.Windows.Point(endP.X, endP.Y)
};
point = new StylusPointCollection(pointList);
stroke = new Stroke(point)
{
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
};
try
{
inkCanvas.Strokes.Remove(lastTempStroke);
}
catch { }
lastTempStroke = stroke;
inkCanvas.Strokes.Add(stroke);
break;
case 2:
double w = 30, h = 10;
double theta = Math.Atan2(iniP.Y - endP.Y, iniP.X - endP.X);
double sint = Math.Sin(theta);
double cost = Math.Cos(theta);
pointList = new List<Point>
{
new Point(iniP.X, iniP.Y),
new Point(endP.X , endP.Y),
new Point(endP.X + (w*cost - h*sint), endP.Y + (w*sint + h*cost)),
new Point(endP.X,endP.Y),
new Point(endP.X + (w*cost + h*sint), endP.Y - (h*cost - w*sint))
};
point = new StylusPointCollection(pointList);
stroke = new Stroke(point)
{
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
};
try
{
inkCanvas.Strokes.Remove(lastTempStroke);
}
catch { }
lastTempStroke = stroke;
inkCanvas.Strokes.Add(stroke);
break;
case 3:
pointList = new List<System.Windows.Point>{
new System.Windows.Point(iniP.X, iniP.Y),
new System.Windows.Point(iniP.X, endP.Y),
new System.Windows.Point(endP.X, endP.Y),
new System.Windows.Point(endP.X, iniP.Y),
new System.Windows.Point(iniP.X, iniP.Y)
};
point = new StylusPointCollection(pointList);
stroke = new Stroke(point)
{
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
};
try
{
inkCanvas.Strokes.Remove(lastTempStroke);
}
catch { }
lastTempStroke = stroke;
inkCanvas.Strokes.Add(stroke);
break;
case 4:
pointList = GenerateEclipseGeometry(iniP, endP);
point = new StylusPointCollection(pointList);
stroke = new Stroke(point)
{
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
};
try
{
inkCanvas.Strokes.Remove(lastTempStroke);
}
catch { }
lastTempStroke = stroke;
inkCanvas.Strokes.Add(stroke);
break;
}
}
private void Main_Grid_TouchUp(object sender, TouchEventArgs e)
{
lastTempStroke = null;
if (dec.Count == 0)
{
isWaitUntilNextTouchDown = false;
}
}
Stroke lastTempStroke = null; bool isWaitUntilNextTouchDown = false;
private List<System.Windows.Point> GenerateEclipseGeometry(System.Windows.Point st, System.Windows.Point ed)
{
double a = 0.5 * (ed.X - st.X);
double b = 0.5 * (ed.Y - st.Y);
List<System.Windows.Point> pointList = new List<System.Windows.Point>();
for (double r = 0; r <= 2 * Math.PI; r = r + 0.01)
{
pointList.Add(new System.Windows.Point(0.5 * (st.X + ed.X) + a * Math.Cos(r), 0.5 * (st.Y + ed.Y) + b * Math.Sin(r)));
}
return pointList;
}
bool isMouseDown = false;
private void inkCanvas_MouseDown(object sender, MouseButtonEventArgs e)
{
iniP = e.GetPosition(inkCanvas);
isMouseDown = true;
}
private void inkCanvas_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown)
{
MouseTouchMove(e.GetPosition(inkCanvas));
}
}
private void inkCanvas_MouseUp(object sender, MouseButtonEventArgs e)
{
lastTempStroke = null;
isMouseDown = false;
}
private void ToggleSwitchEnableTwoFingerRotation_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
Settings.Gesture.IsEnableTwoFingerRotation = ToggleSwitchEnableTwoFingerRotation.IsOn;
SaveSettingsToFile();
}
private void ToggleSwitchEnableTwoFingerGestureInPresentationMode_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
Settings.Gesture.IsEnableTwoFingerGestureInPresentationMode = ToggleSwitchEnableTwoFingerGestureInPresentationMode.IsOn;
SaveSettingsToFile();
}
private void BtnResetToSuggestion_Click(object sender, RoutedEventArgs e)
{
try
{
isLoaded = false;
Settings = new Settings();
Settings.Appearance.IsShowEraserButton = false;
Settings.Appearance.IsShowExitButton = false;
Settings.Startup.IsAutoHideCanvas = true;
SaveSettingsToFile();
LoadSettings(false);
isLoaded = true;
if (ToggleSwitchRunAtStartup.IsOn == false)
{
ToggleSwitchRunAtStartup.IsOn = true;
}
}
catch { }
SymbolIconResetSuggestionComplete.Visibility = Visibility.Visible;
new Thread(new ThreadStart(() => {
Thread.Sleep(5000);
Application.Current.Dispatcher.Invoke(() =>
{
SymbolIconResetSuggestionComplete.Visibility = Visibility.Collapsed;
});
})).Start();
}
private void BtnResetToDefault_Click(object sender, RoutedEventArgs e)
{
try
{
isLoaded = false;
File.Delete("settings.json");
Settings = new Settings();
LoadSettings(false);
isLoaded = true;
}
catch { }
SymbolIconResetDefaultComplete.Visibility = Visibility.Visible;
new Thread(new ThreadStart(() => {
Thread.Sleep(5000);
Application.Current.Dispatcher.Invoke(() =>
{
SymbolIconResetDefaultComplete.Visibility = Visibility.Collapsed;
});
})).Start();
}
private void BtnSelect_Click(object sender, RoutedEventArgs e)
{
forceEraser = true;
drawingShapeMode = 0;
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
inkCanvas.IsManipulationEnabled = false;
}
private void inkCanvas_SelectionChanged(object sender, EventArgs e)
{
if (inkCanvas.GetSelectedStrokes().Count == 0)
{
GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed;
}
else
{
GridInkCanvasSelectionCover.Visibility = Visibility.Visible;
//GridInkCanvasSelectionCover.Height = inkCanvas.GetSelectionBounds().Height;
//GridInkCanvasSelectionCover.Width = inkCanvas.GetSelectionBounds().Width;
//GridInkCanvasSelectionCover.Margin = new Thickness(inkCanvas.GetSelectionBounds().Left, inkCanvas.GetSelectionBounds().Top, 0, 0);
}
}
private void GridInkCanvasSelectionCover_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
{
e.Mode = ManipulationModes.All;
}
private void GridInkCanvasSelectionCover_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
}
private void GridInkCanvasSelectionCover_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
if (dec.Count >= 1)
{
ManipulationDelta md = e.DeltaManipulation;
Vector trans = md.Translation; // 获得位移矢量
double rotate = md.Rotation; // 获得旋转角度
Vector scale = md.Scale; // 获得缩放倍数
Matrix m = new Matrix();
// Find center of element and then transform to get current location of center
FrameworkElement fe = e.Source as FrameworkElement;
Point center = new Point(fe.ActualWidth / 2, fe.ActualHeight / 2);
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
// Update matrix to reflect translation/rotation
m.Translate(trans.X, trans.Y); // 移动
if (Settings.Gesture.IsEnableTwoFingerRotation)
{
m.RotateAt(rotate, center.X, center.Y); // 旋转
}
m.ScaleAt(scale.X, scale.Y, center.X, center.Y); // 缩放
StrokeCollection strokes = inkCanvas.GetSelectedStrokes();
foreach (Stroke stroke in strokes)
{
stroke.Transform(m, false);
stroke.DrawingAttributes.Width *= md.Scale.X;
stroke.DrawingAttributes.Height *= md.Scale.Y;
}
}
}
private void GridInkCanvasSelectionCover_TouchDown(object sender, TouchEventArgs e)
{
}
private void GridInkCanvasSelectionCover_TouchUp(object sender, TouchEventArgs e)
{
}
Point lastTouchPointOnGridInkCanvasCover = new Point(0, 0);
private void GridInkCanvasSelectionCover_PreviewTouchDown(object sender, TouchEventArgs e)
{
dec.Add(e.TouchDevice.Id);
//设备1个的时候记录中心点
if (dec.Count == 1)
{
TouchPoint touchPoint = e.GetTouchPoint(null);
centerPoint = touchPoint.Position;
lastTouchPointOnGridInkCanvasCover = touchPoint.Position;
}
////设备两个及两个以上,将画笔功能关闭
//if (dec.Count > 1)
//{
// if (inkCanvas.EditingMode != InkCanvasEditingMode.None && inkCanvas.EditingMode != InkCanvasEditingMode.Select)
// {
// lastInkCanvasEditingMode = inkCanvas.EditingMode;
// inkCanvas.EditingMode = InkCanvasEditingMode.None;
// }
//}
}
private void GridInkCanvasSelectionCover_PreviewTouchUp(object sender, TouchEventArgs e)
{
if (lastTouchPointOnGridInkCanvasCover == e.GetTouchPoint(null).Position)
{
if (lastTouchPointOnGridInkCanvasCover.X < inkCanvas.GetSelectionBounds().Left ||
lastTouchPointOnGridInkCanvasCover.Y < inkCanvas.GetSelectionBounds().Top ||
lastTouchPointOnGridInkCanvasCover.X > inkCanvas.GetSelectionBounds().Right||
lastTouchPointOnGridInkCanvasCover.Y > inkCanvas.GetSelectionBounds().Bottom)
{
inkCanvas.Select(new StrokeCollection());
}
}
////手势完成后切回之前的状态
//if (dec.Count > 1)
//{
// if (inkCanvas.EditingMode == InkCanvasEditingMode.None)
// {
// inkCanvas.EditingMode = lastInkCanvasEditingMode;
// }
//}
dec.Remove(e.TouchDevice.Id);
}
}
enum HotkeyModifiers
{
MOD_ALT = 0x1,
MOD_CONTROL = 0x2,
MOD_SHIFT = 0x4,
MOD_WIN = 0x8
}
}