Table of Contents

Class MainWindow

Namespace
Ink_Canvas
Assembly
InkCanvasForClass.dll

主窗口类的部分类,包含压感模拟和墨水到形状识别的功能

public class MainWindow : Window, IAnimatable, IFrameworkInputElement, IInputElement, ISupportInitialize, IQueryAmbient, IAddChild, IComponentConnector, IStyleConnector
Inheritance
MainWindow
Implements
Inherited Members

Remarks

本文件主要包含以下功能:

  1. 压感模拟:根据输入设备类型和设置模拟不同的压感效果
  2. 墨水到形状识别:将手绘墨迹转换为规则形状(直线、圆形、椭圆、三角形、矩形等)
  3. 直线自动拉直:将近似直线的墨迹自动拉成直线
  4. 端点吸附:将直线端点吸附到其他直线的端点
  5. 矩形参考线系统:通过多条直线构成矩形
  6. 高级贝塞尔曲线平滑:对墨迹进行平滑处理
  7. 异步墨水处理:提高性能的异步墨水处理机制

Constructors

MainWindow()

初始化主窗口实例,构建并配置界面元素、初始页面和应用程序运行时状态。

public MainWindow()

Remarks

执行 UI 可见性与布局初始设置、浮动栏位置计算与动画、日志文件清理与调试标记、定时器与撤销/重做绑定、输入事件与墨迹管理器初始化、 首页画布创建、左右侧面板的触摸滑动与点击分页交互绑定、无焦点与置顶模式应用、滑块触摸支持以及延迟的首-run OOBE 检查等启动工作。

Fields

CloseIsFromButton

public static bool CloseIsFromButton

Field Value

bool

IsShowingRestoreHiddenSlidesWindow

指示是否正在显示恢复隐藏幻灯片的窗口

public static bool IsShowingRestoreHiddenSlidesWindow

Field Value

bool

Settings

public static Settings Settings

Field Value

Settings

dpiChangedDelayAction

public DelayAction dpiChangedDelayAction

Field Value

DelayAction

eraserWidth

public double eraserWidth

Field Value

double

isEraserCircleShape

public bool isEraserCircleShape

Field Value

bool

isFloatingBarFolded

浮动栏是否折叠的标志。

public bool isFloatingBarFolded

Field Value

bool

isFullScreenApplied

public bool isFullScreenApplied

Field Value

bool

isUsingGeometryEraser

public bool isUsingGeometryEraser

Field Value

bool

isUsingStrokesEraser

public bool isUsingStrokesEraser

Field Value

bool

pptApplication

PowerPoint应用程序实例,用于与PowerPoint进行交互。

public static Application pptApplication

Field Value

Application

presentation

当前活动的PowerPoint演示文稿。

public static Presentation presentation

Field Value

Presentation

settingsFileName

public static string settingsFileName

Field Value

string

slide

当前活动的幻灯片。

public static Slide slide

Field Value

Slide

slides

当前演示文稿的幻灯片集合。

public static Slides slides

Field Value

Slides

slidescount

当前演示文稿的幻灯片总数。

public static int slidescount

Field Value

int

Properties

BoothResolutionHeight

public int BoothResolutionHeight { get; }

Property Value

int

BoothResolutionWidth

public int BoothResolutionWidth { get; }

Property Value

int

PPTManager

获取PPT管理器实例

public IPPTLinkManager PPTManager { get; }

Property Value

IPPTLinkManager

Remarks

提供对内部PPT链接管理器的公共访问,用于外部代码与PowerPoint进行交互。

Methods

AdjustTimerContainerSize()

根据DPI缩放因子调整TimerContainer的尺寸

public void AdjustTimerContainerSize()

ApplyAdvancedEraserShape()

应用橡皮擦形状到InkCanvas

public void ApplyAdvancedEraserShape()

BtnDrawLine_Click(object, MouseButtonEventArgs)

处理绘制直线按钮点击事件

public void BtnDrawLine_Click(object sender, MouseButtonEventArgs e)

Parameters

sender object

事件发送者

e MouseButtonEventArgs

鼠标按钮事件参数

Remarks

当绘制直线按钮被点击时:

  1. 检查是否在多点触控模式下
  2. 如果是长按操作,设置绘制模式为直线
  3. 重置鼠标按下发送者
  4. 如果是长按选中状态,处理相关逻辑
  5. 提示切换到画笔模式

BtnExit_Click(object, RoutedEventArgs)

退出按钮点击事件处理

public void BtnExit_Click(object sender, RoutedEventArgs e)

Parameters

sender object

发送者

e RoutedEventArgs

路由事件参数

BtnResetToSuggestion_Click(object, RoutedEventArgs)

将应用设置重置为推荐的默认值,并保存与重新加载配置以应用更改。

public void BtnResetToSuggestion_Click(object sender, RoutedEventArgs e)

Parameters

sender object
e RoutedEventArgs

Remarks

如果配置重置受安全密码保护,则会提示用户输入密码;在验证失败时中止重置。方法会暂时停止加载标志以避免触发事件、将“开机启动”切换置为关闭,并在完成后显示一条通知。任何内部异常将被吞噬以保证流程不中断。

BtnRestart_Click(object, RoutedEventArgs)

重启按钮点击事件处理

public void BtnRestart_Click(object sender, RoutedEventArgs e)

Parameters

sender object

发送者

e RoutedEventArgs

路由事件参数

CheckClipboardImageAndShowPasteNotificationWhenEnteringBoard()

在进入白板时检查系统剪贴板是否包含图片;如果存在图片且与上次提示间隔超过预设节流时间,则显示粘贴提示。

public void CheckClipboardImageAndShowPasteNotificationWhenEnteringBoard()

CheckEraserTypeTab()

检查并更新橡皮擦类型标签的状态

public void CheckEraserTypeTab()

ComboBoxFloatingBarImg_SelectionChanged(object, RoutedEventArgs)

处理浮动栏图标选择更改事件

public void ComboBoxFloatingBarImg_SelectionChanged(object sender, RoutedEventArgs e)

Parameters

sender object

事件发送者

e RoutedEventArgs

路由事件参数

Remarks

当选择浮动栏图标时:

  1. 保存浮动栏图标设置
  2. 更新浮动栏图标
  3. 保存设置到文件

DisableEraserOverlay()

禁用橡皮擦覆盖层

public void DisableEraserOverlay()

EnableEraserOverlay()

启用橡皮擦覆盖层

public void EnableEraserOverlay()

FixPointsDirection(Point, Point)

public Point[] FixPointsDirection(Point p1, Point p2)

Parameters

p1 Point
p2 Point

Returns

Point[]

FoldFloatingBar(object, bool)

折叠浮动栏,将其收纳到侧边栏。

public Task FoldFloatingBar(object sender, bool isAutoFoldCommand = false)

Parameters

sender object

事件发送者。

isAutoFoldCommand bool

是否为自动折叠命令。

Returns

Task

表示异步操作的任务。

Remarks

操作包括:

  1. 检查是否应该拒绝操作(如点击了折叠图标但上次鼠标按下的对象不是折叠图标)
  2. 设置折叠/展开标志
  3. 检查浮动栏是否已经折叠或正在改变隐藏模式,如果是则直接返回
  4. 处理墨迹重放相关的UI元素
  5. 设置浮动栏状态标志,关闭白板模式(如果当前在白板模式)
  6. 如果是用户手动折叠且画布上有较多墨迹,显示通知
  7. 清空画布墨迹
  8. 隐藏PPT导航面板和浮动栏拖动网格
  9. 执行浮动栏和侧边栏的动画
  10. 如果开启了彻底隐藏,则隐藏主窗口

FoldFloatingBar_MouseUp(object, MouseButtonEventArgs)

处理折叠浮动栏的鼠标点击事件。

public void FoldFloatingBar_MouseUp(object sender, MouseButtonEventArgs e)

Parameters

sender object

事件发送者。

e MouseButtonEventArgs

鼠标按钮事件参数。

GenerateFakePressureRectangle(StylusPointCollection)

public StylusPointCollection GenerateFakePressureRectangle(StylusPointCollection points)

Parameters

points StylusPointCollection

Returns

StylusPointCollection

GenerateFakePressureTriangle(StylusPointCollection)

public StylusPointCollection GenerateFakePressureTriangle(StylusPointCollection points)

Parameters

points StylusPointCollection

Returns

StylusPointCollection

GetCenterPoint(StylusPoint, StylusPoint)

public StylusPoint GetCenterPoint(StylusPoint point1, StylusPoint point2)

Parameters

point1 StylusPoint
point2 StylusPoint

Returns

StylusPoint

GetCenterPoint(Point, Point)

public Point GetCenterPoint(Point point1, Point point2)

Parameters

point1 Point
point2 Point

Returns

Point

GetCorrectIcon(string, bool)

public string GetCorrectIcon(string iconType, bool isSolid = false)

Parameters

iconType string
isSolid bool

Returns

string

GetCurrentSelectedMode()

获取当前选中的模式

public string GetCurrentSelectedMode()

Returns

string

当前选中的模式名称

GetDistance(Point, Point)

计算两点之间的距离

public double GetDistance(Point point1, Point point2)

Parameters

point1 Point

第一个点

point2 Point

第二个点

Returns

double

返回两点之间的距离

Remarks

使用欧几里得距离公式计算两点之间的距离: distance = √[(x2 - x1)² + (y2 - y1)²]

GetEraserStatusInfo()

获取橡皮擦状态信息

public string GetEraserStatusInfo()

Returns

string

GetPointSpeed(Point, Point, Point)

计算点的速度

public double GetPointSpeed(Point point1, Point point2, Point point3)

Parameters

point1 Point

第一个点

point2 Point

第二个点(当前点)

point3 Point

第三个点

Returns

double

返回点的速度

Remarks

计算点速度的流程:

  1. 计算第一个点到第二个点的距离
  2. 计算第三个点到第二个点的距离
  3. 将两个距离相加
  4. 除以20,得到速度值

GetTouchBoundWidth(TouchEventArgs)

获取触摸边界宽度方法

public double GetTouchBoundWidth(TouchEventArgs e)

Parameters

e TouchEventArgs

触摸事件参数

Returns

double

返回触摸边界宽度

Remarks

根据触摸事件参数计算触摸边界宽度,包括以下逻辑:

  1. 获取触摸点的边界
  2. 如果不是四边红外屏幕,使用边界宽度
  3. 如果是四边红外屏幕,使用边界宽度和高度的平方根
  4. 如果是特殊屏幕,乘以触摸倍数
  5. 返回计算得到的触摸边界宽度

HandleUriCommand(string)

public void HandleUriCommand(string uri)

Parameters

uri string

InitializeComponent()

InitializeComponent

public void InitializeComponent()

MoveWindow(IntPtr, int, int, int, int, bool)

public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint)

Parameters

hWnd IntPtr
X int
Y int
nWidth int
nHeight int
bRepaint bool

Returns

bool

OpenSingleStrokeFile(string)

打开单个墨迹文件

public void OpenSingleStrokeFile(string filePath)

Parameters

filePath string

墨迹文件的路径

Remarks

该方法会:

  1. 打开墨迹文件并加载墨迹
  2. 检查文件是否包含墨迹
  3. 如果包含墨迹,清空当前墨迹并添加新墨迹
  4. 恢复元素信息
  5. 如果文件流中没有墨迹,尝试从内存流中加载

OpenXMLStrokeFile(string)

打开XML格式的墨迹文件

public void OpenXMLStrokeFile(string filePath)

Parameters

filePath string

PauseTopmostMaintenance()

public void PauseTopmostMaintenance()

PrepareUIAccessX64()

public static extern int PrepareUIAccessX64()

Returns

int

PrepareUIAccessX86()

public static extern int PrepareUIAccessX86()

Returns

int

PureViewboxFloatingBarMarginAnimationInDesktopMode()

桌面模式下的浮动工具栏边距动画处理

public void PureViewboxFloatingBarMarginAnimationInDesktopMode()

PureViewboxFloatingBarMarginAnimationInPPTMode(bool)

PPT模式下的浮动工具栏边距动画处理

public void PureViewboxFloatingBarMarginAnimationInPPTMode(bool isRetry = false)

Parameters

isRetry bool

是否为重试操作

ReloadSettingsFromFile()

从配置文件加载用户设置并将其应用到主窗口和相关控件的状态(包括启动、外观、画布、手势、PPT、自动化等各项配置)。

public void ReloadSettingsFromFile()

ResetPPTStateVariables()

重置PPT相关的状态变量,当PPT自动收纳设置变更时调用

public void ResetPPTStateVariables()

Remarks

将与 PowerPoint 播放和状态追踪相关的内部字段重置为初始默认值。 具体重置的字段包括:

  1. 播放结束重入保护标志(isEnteredSlideShowEndEvent)
  2. 演示文稿黑边指示(isPresentationHaveBlackSpace)
  3. 上次播放页码(_lastPlaybackPage)
  4. 导航标志(_shouldNavigateToLastPage)
  5. 当前放映位置(_currentSlideShowPosition)
  6. 滑动切换处理状态(_isProcessingSlideSwitch)

该方法在执行过程中会:

  • 使用线程安全的方式重置滑动切换处理状态
  • 成功时记录追踪日志
  • 发生异常时记录错误日志并继续执行

ResetUpdateCheckRetry()

重置更新检查重试状态方法

public void ResetUpdateCheckRetry()

Remarks

重置更新检查的重试状态,包括以下步骤:

  1. 停止重试定时器
  2. 重置重试计数为0
  3. 记录日志
  4. 处理异常情况

ResumeTopmostMaintenance()

public void ResumeTopmostMaintenance()

SaveSettingsToFile()

将当前内存中的 Settings 序列化为格式化的 JSON 并写入应用程序配置文件(位于 App.RootPath 下的 Configs 目录或根设置文件)。

public static void SaveSettingsToFile()

Remarks

在写入前会确保目标目录/文件具有写入权限(使用 ProcessProtectionManager)。任何写入失败或异常都会被吞掉,调用方不会收到异常抛出。

ScrollViewToVerticalTop(FrameworkElement, ScrollViewer)

将指定元素在给定 ScrollViewer 中滚动,使该元素与可视区域的顶部对齐。

public static void ScrollViewToVerticalTop(FrameworkElement element, ScrollViewer scrollViewer)

Parameters

element FrameworkElement

要对齐到顶部的元素。

scrollViewer ScrollViewer

包含该元素的目标 ScrollViewer。

SetCursorBasedOnEditingMode(InkCanvas)

public void SetCursorBasedOnEditingMode(InkCanvas canvas)

Parameters

canvas InkCanvas

SetSettingsToRecommendation()

将应用设置重置为推荐的默认配置。

public static void SetSettingsToRecommendation()

Remarks

该方法会重新创建全局 Settings 实例并应用推荐值,覆盖大部分子模块配置(如外观、画布、自动化、PPT、手势、高级选项等)。 在重置过程中会保留并恢复当前 Settings.Automation 中的 AutoDelSavedFiles 与 AutoDelSavedFilesDaysThreshold 两项值以避免意外删除策略变化。

SetTopmostBasedOnSettings(bool)

根据窗口置顶设置和当前模式设置窗口的Topmost属性

public void SetTopmostBasedOnSettings(bool shouldBeTopmost)

Parameters

shouldBeTopmost bool

当前模式是否需要窗口置顶

ShowNewMessage(string, bool)

静态方法,用于在主窗口中显示通知

public static void ShowNewMessage(string notice, bool isShowImmediately = true)

Parameters

notice string

要显示的通知文本

isShowImmediately bool

指示是否应立即显示通知

Remarks

该方法会:

  1. 获取应用程序中的主窗口实例
  2. 调用主窗口的ShowNotification方法显示通知

ShowNotification(string, bool)

在窗口中显示带从底部滑入并淡入的通知文本,并在配置的时长后自动隐藏(若未被新通知覆盖)。

public void ShowNotification(string notice, bool isShowImmediately = true)

Parameters

notice string

要显示的通知文本。

isShowImmediately bool

指示是否应立即显示通知;当前实现默认立即显示。

StartAutomaticallyCreate(string)

创建开机自启动快捷方式。

public static bool StartAutomaticallyCreate(string exeName)

Parameters

exeName string

可执行文件名,用于命名快捷方式。

Returns

bool

创建成功返回true,失败返回false。

Remarks

操作包括:

  1. 创建Windows Shell对象
  2. 在启动文件夹中创建快捷方式
  3. 设置快捷方式的目标路径为当前可执行文件路径
  4. 设置工作目录为当前目录
  5. 设置窗口样式为普通窗口
  6. 设置快捷方式描述
  7. 保存快捷方式
  8. 捕获可能的异常,确保方法不会因异常而崩溃

StartAutomaticallyDel(string)

删除开机自启动快捷方式。

public static bool StartAutomaticallyDel(string exeName)

Parameters

exeName string

可执行文件名,用于定位要删除的快捷方式。

Returns

bool

删除成功返回true,失败返回false。

Remarks

操作包括:

  1. 在启动文件夹中删除指定名称的快捷方式
  2. 捕获可能的异常,确保方法不会因异常而崩溃

StartEraserAutoSwitchBackTimer()

启动橡皮擦自动切换回批注模式计时器

public void StartEraserAutoSwitchBackTimer()

StopEraserAutoSwitchBackTimer()

停止橡皮擦自动切换回批注模式计时器

public void StopEraserAutoSwitchBackTimer()

SwitchToBoardMode()

切换到白板模式(用于--board参数和IPC命令) 调用浮动栏上的白板功能

public void SwitchToBoardMode()

ToggleEraserMode()

切换橡皮擦模式

public void ToggleEraserMode()

ToggleEraserShape()

切换橡皮擦形状

public void ToggleEraserShape()

UnFoldFloatingBar(object)

展开浮动栏,将其从侧边栏恢复到正常状态。

public Task UnFoldFloatingBar(object sender)

Parameters

sender object

事件发送者。

Returns

Task

表示异步操作的任务。

Remarks

操作包括:

  1. 如果之前彻底隐藏了主窗口,先恢复显示
  2. 隐藏左右侧快捷面板
  3. 设置展开/折叠标志
  4. 检查浮动栏是否正在改变隐藏模式,如果是则直接返回
  5. 设置浮动栏状态标志,标记为未折叠
  6. 根据设置决定是否自动切换至批注模式
  7. 根据PPT放映模式和设置显示或隐藏翻页按钮
  8. 在屏幕模式下显示浮动栏并执行动画
  9. 执行侧边栏动画
  10. 等待UI完全更新后,重新设置当前选中模式的按钮高亮状态

UnFoldFloatingBar_MouseUp(object, MouseButtonEventArgs)

处理展开浮动栏的鼠标点击事件。

public void UnFoldFloatingBar_MouseUp(object sender, MouseButtonEventArgs e)

Parameters

sender object

事件发送者。

e MouseButtonEventArgs

鼠标按钮事件参数。

UpdateCustomIconsInComboBox()

更新组合框中的自定义图标选项

public void UpdateCustomIconsInComboBox()

Remarks

更新自定义图标选项时:

  1. 保留前12个内置图标选项
  2. 移除所有现有的自定义图标选项
  3. 添加新的自定义图标选项
  4. 为自定义图标选项设置字体

UpdateEraserSize()

更新橡皮擦尺寸

public void UpdateEraserSize()

UpdateFloatingBarIcon()

根据设置更新浮动栏图标

public void UpdateFloatingBarIcon()

Remarks

根据设置的浮动栏图标索引更新图标:

  1. 为不同的图标索引设置不同的图标源
  2. 为不同的图标设置不同的边距
  3. 支持自定义图标
  4. 自定义图标加载失败时使用默认图标

UpdateFloatingBarIcons()

public void UpdateFloatingBarIcons()

UpdatePPTQuickPanelVisibility()

更新PPT快捷面板的显示状态

public void UpdatePPTQuickPanelVisibility()

UpdatePPTTimeCapsuleVisibility()

更新PPT时间胶囊的显示状态

public void UpdatePPTTimeCapsuleVisibility()

UpdatePickNameBackgroundDisplay()

public void UpdatePickNameBackgroundDisplay()

UpdatePickNameBackgroundsInComboBox()

public void UpdatePickNameBackgroundsInComboBox()

ViewboxFloatingBarMarginAnimation(int, bool)

浮动工具栏边距动画处理

public void ViewboxFloatingBarMarginAnimation(int MarginFromEdge, bool PosXCaculatedWithTaskbarHeight = false)

Parameters

MarginFromEdge int

边缘边距

PosXCaculatedWithTaskbarHeight bool

是否考虑任务栏高度计算位置