This commit is contained in:
2025-09-25 13:36:38 +08:00
parent d042520b14
commit d18a3d5279
6 changed files with 931 additions and 39 deletions

View File

@@ -0,0 +1,314 @@
# 窗体功能增强设计文档
## 1. 概述
### 1.1 功能目标
1. 为项目中的窗体组件添加8个方向的拖拽调整尺寸功能增强用户交互体验
2. 修复窗体最大化、最小化、还原功能存在的问题
3. 完善窗体状态管理和事件通知机制
### 1.2 当前系统分析
通过代码分析发现,当前系统已具备以下基础功能:
- 窗体创建、销毁、移动功能
- 窗体最大化、最小化、还原功能
- 基本的事件管理系统
- 窗体状态管理和配置
但现有功能存在以下问题:
1. 缺少用户通过鼠标拖拽调整窗体尺寸的功能
2. 窗体最大化、最小化、还原功能实现不完整,缺少与事件系统的完整集成
3. 窗体状态变更时未正确触发`windowFormDataUpdate`事件通知
## 2. 架构设计
### 2.1 整体架构
```mermaid
graph TD
A[用户操作] --> B[窗体功能处理器]
B --> C[窗体状态管理]
C --> D[UI更新引擎]
D --> E[界面重渲染]
C --> F[事件通知系统]
G[窗体服务] --> C
H[事件管理器] --> F
```
### 2.2 核心组件
| 组件名称 | 职责 | 说明 |
| --------------------- | ------------------ | -------------------------------------- |
| WindowOperationHandler | 窗体操作处理核心 | 处理最大化、最小化、还原和拖拽调整尺寸操作 |
| WindowManager | 窗体状态管理 | 管理窗体状态变更和配置更新 |
| WindowRenderer | UI更新引擎 | 应用新状态到窗体界面 |
| WindowEventManager | 事件管理器 | 发布窗体状态变更事件 |
## 3. 功能设计
### 3.1 窗体状态操作
窗体支持以下状态操作:
| 操作 | 状态变更 | 事件触发 | 说明 |
| ------ | ---------------------------- | ------------------------------------------ | ------------------------------------------ |
| 最大化 | default/minimized → maximized | windowFormMaximize, windowFormDataUpdate | 窗体占据除任务栏外的整个屏幕空间 |
| 最小化 | default/maximized → minimized | windowFormMinimize | 窗体隐藏,仅在任务栏保留图标 |
| 还原 | minimized/maximized → default | windowFormRestore, windowFormDataUpdate | 窗体恢复到正常尺寸和位置 |
### 3.2 拖拽调整尺寸方向定义
窗体支持8个方向的拖拽调整尺寸具体如下
```mermaid
graph TD
subgraph 窗体
direction LR
A[↖] --- B[↑] --- C[↗]
D[←] --- E[窗体内容] --- F[→]
G[↙] --- H[↓] --- I[↘]
end
classDef corner fill:#f9f,stroke:#333;
classDef edge fill:#bbf,stroke:#333;
class A,C,G,I,corner
class B,D,F,H,edge
```
| 方向 | 标识符 | 影响属性 | 说明 |
| ------ | ----------- | ------------------- | ------------------ |
| 左上角 | topLeft | width, height, x, y | 同时调整宽高和位置 |
| 上边缘 | top | height, y | 调整高度和垂直位置 |
| 右上角 | topRight | width, height, y | 调整宽高和垂直位置 |
| 右边缘 | right | width | 仅调整宽度 |
| 右下角 | bottomRight | width, height | 仅调整宽高 |
| 下边缘 | bottom | height | 仅调整高度 |
| 左下角 | bottomLeft | width, height, x | 调整宽高和水平位置 |
| 左边缘 | left | width, x | 调整宽度和水平位置 |
### 3.3 交互流程
```mermaid
sequenceDiagram
participant U as 用户
participant WH as 窗体句柄
participant WOH as 操作处理器
participant WM as 窗体管理器
participant WR as 窗体渲染器
participant EM as 事件管理器
U->>WH: 执行操作(最大化/最小化/还原/拖拽)
WH->>WOH: 处理操作请求
WOH->>WM: 更新窗体状态
WM->>WR: 应用新状态
WM->>EM: 发布状态变更事件
EM->>EM: 发布windowFormDataUpdate事件
WR->>U: 更新界面显示
```
## 4. 数据模型
### 4.1 窗体状态数据结构
```typescript
interface IWindowFormDataUpdateParams {
/** 窗口id */
id: string;
/** 窗口状态 */
state: TWindowFormState;
/** 窗口宽度 */
width: number;
/** 窗口高度 */
height: number;
/** 窗口x坐标(左上角) */
x: number;
/** 窗口y坐标(左上角) */
y: number;
}
type TWindowFormState = 'default' | 'minimized' | 'maximized';
```
### 4.2 窗体尺寸配置扩展
在现有`WindowConfig`接口基础上增加最小/最大尺寸限制:
| 字段 | 类型 | 必填 | 说明 |
| --------- | ------- | ---- | -------------------------- |
| minWidth | number | 可选 | 窗体最小宽度(像素) |
| minHeight | number | 可选 | 窗体最小高度(像素) |
| maxWidth | number | 可选 | 窗体最大宽度(像素) |
| maxHeight | number | 可选 | 窗体最大高度(像素) |
| resizable | boolean | 可选 | 是否可调整尺寸默认为true |
### 4.3 拖拽状态数据结构
```typescript
interface ResizeState {
/** 是否正在调整尺寸 */
isResizing: boolean;
/** 调整方向 */
direction: ResizeDirection;
/** 起始鼠标位置 */
startX: number;
/** 起始鼠标位置 */
startY: number;
/** 起始窗体宽度 */
startWidth: number;
/** 起始窗体高度 */
startHeight: number;
/** 起始窗体X坐标 */
startXPosition: number;
/** 起始窗体Y坐标 */
startYPosition: number;
}
type ResizeDirection =
'topLeft' | 'top' | 'topRight' |
'right' | 'bottomRight' | 'bottom' |
'bottomLeft' | 'left' | 'none';
```
## 5. 事件系统设计
### 5.1 修复事件触发问题
当前窗体状态变更时未正确触发`windowFormDataUpdate`事件,需要修复以下问题:
1. 在最大化操作完成后,应触发`windowFormDataUpdate`事件,携带窗体新状态和尺寸信息
2. 在最小化操作完成后,应触发`windowFormDataUpdate`事件,携带窗体新状态信息
3. 在还原操作完成后,应触发`windowFormDataUpdate`事件,携带窗体新状态和尺寸信息
### 5.2 新增事件定义
在现有`IWindowFormEvent`接口中添加以下事件:
| 事件名称 | 参数类型 | 触发时机 |
| --------------------- | --------------------------- | ---------------- |
| windowFormResizeStart | string | 开始调整窗体尺寸 |
| windowFormResizing | IWindowFormDataUpdateParams | 调整尺寸过程中 |
| windowFormResizeEnd | string | 完成窗体尺寸调整 |
### 5.3 事件触发流程
```mermaid
graph TD
A[窗体状态变更] --> B{是否需要更新数据?}
B -->|是| C[构造更新数据]
C --> D[触发windowFormDataUpdate事件]
B -->|否| E[直接触发状态事件]
D --> F[通知监听组件]
E --> F
```
## 6. 核心逻辑设计
### 6.1 窗体状态变更逻辑修复
当前窗体状态变更逻辑存在以下问题需要修复:
1. **最大化逻辑问题**
- 未正确保存原始窗体尺寸和位置信息
- 未触发`windowFormDataUpdate`事件通知
2. **最小化逻辑问题**
- 未触发`windowFormDataUpdate`事件通知
3. **还原逻辑问题**
- 未正确恢复窗体尺寸和位置
- 未触发`windowFormDataUpdate`事件通知
### 6.2 边缘检测算法
窗体边缘需要划分8个可拖拽区域每个区域宽度为8px
```mermaid
graph TD
subgraph 边缘区域划分
direction LR
A[8px↖] --- B[8px↑] --- C[8px↗]
D[8px←] --- E[窗体内容] --- F[8px→]
G[8px↙] --- H[8px↓] --- I[8px↘]
end
```
### 6.3 尺寸计算规则
1. **最小尺寸限制**窗体宽度不能小于minWidth高度不能小于minHeight
2. **最大尺寸限制**窗体宽度不能大于maxWidth高度不能大于maxHeight
3. **位置边界**:窗体不能被拖拽到屏幕外
### 6.4 拖拽处理流程
1. 鼠标按下时检测是否在边缘区域
2. 根据鼠标位置确定拖拽方向
3. 记录初始状态数据
4. 鼠标移动时实时计算新尺寸
5. 应用新尺寸并触发重渲染
6. 鼠标释放时结束拖拽状态
## 7. UI/UX设计
### 7.1 视觉反馈
- 鼠标悬停在可拖拽边缘时,光标应变为对应方向的调整光标
- 拖拽过程中窗体应有半透明遮罩效果
- 拖拽完成后应有平滑的过渡动画
### 7.2 响应式适配
- 在不同屏幕分辨率下保持边缘区域的可点击性
- 支持触屏设备的拖拽操作
- 在窗体尺寸接近最小/最大限制时提供视觉提示
## 8. 性能优化
### 8.1 事件处理优化
- 使用防抖机制减少高频事件触发
- 在拖拽过程中暂停不必要的重渲染
- 使用requestAnimationFrame优化动画性能
### 8.2 内存管理
- 及时清理事件监听器
- 复用计算对象避免频繁创建
- 在窗体销毁时清理所有相关资源
## 9. 安全考虑
### 9.1 边界检查
- 确保窗体不能被调整到超出屏幕边界
- 验证尺寸参数的有效性
- 防止负值或异常大值的输入
### 9.2 权限控制
- 只有具有调整权限的窗体才能被调整尺寸
- 外部应用的窗体尺寸调整需通过SDK接口
## 10. 测试策略
### 10.1 单元测试
- 边缘检测算法准确性测试
- 尺寸计算边界条件测试
- 事件发布/订阅机制测试
### 10.2 集成测试
- 不同方向拖拽功能测试
- 尺寸限制功能测试
- 与现有窗体功能集成测试
### 10.3 用户体验测试
- 拖拽流畅性测试
- 视觉反馈效果测试
- 不同设备兼容性测试