diff --git a/.all-contributorsrc b/.all-contributorsrc index 3ac1bb16..dd376fcb 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -89,6 +89,15 @@ "code", "design" ] + }, + { + "login": "Jursin", + "name": "Jursin", + "avatar_url": "https://avatars.githubusercontent.com/u/127487914?v=4", + "profile": "http://blog.jursin.top", + "contributions": [ + "design" + ] } ] } diff --git a/Ink Canvas/App.xaml b/Ink Canvas/App.xaml index 6575dacc..92169636 100644 --- a/Ink Canvas/App.xaml +++ b/Ink Canvas/App.xaml @@ -4,7 +4,7 @@ xmlns:local="clr-namespace:Ink_Canvas" xmlns:tb="http://www.hardcodet.net/taskbar" xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern" - StartupUri="MainWindow.xaml"> +> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -911,7 +841,20 @@ IsOn="False" FontFamily="Microsoft YaHei UI" FontWeight="Bold" Toggled="ToggleSwitchEnablePalmEraser_Toggled" /> - + + + + + + + + + + @@ -5684,6 +5627,7 @@ @@ -8676,6 +8620,7 @@ diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index c4667900..043d046f 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -239,6 +239,9 @@ namespace Ink_Canvas // 添加窗口激活事件处理,确保置顶状态在窗口重新激活时得到保持 this.Activated += Window_Activated; this.Deactivated += Window_Deactivated; + + // 为浮动栏按钮添加触摸事件支持 + AddTouchSupportToFloatingBarButtons(); } @@ -274,7 +277,6 @@ namespace Ink_Canvas drawingAttributes.FitToCurve = Settings.Canvas.FitToCurve; } - inkCanvas.EditingMode = InkCanvasEditingMode.Ink; inkCanvas.Gesture += InkCanvas_Gesture; } catch { } @@ -808,6 +810,7 @@ namespace Ink_Canvas // 创建并显示更新窗口 HasNewUpdateWindow updateWindow = new HasNewUpdateWindow(currentVersion, AvailableLatestVersion, releaseDate, releaseNotes); + updateWindow.Owner = this; bool? dialogResult = updateWindow.ShowDialog(); // 如果窗口被关闭但没有点击按钮,则不执行任何操作 @@ -844,7 +847,7 @@ namespace Ink_Canvas App.IsAppExitByUser = true; // 准备批处理脚本 - AutoUpdateHelper.InstallNewVersionApp(AvailableLatestVersion, false); + AutoUpdateHelper.InstallNewVersionApp(AvailableLatestVersion, true); // 修改为静默模式,避免重复启动进程 // 关闭软件,让安装程序接管 Application.Current.Shutdown(); @@ -1676,6 +1679,8 @@ namespace Ink_Canvas private static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll")] private static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); + [DllImport("kernel32.dll")] + private static extern uint GetCurrentProcessId(); private const int GWL_EXSTYLE = -20; @@ -1818,11 +1823,21 @@ namespace Ink_Canvas return; } - // 检查当前窗口是否在最顶层 + // 检查是否有子窗口打开(模态对话框) var foregroundWindow = GetForegroundWindow(); if (foregroundWindow != hwnd) { - // 如果窗口不在最顶层,重新设置置顶 + // 检查前景窗口是否是当前应用程序的子窗口 + var foregroundWindowProcessId = GetWindowThreadProcessId(foregroundWindow, out uint processId); + var currentProcessId = GetCurrentProcessId(); + + if (processId == currentProcessId) + { + // 如果有子窗口在前景,暂停置顶维护 + return; + } + + // 如果窗口不在最顶层且没有子窗口,重新设置置顶 SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_SHOWWINDOW | SWP_NOOWNERZORDER); @@ -1832,7 +1847,6 @@ namespace Ink_Canvas { SetWindowLong(hwnd, GWL_EXSTYLE, exStyle | WS_EX_TOPMOST); } - } } catch (Exception ex) @@ -2025,8 +2039,11 @@ namespace Ink_Canvas try { _globalHotkeyManager = new GlobalHotkeyManager(this); - // 不在这里加载快捷键,等待需要时再加载 - LogHelper.WriteLogToFile("全局快捷键管理器已初始化(未加载快捷键)", LogHelper.LogType.Event); + // 启动时加载快捷键,但默认为鼠标模式,禁用快捷键以放行键盘操作 + _globalHotkeyManager.EnableHotkeyRegistration(); + // 启动时默认为鼠标模式,禁用快捷键 + _globalHotkeyManager.UpdateHotkeyStateForToolMode(true); + LogHelper.WriteLogToFile("全局快捷键管理器已初始化,启动时默认为鼠标模式并禁用快捷键", LogHelper.LogType.Event); } catch (Exception ex) { @@ -2047,6 +2064,7 @@ namespace Ink_Canvas return; } var hotkeySettingsWindow = new HotkeySettingsWindow(this, _globalHotkeyManager); + hotkeySettingsWindow.Owner = this; hotkeySettingsWindow.ShowDialog(); } catch (Exception ex) @@ -2179,5 +2197,38 @@ namespace Ink_Canvas } } #endregion + + /// + /// 集中管理工具模式切换和快捷键状态更新 + /// 避免在每个工具按钮点击时重复刷新快捷键状态 + /// + /// 新的编辑模式 + /// 可选的额外操作委托 + internal void SetCurrentToolMode(InkCanvasEditingMode newMode, Action additionalActions = null) + { + try + { + // 执行模式切换 + inkCanvas.EditingMode = newMode; + + // 根据模式确定是否为鼠标模式(无工具模式) + bool isMouseMode = newMode == InkCanvasEditingMode.None; + + // 更新快捷键状态 + if (_globalHotkeyManager != null) + { + _globalHotkeyManager.UpdateHotkeyStateForToolMode(isMouseMode); + } + + // 执行额外的操作(如果有) + additionalActions?.Invoke(); + + LogHelper.WriteLogToFile($"工具模式已切换到: {newMode}, 鼠标模式: {isMouseMode}", LogHelper.LogType.Trace); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"设置工具模式时出错: {ex.Message}", LogHelper.LogType.Error); + } + } } } diff --git a/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs b/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs index 03ee7c86..f94917af 100644 --- a/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs @@ -704,7 +704,8 @@ namespace Ink_Canvas forceEraser = false; forcePointEraser = false; drawingShapeMode = 0; - inkCanvas.EditingMode = InkCanvasEditingMode.Select; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Select); SetCursorBasedOnEditingMode(inkCanvas); } @@ -721,7 +722,8 @@ namespace Ink_Canvas forcePointEraser = false; inkCanvas.EraserShape = new EllipseStylusShape(5, 5); - inkCanvas.EditingMode = InkCanvasEditingMode.EraseByStroke; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.EraseByStroke); drawingShapeMode = 0; // 修复:切换到线擦时,确保重置笔的状态 diff --git a/Ink Canvas/MainWindow_cs/MW_Colors.cs b/Ink Canvas/MainWindow_cs/MW_Colors.cs index baa50911..57ce6f80 100644 --- a/Ink Canvas/MainWindow_cs/MW_Colors.cs +++ b/Ink Canvas/MainWindow_cs/MW_Colors.cs @@ -64,7 +64,8 @@ namespace Ink_Canvas { inkCanvas.IsManipulationEnabled = true; drawingShapeMode = 0; - inkCanvas.EditingMode = InkCanvasEditingMode.Ink; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Ink); CancelSingleFingerDragMode(); CheckColorTheme(); } diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index bc6ce32c..af76a843 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -28,35 +28,6 @@ namespace Ink_Canvas { public partial class MainWindow : Window { - #region 快捷键状态管理 - - /// - /// 统一的快捷键状态刷新方法 - /// 在工具切换时调用,避免重复代码 - /// - private void RefreshHotkeyState() - { - try - { - var hotkeyManagerField = this.GetType().GetField("_globalHotkeyManager", - System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); - if (hotkeyManagerField != null) - { - var hotkeyManager = hotkeyManagerField.GetValue(this); - if (hotkeyManager != null) - { - var updateMethod = hotkeyManager.GetType().GetMethod("UpdateHotkeyRegistrationState"); - updateMethod?.Invoke(hotkeyManager, null); - } - } - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"刷新快捷键状态时出错: {ex.Message}", LogHelper.LogType.Warning); - } - } - - #endregion #region "手勢"按鈕 @@ -820,8 +791,6 @@ namespace Ink_Canvas BtnSelect_Click(null, null); HideSubPanels("select"); - // 工具切换完成后,统一刷新快捷键状态 - RefreshHotkeyState(); } #endregion @@ -915,7 +884,11 @@ namespace Ink_Canvas HideSubPanels(); BtnSettings_Click(null, null); } - + private async void SymbolIconScreenshot_MouseUp(object sender, MouseButtonEventArgs e) { + HideSubPanelsImmediately(); + await Task.Delay(50); + SaveScreenShotToDesktop(); + } private void ImageCountdownTimer_MouseUp(object sender, MouseButtonEventArgs e) { @@ -1589,6 +1562,10 @@ namespace Ink_Canvas // 隱藏高亮 HideFloatingBarHighlight(); + // 使用集中化的工具模式切换方法,确保快捷键状态正确更新 + // 鼠标模式下应该禁用快捷键以放行键盘操作 + SetCurrentToolMode(InkCanvasEditingMode.None); + // 切换前自动截图保存墨迹 if (inkCanvas.Strokes.Count > 0 && inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber) @@ -1681,14 +1658,6 @@ namespace Ink_Canvas else ViewboxFloatingBarMarginAnimation(100, true); } - - // 工具切换完成后,统一刷新快捷键状态 - RefreshHotkeyState(); - - if (BtnSwitchTheme.Content.ToString() == "浅色") - BtnSwitch.Content = "黑板"; - else - BtnSwitch.Content = "白板"; } internal void PenIcon_Click(object sender, RoutedEventArgs e) @@ -1719,7 +1688,8 @@ namespace Ink_Canvas if (Pen_Icon.Background == null || StackPanelCanvasControls.Visibility == Visibility.Collapsed) { - inkCanvas.EditingMode = InkCanvasEditingMode.Ink; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Ink); GridTransparencyFakeBackground.Opacity = 1; GridTransparencyFakeBackground.Background = new SolidColorBrush(StringToColor("#01FFFFFF")); @@ -1752,7 +1722,8 @@ namespace Ink_Canvas StackPanelCanvasControls.Visibility = Visibility.Visible; //AnimationsHelper.ShowWithSlideFromLeftAndFade(StackPanelCanvasControls); CheckEnableTwoFingerGestureBtnVisibility(true); - inkCanvas.EditingMode = InkCanvasEditingMode.Ink; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Ink); // 在批注模式下显示快捷调色盘(如果设置中启用了) if (Settings.Appearance.IsShowQuickColorPalette && QuickColorPalettePanel != null && QuickColorPaletteSingleRowPanel != null) @@ -1873,7 +1844,8 @@ namespace Ink_Canvas { SaveStrokes(); } - inkCanvas.EditingMode = InkCanvasEditingMode.Ink; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Ink); // 修复:从线擦切换到批注时,保持之前的笔类型状态 forceEraser = false; @@ -1901,9 +1873,6 @@ namespace Ink_Canvas } } - - // 延迟半秒后再刷新快捷键状态 - Task.Delay(500).ContinueWith(_ => Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => RefreshHotkeyState()))); // 修复:从线擦切换到批注时,保持之前的笔类型状态 forceEraser = false; @@ -1936,7 +1905,8 @@ namespace Ink_Canvas EnableAdvancedEraserSystem(); // 使用新的高级橡皮擦系统 - inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.EraseByPoint); ApplyAdvancedEraserShape(); // 使用新的橡皮擦形状应用方法 SetCursorBasedOnEditingMode(inkCanvas); HideSubPanels("eraser"); // 高亮橡皮按钮 @@ -1961,9 +1931,6 @@ namespace Ink_Canvas AnimationsHelper.HideWithSlideAndFade(BoardEraserSizePanel); } } - - // 工具切换完成后,统一刷新快捷键状态 - RefreshHotkeyState(); } private void BoardEraserIcon_Click(object sender, RoutedEventArgs e) @@ -1978,7 +1945,8 @@ namespace Ink_Canvas EnableAdvancedEraserSystem(); // 使用新的高级橡皮擦系统 - inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.EraseByPoint); ApplyAdvancedEraserShape(); // 使用新的橡皮擦形状应用方法 SetCursorBasedOnEditingMode(inkCanvas); HideSubPanels("eraser"); // 高亮橡皮按钮 @@ -1998,9 +1966,6 @@ namespace Ink_Canvas AnimationsHelper.HideWithSlideAndFade(EraserSizePanel); } } - - // 工具切换完成后,统一刷新快捷键状态 - RefreshHotkeyState(); } private void EraserIconByStrokes_Click(object sender, RoutedEventArgs e) @@ -2018,7 +1983,8 @@ namespace Ink_Canvas forcePointEraser = false; inkCanvas.EraserShape = new EllipseStylusShape(5, 5); - inkCanvas.EditingMode = InkCanvasEditingMode.EraseByStroke; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.EraseByStroke); drawingShapeMode = 0; // 修复:切换到线擦时,保存当前的笔类型状态,而不是强制重置 @@ -2030,8 +1996,6 @@ namespace Ink_Canvas HideSubPanels("eraserByStrokes"); - // 工具切换完成后,统一刷新快捷键状态 - RefreshHotkeyState(); } private void CursorWithDelIcon_Click(object sender, RoutedEventArgs e) @@ -2301,7 +2265,8 @@ namespace Ink_Canvas } else { - inkCanvas.EditingMode = InkCanvasEditingMode.Select; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Select); } } @@ -3109,6 +3074,158 @@ namespace Ink_Canvas } } + #endregion + + #region 触摸事件支持 + + /// + /// 为浮动栏按钮添加触摸和手写笔事件支持,让触摸和手写笔点击直接调用对应的鼠标点击方法 + /// + private void AddTouchSupportToFloatingBarButtons() + { + // 为主要的浮动栏按钮添加触摸和手写笔事件支持 + if (SymbolIconSelect != null) + { + SymbolIconSelect.TouchDown += (s, e) => SymbolIconSelect_MouseUp(s, null); + SymbolIconSelect.StylusDown += (s, e) => SymbolIconSelect_MouseUp(s, null); + } + + if (SymbolIconUndo != null) + { + SymbolIconUndo.TouchDown += (s, e) => SymbolIconUndo_MouseUp(s, null); + SymbolIconUndo.StylusDown += (s, e) => SymbolIconUndo_MouseUp(s, null); + } + + if (SymbolIconRedo != null) + { + SymbolIconRedo.TouchDown += (s, e) => SymbolIconRedo_MouseUp(s, null); + SymbolIconRedo.StylusDown += (s, e) => SymbolIconRedo_MouseUp(s, null); + } + + if (SymbolIconDelete != null) + { + SymbolIconDelete.TouchDown += (s, e) => SymbolIconDelete_MouseUp(s, null); + SymbolIconDelete.StylusDown += (s, e) => SymbolIconDelete_MouseUp(s, null); + } + + if (ToolsFloatingBarBtn != null) + { + ToolsFloatingBarBtn.TouchDown += (s, e) => SymbolIconTools_MouseUp(s, null); + ToolsFloatingBarBtn.StylusDown += (s, e) => SymbolIconTools_MouseUp(s, null); + } + + if (RandomDrawPanel != null) + { + RandomDrawPanel.TouchDown += (s, e) => SymbolIconRand_MouseUp(s, null); + RandomDrawPanel.StylusDown += (s, e) => SymbolIconRand_MouseUp(s, null); + } + + if (SingleDrawPanel != null) + { + SingleDrawPanel.TouchDown += (s, e) => SymbolIconRandOne_MouseUp(s, null); + SingleDrawPanel.StylusDown += (s, e) => SymbolIconRandOne_MouseUp(s, null); + } + + // 注意:Screenshot和Settings按钮在XAML中没有直接的Name属性,需要通过其他方式绑定 + // 这些按钮的事件处理已经在XAML中通过MouseUp绑定 + + if (BorderFloatingBarMoveControls != null) + { + BorderFloatingBarMoveControls.TouchDown += (s, e) => SymbolIconEmoji_MouseUp(s, null); + BorderFloatingBarMoveControls.StylusDown += (s, e) => SymbolIconEmoji_MouseUp(s, null); + } + + // 白板模式下的按钮不添加触摸事件支持,保持原有的鼠标事件处理 + + // 为快捷调色盘按钮添加触摸和手写笔事件支持 + if (QuickColorWhite != null) + { + QuickColorWhite.TouchDown += (s, e) => QuickColorWhite_Click(s, null); + QuickColorWhite.StylusDown += (s, e) => QuickColorWhite_Click(s, null); + } + + if (QuickColorOrange != null) + { + QuickColorOrange.TouchDown += (s, e) => QuickColorOrange_Click(s, null); + QuickColorOrange.StylusDown += (s, e) => QuickColorOrange_Click(s, null); + } + + if (QuickColorYellow != null) + { + QuickColorYellow.TouchDown += (s, e) => QuickColorYellow_Click(s, null); + QuickColorYellow.StylusDown += (s, e) => QuickColorYellow_Click(s, null); + } + + if (QuickColorBlack != null) + { + QuickColorBlack.TouchDown += (s, e) => QuickColorBlack_Click(s, null); + QuickColorBlack.StylusDown += (s, e) => QuickColorBlack_Click(s, null); + } + + if (QuickColorBlue != null) + { + QuickColorBlue.TouchDown += (s, e) => QuickColorBlue_Click(s, null); + QuickColorBlue.StylusDown += (s, e) => QuickColorBlue_Click(s, null); + } + + if (QuickColorRed != null) + { + QuickColorRed.TouchDown += (s, e) => QuickColorRed_Click(s, null); + QuickColorRed.StylusDown += (s, e) => QuickColorRed_Click(s, null); + } + + if (QuickColorGreen != null) + { + QuickColorGreen.TouchDown += (s, e) => QuickColorGreen_Click(s, null); + QuickColorGreen.StylusDown += (s, e) => QuickColorGreen_Click(s, null); + } + + if (QuickColorPurple != null) + { + QuickColorPurple.TouchDown += (s, e) => QuickColorPurple_Click(s, null); + QuickColorPurple.StylusDown += (s, e) => QuickColorPurple_Click(s, null); + } + + // 单行快捷调色盘 + if (QuickColorWhiteSingle != null) + { + QuickColorWhiteSingle.TouchDown += (s, e) => QuickColorWhite_Click(s, null); + QuickColorWhiteSingle.StylusDown += (s, e) => QuickColorWhite_Click(s, null); + } + + if (QuickColorOrangeSingle != null) + { + QuickColorOrangeSingle.TouchDown += (s, e) => QuickColorOrange_Click(s, null); + QuickColorOrangeSingle.StylusDown += (s, e) => QuickColorOrange_Click(s, null); + } + + if (QuickColorYellowSingle != null) + { + QuickColorYellowSingle.TouchDown += (s, e) => QuickColorYellow_Click(s, null); + QuickColorYellowSingle.StylusDown += (s, e) => QuickColorYellow_Click(s, null); + } + + if (QuickColorBlackSingle != null) + { + QuickColorBlackSingle.TouchDown += (s, e) => QuickColorBlack_Click(s, null); + QuickColorBlackSingle.StylusDown += (s, e) => QuickColorBlack_Click(s, null); + } + + if (QuickColorRedSingle != null) + { + QuickColorRedSingle.TouchDown += (s, e) => QuickColorRed_Click(s, null); + QuickColorRedSingle.StylusDown += (s, e) => QuickColorRed_Click(s, null); + } + + if (QuickColorGreenSingle != null) + { + QuickColorGreenSingle.TouchDown += (s, e) => QuickColorGreen_Click(s, null); + QuickColorGreenSingle.StylusDown += (s, e) => QuickColorGreen_Click(s, null); + } + } + + + #endregion } diff --git a/Ink Canvas/MainWindow_cs/MW_Hotkeys.cs b/Ink Canvas/MainWindow_cs/MW_Hotkeys.cs index edcbbbb1..a0cbc550 100644 --- a/Ink Canvas/MainWindow_cs/MW_Hotkeys.cs +++ b/Ink Canvas/MainWindow_cs/MW_Hotkeys.cs @@ -44,15 +44,8 @@ namespace Ink_Canvas } } - private void Window_KeyDown(object sender, KeyEventArgs e) - { - if (e.Key == Key.Escape) KeyExit(null, null); - } - - private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) - { - e.CanExecute = true; - } + // 保留PPT翻页快捷键处理 + // 以下方法保留供全局快捷键调用 private void HotKey_Undo(object sender, ExecutedRoutedEventArgs e) { diff --git a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs index c302795f..a87dec7b 100644 --- a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs +++ b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs @@ -276,8 +276,10 @@ namespace Ink_Canvas { if (inkCanvas.GetSelectedStrokes().Count == inkCanvas.Strokes.Count) { - inkCanvas.EditingMode = InkCanvasEditingMode.Ink; - inkCanvas.EditingMode = InkCanvasEditingMode.Select; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Ink, () => { + SetCurrentToolMode(InkCanvasEditingMode.Select); + }); } else { @@ -290,7 +292,8 @@ namespace Ink_Canvas } else { - inkCanvas.EditingMode = InkCanvasEditingMode.Select; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Select); } } @@ -454,7 +457,8 @@ namespace Ink_Canvas else { // 新增:启动套索选择模式 - inkCanvas.EditingMode = InkCanvasEditingMode.Select; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Select); inkCanvas.Select(new StrokeCollection()); } } @@ -492,7 +496,8 @@ namespace Ink_Canvas forceEraser = false; forcePointEraser = false; drawingShapeMode = 0; - inkCanvas.EditingMode = InkCanvasEditingMode.Select; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Select); SetCursorBasedOnEditingMode(inkCanvas); } @@ -502,7 +507,8 @@ namespace Ink_Canvas forceEraser = false; forcePointEraser = false; drawingShapeMode = 0; - inkCanvas.EditingMode = InkCanvasEditingMode.Select; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Select); inkCanvas.IsManipulationEnabled = true; SetCursorBasedOnEditingMode(inkCanvas); } diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs index 017cc6fd..9d7ca62a 100644 --- a/Ink Canvas/MainWindow_cs/MW_Settings.cs +++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs @@ -3034,6 +3034,12 @@ namespace Ink_Canvas #endregion + private void ComboBoxPalmEraserSensitivity_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (!isLoaded) return; + Settings.Canvas.PalmEraserSensitivity = ComboBoxPalmEraserSensitivity.SelectedIndex; + SaveSettingsToFile(); + } } } diff --git a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs index 439fd7e5..a423b3c2 100644 --- a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs +++ b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs @@ -683,6 +683,7 @@ namespace Ink_Canvas if (Settings.Canvas != null) { ToggleSwitchEnablePalmEraser.IsOn = Settings.Canvas.EnablePalmEraser; + ComboBoxPalmEraserSensitivity.SelectedIndex = Settings.Canvas.PalmEraserSensitivity; } // Advanced diff --git a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs index fdaf44ba..5ca45da5 100644 --- a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs +++ b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs @@ -555,6 +555,7 @@ namespace Ink_Canvas { // 禁用原有的FitToCurve,使用新的高级贝塞尔曲线平滑 if (Settings.Canvas.FitToCurve) drawingAttributes.FitToCurve = false; + // 在绘制过程中禁用浮动栏交互,避免干扰绘制 ViewboxFloatingBar.IsHitTestVisible = false; BlackboardUIGridForInkReplay.IsHitTestVisible = false; List pointList; @@ -1668,6 +1669,18 @@ namespace Ink_Canvas private void inkCanvas_MouseDown(object sender, MouseButtonEventArgs e) { + // 检查鼠标点击是否发生在浮动栏区域,如果是则允许事件传播到浮动栏按钮 + var mousePoint = e.GetPosition(this); + var floatingBarBounds = ViewboxFloatingBar.TransformToAncestor(this).TransformBounds( + new Rect(0, 0, ViewboxFloatingBar.ActualWidth, ViewboxFloatingBar.ActualHeight)); + + // 如果鼠标点击发生在浮动栏区域,不阻止事件传播,让浮动栏按钮能够接收鼠标事件 + if (floatingBarBounds.Contains(mousePoint)) + { + // 不设置 ViewboxFloatingBar.IsHitTestVisible = false,让浮动栏按钮能够接收鼠标事件 + return; + } + inkCanvas.CaptureMouse(); ViewboxFloatingBar.IsHitTestVisible = false; BlackboardUIGridForInkReplay.IsHitTestVisible = false; diff --git a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs index 92129d26..d24d6f42 100644 --- a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs +++ b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs @@ -109,6 +109,18 @@ namespace Ink_Canvas private void MainWindow_TouchDown(object sender, TouchEventArgs e) { + // 检查触摸是否发生在浮动栏区域,如果是则允许事件传播到浮动栏按钮 + var touchPoint = e.GetTouchPoint(this); + var floatingBarBounds = ViewboxFloatingBar.TransformToAncestor(this).TransformBounds( + new Rect(0, 0, ViewboxFloatingBar.ActualWidth, ViewboxFloatingBar.ActualHeight)); + + // 如果触摸发生在浮动栏区域,不阻止事件传播,让浮动栏按钮能够接收触摸事件 + if (floatingBarBounds.Contains(touchPoint.Position)) + { + // 不设置 ViewboxFloatingBar.IsHitTestVisible = false,让浮动栏按钮能够接收触摸事件 + return; + } + if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint || inkCanvas.EditingMode == InkCanvasEditingMode.EraseByStroke || inkCanvas.EditingMode == InkCanvasEditingMode.Select) return; @@ -139,6 +151,18 @@ namespace Ink_Canvas private void MainWindow_StylusDown(object sender, StylusDownEventArgs e) { + // 检查手写笔点击是否发生在浮动栏区域,如果是则允许事件传播到浮动栏按钮 + var stylusPoint = e.GetPosition(this); + var floatingBarBounds = ViewboxFloatingBar.TransformToAncestor(this).TransformBounds( + new Rect(0, 0, ViewboxFloatingBar.ActualWidth, ViewboxFloatingBar.ActualHeight)); + + // 如果手写笔点击发生在浮动栏区域,不阻止事件传播,让浮动栏按钮能够接收手写笔事件 + if (floatingBarBounds.Contains(stylusPoint)) + { + // 不设置 ViewboxFloatingBar.IsHitTestVisible = false,让浮动栏按钮能够接收手写笔事件 + return; + } + LogHelper.WriteLogToFile($"MainWindow_StylusDown 被调用,笔尾状态: {e.StylusDevice.Inverted}, 当前 drawingShapeMode: {drawingShapeMode}, 当前 EditingMode: {inkCanvas.EditingMode}", LogHelper.LogType.Info); // 新增:根据是否为笔尾自动切换橡皮擦/画笔模式 @@ -323,6 +347,18 @@ namespace Ink_Canvas private void Main_Grid_TouchDown(object sender, TouchEventArgs e) { + // 检查触摸是否发生在浮动栏区域,如果是则允许事件传播到浮动栏按钮 + var touchPoint = e.GetTouchPoint(this); + var floatingBarBounds = ViewboxFloatingBar.TransformToAncestor(this).TransformBounds( + new Rect(0, 0, ViewboxFloatingBar.ActualWidth, ViewboxFloatingBar.ActualHeight)); + + // 如果触摸发生在浮动栏区域,不阻止事件传播,让浮动栏按钮能够接收触摸事件 + if (floatingBarBounds.Contains(touchPoint.Position)) + { + // 不设置 ViewboxFloatingBar.IsHitTestVisible = false,让浮动栏按钮能够接收触摸事件 + return; + } + SetCursorBasedOnEditingMode(inkCanvas); inkCanvas.CaptureTouch(e.TouchDevice); @@ -365,11 +401,24 @@ namespace Ink_Canvas private bool palmEraserWasEnabledBeforeMultiTouch; private bool palmEraserTouchDownHandled = false; // 新增:标记手掌擦触摸按下是否已处理 private DateTime palmEraserActivationTime; // 新增:记录手掌擦激活时间 - private const int PALM_ERASER_TIMEOUT_MS = 5000; // 新增:手掌擦超时时间(5秒) + private const int PALM_ERASER_TIMEOUT_MS = 3000; // 修改:减少手掌擦超时时间(3秒) private System.Windows.Threading.DispatcherTimer palmEraserRecoveryTimer; // 新增:手掌擦恢复定时器 + private HashSet palmEraserTouchIds = new HashSet(); // 新增:记录参与手掌擦的触摸点ID private void inkCanvas_PreviewTouchDown(object sender, TouchEventArgs e) { + // 检查触摸是否发生在浮动栏区域,如果是则允许事件传播到浮动栏按钮 + var touchPoint = e.GetTouchPoint(this); + var floatingBarBounds = ViewboxFloatingBar.TransformToAncestor(this).TransformBounds( + new Rect(0, 0, ViewboxFloatingBar.ActualWidth, ViewboxFloatingBar.ActualHeight)); + + // 如果触摸发生在浮动栏区域,不阻止事件传播,让浮动栏按钮能够接收触摸事件 + if (floatingBarBounds.Contains(touchPoint.Position)) + { + // 不设置 ViewboxFloatingBar.IsHitTestVisible = false,让浮动栏按钮能够接收触摸事件 + return; + } + // 橡皮状态下不做任何切换,直接return,保证橡皮可持续 if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint || inkCanvas.EditingMode == InkCanvasEditingMode.EraseByStroke) @@ -390,21 +439,21 @@ namespace Ink_Canvas // 修复:几何绘制模式下,只记录几何绘制的起点,不记录触摸轨迹 if (dec.Count == 0) { - var touchPoint = e.GetTouchPoint(inkCanvas); + var inkTouchPoint = e.GetTouchPoint(inkCanvas); // 对于双曲线绘制,第一笔时记录起点,第二笔时不更新起点 if (drawingShapeMode == 24 || drawingShapeMode == 25) { // 双曲线绘制:第一笔记录起点,第二笔保持第一笔的起点 if (drawMultiStepShapeCurrentStep == 0) { - iniP = touchPoint.Position; + iniP = inkTouchPoint.Position; } // 第二笔时不更新iniP,保持第一笔的起点 } else { // 其他图形正常记录起点 - iniP = touchPoint.Position; + iniP = inkTouchPoint.Position; } lastTouchDownStrokeCollection = inkCanvas.Strokes.Clone(); } @@ -419,16 +468,57 @@ namespace Ink_Canvas BlackboardUIGridForInkReplay.IsHitTestVisible = false; dec.Add(e.TouchDevice.Id); - // Palm Eraser 逻辑 - 修复:只在触摸按下时处理一次,避免重复触发 + // Palm Eraser 逻辑 - 优化:改进手掌判定条件,提高精度 if (Settings.Canvas.EnablePalmEraser && dec.Count >= 2 && !isPalmEraserActive && !palmEraserTouchDownHandled) { var bounds = e.GetTouchPoint(inkCanvas).Bounds; - double palmThreshold = 40; // 触摸面积阈值,可根据实际调整 - if (bounds.Width >= palmThreshold || bounds.Height >= palmThreshold) + + // 根据敏感度设置调整判定参数 + double palmThreshold; + double aspectRatioThreshold; + int minTouchPoints; + + switch (Settings.Canvas.PalmEraserSensitivity) + { + case 0: // 低敏感度 - 更严格的判定 + palmThreshold = 80; + aspectRatioThreshold = 0.4; + minTouchPoints = 4; + break; + case 1: // 中敏感度 - 平衡的判定 + palmThreshold = 60; + aspectRatioThreshold = 0.3; + minTouchPoints = 3; + break; + case 2: // 高敏感度 - 较宽松的判定 + default: + palmThreshold = 50; + aspectRatioThreshold = 0.25; + minTouchPoints = 2; + break; + } + + // 计算宽高比 + double aspectRatio = Math.Min(bounds.Width, bounds.Height) / Math.Max(bounds.Width, bounds.Height); + + // 更严格的手掌判定条件 + bool isLargeTouch = bounds.Width >= palmThreshold && bounds.Height >= palmThreshold; + bool isPalmLikeShape = aspectRatio >= aspectRatioThreshold; + bool hasMultipleTouchPoints = dec.Count >= minTouchPoints; + + if (isLargeTouch && isPalmLikeShape && hasMultipleTouchPoints) { // 记录当前编辑模式和高光状态 palmEraserLastEditingMode = inkCanvas.EditingMode; palmEraserLastIsHighlighter = drawingAttributes.IsHighlighter; + + // 记录参与手掌擦的触摸点ID + palmEraserTouchIds.Clear(); + foreach (int touchId in dec) + { + palmEraserTouchIds.Add(touchId); + } + // 切换为橡皮擦 EraserIcon_Click(null, null); isPalmEraserActive = true; @@ -437,13 +527,16 @@ namespace Ink_Canvas // 启动恢复定时器,防止卡死 StartPalmEraserRecoveryTimer(); + + // 记录日志 + LogHelper.WriteLogToFile($"Palm eraser activated - Sensitivity: {Settings.Canvas.PalmEraserSensitivity}, Touch bounds: {bounds.Width}x{bounds.Height}, Aspect ratio: {aspectRatio:F2}, Touch points: {dec.Count}", LogHelper.LogType.Info); } } // 设备1个的时候,记录中心点 if (dec.Count == 1) { - var touchPoint = e.GetTouchPoint(inkCanvas); + touchPoint = e.GetTouchPoint(inkCanvas); centerPoint = touchPoint.Position; // 修复:只允许在此处赋值iniP,防止TouchMove等其他地方覆盖,保证几何绘制起点一致 @@ -497,41 +590,54 @@ namespace Ink_Canvas ViewboxFloatingBar.IsHitTestVisible = true; BlackboardUIGridForInkReplay.IsHitTestVisible = true; - // Palm Eraser 逻辑:所有点抬起后恢复原编辑模式 + // Palm Eraser 逻辑:优化状态恢复机制 dec.Remove(e.TouchDevice.Id); - if (isPalmEraserActive && dec.Count == 0) + + // 如果是手掌擦的触摸点,从记录中移除 + if (palmEraserTouchIds.Contains(e.TouchDevice.Id)) + { + palmEraserTouchIds.Remove(e.TouchDevice.Id); + } + + // 当所有手掌擦触摸点都抬起时,恢复原编辑模式 + if (isPalmEraserActive && palmEraserTouchIds.Count == 0) { // 恢复高光状态 drawingAttributes.IsHighlighter = palmEraserLastIsHighlighter; - // 恢复编辑模式 - 修复:确保正确恢复状态 + + // 恢复编辑模式 - 优化:改进状态恢复逻辑 try { if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) { - if (palmEraserLastEditingMode == InkCanvasEditingMode.Ink) + // 根据之前的状态恢复 + switch (palmEraserLastEditingMode) { - PenIcon_Click(null, null); - } - else if (palmEraserLastEditingMode == InkCanvasEditingMode.Select) - { - SymbolIconSelect_MouseUp(null, null); - } - else - { - inkCanvas.EditingMode = palmEraserLastEditingMode; + case InkCanvasEditingMode.Ink: + PenIcon_Click(null, null); + break; + case InkCanvasEditingMode.Select: + SymbolIconSelect_MouseUp(null, null); + break; + default: + inkCanvas.EditingMode = palmEraserLastEditingMode; + break; } + + LogHelper.WriteLogToFile($"Palm eraser recovered to mode: {palmEraserLastEditingMode}", LogHelper.LogType.Info); } } catch (Exception ex) { // 如果恢复失败,强制切换到批注模式 - Trace.WriteLine($"Palm eraser recovery failed: {ex.Message}, forcing to Ink mode"); + LogHelper.WriteLogToFile($"Palm eraser recovery failed: {ex.Message}, forcing to Ink mode", LogHelper.LogType.Error); inkCanvas.EditingMode = InkCanvasEditingMode.Ink; } // 重置手掌擦状态 isPalmEraserActive = false; palmEraserTouchDownHandled = false; + palmEraserTouchIds.Clear(); // 停止恢复定时器 StopPalmEraserRecoveryTimer(); @@ -542,44 +648,47 @@ namespace Ink_Canvas ViewboxFloatingBar.IsHitTestVisible = true; BlackboardUIGridForInkReplay.IsHitTestVisible = true; + + LogHelper.WriteLogToFile("Palm eraser state reset completed", LogHelper.LogType.Info); } // 新增:超时检测 - 如果手掌擦激活时间过长,强制重置状态 - if (isPalmEraserActive && dec.Count == 0) + if (isPalmEraserActive) { var timeSinceActivation = DateTime.Now - palmEraserActivationTime; if (timeSinceActivation.TotalMilliseconds > PALM_ERASER_TIMEOUT_MS) { - Trace.WriteLine($"Palm eraser timeout detected ({timeSinceActivation.TotalMilliseconds}ms), forcing recovery"); + LogHelper.WriteLogToFile($"Palm eraser timeout detected ({timeSinceActivation.TotalMilliseconds}ms), forcing recovery", LogHelper.LogType.Warning); // 强制恢复状态 try { if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) { - if (palmEraserLastEditingMode == InkCanvasEditingMode.Ink) + switch (palmEraserLastEditingMode) { - PenIcon_Click(null, null); - } - else if (palmEraserLastEditingMode == InkCanvasEditingMode.Select) - { - SymbolIconSelect_MouseUp(null, null); - } - else - { - inkCanvas.EditingMode = palmEraserLastEditingMode; + case InkCanvasEditingMode.Ink: + PenIcon_Click(null, null); + break; + case InkCanvasEditingMode.Select: + SymbolIconSelect_MouseUp(null, null); + break; + default: + inkCanvas.EditingMode = palmEraserLastEditingMode; + break; } } } catch (Exception ex) { - Trace.WriteLine($"Palm eraser timeout recovery failed: {ex.Message}, forcing to Ink mode"); + LogHelper.WriteLogToFile($"Palm eraser timeout recovery failed: {ex.Message}, forcing to Ink mode", LogHelper.LogType.Error); inkCanvas.EditingMode = InkCanvasEditingMode.Ink; } // 重置所有手掌擦状态 isPalmEraserActive = false; palmEraserTouchDownHandled = false; + palmEraserTouchIds.Clear(); inkCanvas.IsHitTestVisible = true; inkCanvas.IsManipulationEnabled = true; @@ -588,6 +697,8 @@ namespace Ink_Canvas // 停止恢复定时器 StopPalmEraserRecoveryTimer(); + + LogHelper.WriteLogToFile("Palm eraser timeout recovery completed", LogHelper.LogType.Info); } } // 修复:几何绘制模式下,触摸抬手时应该正确处理,而不是简单模拟鼠标事件 @@ -656,6 +767,7 @@ namespace Ink_Canvas // 如果手掌擦还在激活状态但触摸点已清空,强制重置状态 isPalmEraserActive = false; palmEraserTouchDownHandled = false; + palmEraserTouchIds.Clear(); // 确保清空触摸点ID inkCanvas.IsHitTestVisible = true; inkCanvas.IsManipulationEnabled = true; @@ -902,36 +1014,39 @@ namespace Ink_Canvas var timeSinceActivation = DateTime.Now - palmEraserActivationTime; if (timeSinceActivation.TotalMilliseconds > PALM_ERASER_TIMEOUT_MS) { - Trace.WriteLine($"Palm eraser recovery timer triggered, forcing recovery after {timeSinceActivation.TotalMilliseconds}ms"); + LogHelper.WriteLogToFile($"Palm eraser recovery timer triggered, forcing recovery after {timeSinceActivation.TotalMilliseconds}ms", LogHelper.LogType.Warning); // 强制恢复状态 try { if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) { - if (palmEraserLastEditingMode == InkCanvasEditingMode.Ink) + switch (palmEraserLastEditingMode) { - PenIcon_Click(null, null); - } - else if (palmEraserLastEditingMode == InkCanvasEditingMode.Select) - { - SymbolIconSelect_MouseUp(null, null); - } - else - { - inkCanvas.EditingMode = palmEraserLastEditingMode; + case InkCanvasEditingMode.Ink: + PenIcon_Click(null, null); + break; + case InkCanvasEditingMode.Select: + SymbolIconSelect_MouseUp(null, null); + break; + default: + inkCanvas.EditingMode = palmEraserLastEditingMode; + break; } + + LogHelper.WriteLogToFile($"Palm eraser timer recovery to mode: {palmEraserLastEditingMode}", LogHelper.LogType.Info); } } catch (Exception ex) { - Trace.WriteLine($"Palm eraser recovery timer failed: {ex.Message}, forcing to Ink mode"); + LogHelper.WriteLogToFile($"Palm eraser recovery timer failed: {ex.Message}, forcing to Ink mode", LogHelper.LogType.Error); inkCanvas.EditingMode = InkCanvasEditingMode.Ink; } // 重置所有手掌擦状态 isPalmEraserActive = false; palmEraserTouchDownHandled = false; + palmEraserTouchIds.Clear(); inkCanvas.IsHitTestVisible = true; inkCanvas.IsManipulationEnabled = true; @@ -940,6 +1055,8 @@ namespace Ink_Canvas // 停止定时器 StopPalmEraserRecoveryTimer(); + + LogHelper.WriteLogToFile("Palm eraser timer recovery completed", LogHelper.LogType.Info); } } } diff --git a/Ink Canvas/Properties/AssemblyInfo.cs b/Ink Canvas/Properties/AssemblyInfo.cs index fa4d485a..68f1de06 100644 --- a/Ink Canvas/Properties/AssemblyInfo.cs +++ b/Ink Canvas/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System.Reflection; using System.Runtime.InteropServices; using System.Windows; @@ -10,7 +10,7 @@ using System.Windows; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("CJK_mkp")] [assembly: AssemblyProduct("InkCanvasForClass")] -[assembly: AssemblyCopyright("© Copyright HARKOTEK Studio 2024-now")] +[assembly: AssemblyCopyright("Copyright © HARKOTEK Studio 2024")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -49,5 +49,5 @@ using System.Windows; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.8.0")] -[assembly: AssemblyFileVersion("1.7.8.0")] +[assembly: AssemblyVersion("1.7.8.3")] +[assembly: AssemblyFileVersion("1.7.8.3")] diff --git a/Ink Canvas/Resources/Settings.cs b/Ink Canvas/Resources/Settings.cs index 9b8ed589..fc4e687a 100644 --- a/Ink Canvas/Resources/Settings.cs +++ b/Ink Canvas/Resources/Settings.cs @@ -88,6 +88,8 @@ namespace Ink_Canvas public bool IsCompressPicturesUploaded { get; set; } [JsonProperty("enablePalmEraser")] public bool EnablePalmEraser { get; set; } = true; + [JsonProperty("palmEraserSensitivity")] + public int PalmEraserSensitivity { get; set; } = 2; // 0-低敏感度, 1-中敏感度, 2-高敏感度 [JsonProperty("clearCanvasAlsoClearImages")] public bool ClearCanvasAlsoClearImages { get; set; } = true; [JsonProperty("showCircleCenter")] diff --git a/Ink Canvas/Windows/HasNewUpdateWindow.xaml.cs b/Ink Canvas/Windows/HasNewUpdateWindow.xaml.cs index 94e169cf..53a4a06b 100644 --- a/Ink Canvas/Windows/HasNewUpdateWindow.xaml.cs +++ b/Ink Canvas/Windows/HasNewUpdateWindow.xaml.cs @@ -340,7 +340,7 @@ namespace Ink_Canvas downloadUrl = Path.Combine(updatesFolderPath, $"InkCanvasForClass.CE.{version}.zip"); } LogHelper.WriteLogToFile($"AutoUpdate | 开始安装版本: {version}"); - AutoUpdateHelper.InstallNewVersionApp(version, false); + AutoUpdateHelper.InstallNewVersionApp(version, true); App.IsAppExitByUser = true; Application.Current.Dispatcher.Invoke(() => { diff --git a/README.md b/README.md index 3e09af86..998d06cd 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,7 @@ PrefacedCorg
PrefacedCorg

💻 🎨 + Jursin
Jursin

🎨 diff --git a/UpdateLog.md b/UpdateLog.md index ca35fe1a..c33fd8ee 100644 --- a/UpdateLog.md +++ b/UpdateLog.md @@ -1,3 +1,4 @@ +ICC CE 1.7.X.X更新日志 1. 改进端点吸附 2. 新增自定义浮动栏图标 3. 新增自定义点名背景 @@ -51,3 +52,6 @@ 51. 优化调色板 52. 修复浮动栏动画异常 53. 修复开关状态异常 +54. 优化浮动栏触摸点击 +55. 优化快捷键 +