From 1baa74bb69d2c9a093e21c96c709151e796d75d6 Mon Sep 17 00:00:00 2001 From: CJK_mkp <113243675+CJKmkp@users.noreply.github.com> Date: Sat, 8 Nov 2025 22:07:38 +0800 Subject: [PATCH] =?UTF-8?q?improve:=E5=BF=AB=E6=8A=BD=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow.xaml | 77 ++++++++++++++++ Ink Canvas/MainWindow.xaml.cs | 165 +++++++++++++++++++++++++++++----- 2 files changed, 218 insertions(+), 24 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index beaa21df..552989f3 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -3956,6 +3956,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index 8078fda2..665025df 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -28,6 +28,9 @@ using Application = System.Windows.Application; using Brushes = System.Windows.Media.Brushes; using Button = System.Windows.Controls.Button; using Cursor = System.Windows.Input.Cursor; +using MouseEventArgs = System.Windows.Input.MouseEventArgs; +using HorizontalAlignment = System.Windows.HorizontalAlignment; +using VerticalAlignment = System.Windows.VerticalAlignment; using Cursors = System.Windows.Input.Cursors; using DpiChangedEventArgs = System.Windows.DpiChangedEventArgs; using File = System.IO.File; @@ -60,8 +63,10 @@ namespace Ink_Canvas // 悬浮窗拦截管理器 private FloatingWindowInterceptorManager _floatingWindowInterceptorManager; - // 快抽悬浮按钮 - private QuickDrawFloatingButton _quickDrawFloatingButton; + // 快抽悬浮按钮拖动相关 + private bool _quickDrawButtonIsDragging = false; + private Point _quickDrawButtonDragStartPoint; + private Point _quickDrawButtonWindowStartPoint; // 设置面板相关状态 private bool userChangedNoFocusModeInSettings; @@ -676,11 +681,7 @@ namespace Ink_Canvas LogHelper.WriteLogToFile("Ink Canvas closing", LogHelper.LogType.Event); try { - if (_quickDrawFloatingButton != null) - { - _quickDrawFloatingButton.Close(); - _quickDrawFloatingButton = null; - } + // 快抽按钮现在集成在主窗口中,不需要单独关闭 } catch (Exception ex) { @@ -3082,28 +3083,18 @@ namespace Ink_Canvas { try { + var quickDrawButton = FindName("QuickDrawFloatingButton") as Border; + if (quickDrawButton == null) return; + // 检查设置是否启用快抽功能 - if (Settings?.RandSettings?.EnableQuickDraw != true) + if (Settings?.RandSettings?.EnableQuickDraw == true) { - // 如果设置未启用,确保悬浮按钮被关闭 - if (_quickDrawFloatingButton != null) - { - _quickDrawFloatingButton.Close(); - _quickDrawFloatingButton = null; - } - return; + quickDrawButton.Visibility = Visibility.Visible; } - - // 如果已经存在悬浮按钮,先关闭它 - if (_quickDrawFloatingButton != null) + else { - _quickDrawFloatingButton.Close(); - _quickDrawFloatingButton = null; + quickDrawButton.Visibility = Visibility.Collapsed; } - - // 创建并显示悬浮按钮 - _quickDrawFloatingButton = new QuickDrawFloatingButton(); - _quickDrawFloatingButton.Show(); } catch (Exception ex) { @@ -3111,6 +3102,132 @@ namespace Ink_Canvas } } + /// + /// 快抽按钮点击事件 + /// + private void QuickDrawFloatingButton_Click(object sender, MouseButtonEventArgs e) + { + try + { + // 如果正在拖动,不触发点击事件 + if (_quickDrawButtonIsDragging) return; + + // 打开快抽窗口 + var quickDrawWindow = new QuickDrawWindow(); + quickDrawWindow.ShowDialog(); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"打开快抽窗口失败: {ex.Message}", LogHelper.LogType.Error); + } + } + + /// + /// 快抽按钮拖动区域鼠标按下事件 + /// + private void QuickDrawFloatingButton_DragArea_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + _quickDrawButtonIsDragging = false; + var quickDrawButton = FindName("QuickDrawFloatingButton") as Border; + if (quickDrawButton == null) return; + + // 记录鼠标在屏幕上的初始位置 + _quickDrawButtonDragStartPoint = quickDrawButton.PointToScreen(e.GetPosition(quickDrawButton)); + + // 记录按钮的初始位置(相对于Grid) + var parentGrid = quickDrawButton.Parent as Grid; + if (parentGrid != null) + { + var transform = quickDrawButton.TransformToVisual(parentGrid); + var currentPos = transform.Transform(new Point(0, 0)); + _quickDrawButtonWindowStartPoint = currentPos; + } + else + { + var currentMargin = quickDrawButton.Margin; + _quickDrawButtonWindowStartPoint = new Point( + double.IsNaN(currentMargin.Left) ? 0 : currentMargin.Left, + double.IsNaN(currentMargin.Top) ? 0 : currentMargin.Top); + } + + ((UIElement)sender).CaptureMouse(); + e.Handled = true; + } + + /// + /// 快抽按钮拖动区域鼠标移动事件 + /// + private void QuickDrawFloatingButton_DragArea_MouseMove(object sender, MouseEventArgs e) + { + var quickDrawButton = FindName("QuickDrawFloatingButton") as Border; + if (quickDrawButton == null) return; + + if (e.LeftButton == MouseButtonState.Pressed && ((UIElement)sender).IsMouseCaptured) + { + // 获取鼠标在屏幕上的当前位置 + Point currentScreenPoint = quickDrawButton.PointToScreen(e.GetPosition(quickDrawButton)); + Vector diff = currentScreenPoint - _quickDrawButtonDragStartPoint; + + if (!_quickDrawButtonIsDragging && (Math.Abs(diff.X) > 3 || Math.Abs(diff.Y) > 3)) + { + _quickDrawButtonIsDragging = true; + // 切换到绝对定位模式 + quickDrawButton.HorizontalAlignment = HorizontalAlignment.Left; + quickDrawButton.VerticalAlignment = VerticalAlignment.Top; + } + + if (_quickDrawButtonIsDragging) + { + // 计算新位置 + var parentGrid = quickDrawButton.Parent as Grid; + if (parentGrid != null) + { + // 计算屏幕坐标相对于Grid的位置 + var gridPoint = parentGrid.PointFromScreen(currentScreenPoint); + var startGridPoint = parentGrid.PointFromScreen(_quickDrawButtonDragStartPoint); + + // 计算相对于初始位置的偏移 + double offsetX = gridPoint.X - startGridPoint.X; + double offsetY = gridPoint.Y - startGridPoint.Y; + + // 新位置 = 初始位置 + 偏移 + double newLeft = _quickDrawButtonWindowStartPoint.X + offsetX; + double newTop = _quickDrawButtonWindowStartPoint.Y + offsetY; + + // 限制在Grid范围内 + newLeft = Math.Max(0, Math.Min(newLeft, parentGrid.ActualWidth - quickDrawButton.ActualWidth)); + newTop = Math.Max(0, Math.Min(newTop, parentGrid.ActualHeight - quickDrawButton.ActualHeight)); + + // 更新Margin + quickDrawButton.Margin = new Thickness(newLeft, newTop, 0, 0); + } + } + } + } + + /// + /// 快抽按钮拖动区域鼠标释放事件 + /// + private void QuickDrawFloatingButton_DragArea_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) + { + if (((UIElement)sender).IsMouseCaptured) + { + ((UIElement)sender).ReleaseMouseCapture(); + } + + if (_quickDrawButtonIsDragging) + { + Dispatcher.BeginInvoke(new Action(() => { _quickDrawButtonIsDragging = false; }), + DispatcherPriority.Background); + } + else + { + _quickDrawButtonIsDragging = false; + } + + e.Handled = true; + } + #endregion }