404 lines
13 KiB
Markdown
404 lines
13 KiB
Markdown
# 用户界面指南
|
||
|
||
<cite>
|
||
**本文档引用的文件**
|
||
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp)
|
||
- [MainFrm.h](file://h/MainFrm.h)
|
||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp)
|
||
- [devmngframe.h](file://h/devmngframe.h)
|
||
- [datamngframe.cpp](file://cpp/Views/datamngframe.cpp)
|
||
- [datamngframe.h](file://h/datamngframe.h)
|
||
- [sptmngframe.cpp](file://cpp/Views/sptmngframe.cpp)
|
||
- [sptmngframe.h](file://h/sptmngframe.h)
|
||
- [navdevview.h](file://h/navdevview.h)
|
||
- [navdataview.h](file://h/navdataview.h)
|
||
- [blankview.cpp](file://cpp/Views/blankview.cpp)
|
||
- [blankview.h](file://h/blankview.h)
|
||
- [GeoMative.rc2](file://res/GeoMative.rc2)
|
||
</cite>
|
||
|
||
## 目录
|
||
1. [简介](#简介)
|
||
2. [主框架窗口布局](#主框架窗口布局)
|
||
3. [主要功能框架](#主要功能框架)
|
||
4. [UI组件职责与交互](#ui组件职责与交互)
|
||
5. [界面状态管理与消息处理](#界面状态管理与消息处理)
|
||
6. [多窗口协作机制](#多窗口协作机制)
|
||
7. [MFC资源文件说明](#mfc资源文件说明)
|
||
8. [用户导航指导](#用户导航指导)
|
||
9. [开发者扩展方法](#开发者扩展方法)
|
||
|
||
## 简介
|
||
Geomative Studio应用程序采用MFC(Microsoft Foundation Classes)框架构建,实现了多文档界面(MDI)架构。该应用程序主要包含设备管理、数据管理和任务管理三大功能模块,通过主框架窗口(CMainFrame)统一调度和管理各个子窗口。系统采用树形导航视图与内容视图分离的设计模式,左侧为导航树(CNavDevView、CNavDataView等),右侧为内容展示区,通过CSplitterWnd实现窗口分割。应用程序支持中文和英文双语界面切换,并通过消息映射机制处理用户交互和系统事件。
|
||
|
||
**Section sources**
|
||
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L1-L800)
|
||
- [MainFrm.h](file://h/MainFrm.h#L1-L120)
|
||
|
||
## 主框架窗口布局
|
||
主框架窗口(CMainFrame)继承自CMDIFrameWnd,作为整个应用程序的容器窗口,负责管理所有子窗口的创建、激活和销毁。其布局结构如下:
|
||
|
||
```mermaid
|
||
graph TD
|
||
A[CMainFrame] --> B[工具栏 m_wndToolBar]
|
||
A --> C[状态栏 m_wndStatusBar]
|
||
A --> D[MDI客户区]
|
||
D --> E[CDevMngFrame]
|
||
D --> F[CDataMngFrame]
|
||
D --> G[CSptMngFrame]
|
||
B --> H[图标按钮]
|
||
C --> I[状态指示器]
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L164-L190)
|
||
- [MainFrm.h](file://h/MainFrm.h#L56-L57)
|
||
|
||
主框架在OnCreate方法中创建了工具栏和状态栏。工具栏包含多个图标按钮,用于快速访问常用功能;状态栏位于窗口底部,显示当前状态信息。MDI客户区用于容纳和管理多个子窗口,如设备管理框架、数据管理框架和任务管理框架。通过消息映射,主框架响应菜单命令和系统消息,实现窗口的创建和调度。
|
||
|
||
**Section sources**
|
||
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L164-L223)
|
||
- [MainFrm.h](file://h/MainFrm.h#L56-L57)
|
||
|
||
## 主要功能框架
|
||
应用程序包含三个主要功能框架:设备管理框架(CDevMngFrame)、数据管理框架(CDataMngFrame)和任务管理框架(CSptMngFrame),均继承自CMDIChildWnd。
|
||
|
||
### 设备管理框架
|
||
设备管理框架(CDevMngFrame)负责设备的注册、参数配置和状态监控。其布局采用CSplitterWnd分割为左右两部分:
|
||
|
||
```mermaid
|
||
graph TD
|
||
A[CDevMngFrame] --> B[左侧: CNavDevView]
|
||
A --> C[右侧: m_pAppDevView]
|
||
C --> D[CAppDevView]
|
||
C --> E[CAppDevOLView]
|
||
C --> F[CBlankView]
|
||
B --> G[设备树 m_devTree]
|
||
D --> H[设备详细信息列表]
|
||
D --> I[设备内容列表]
|
||
E --> J[在线设备详细信息]
|
||
E --> K[在线设备GR列表]
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L136-L146)
|
||
- [devmngframe.h](file://h/devmngframe.h#L84)
|
||
|
||
左侧的CNavDevView包含一个CTreeCtrl控件(m_devTree),用于显示设备树形结构。右侧的内容视图根据设备状态动态切换:当设备处于离线状态时显示CAppDevView;在线状态时显示CAppDevOLView;无选中设备时显示CBlankView。框架通过ShowAppView方法实现视图的动态切换。
|
||
|
||
**Section sources**
|
||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L258-L327)
|
||
- [devmngframe.h](file://h/devmngframe.h#L81-L82)
|
||
|
||
### 数据管理框架
|
||
数据管理框架(CDataMngFrame)负责项目、测区和测量数据的管理。其布局结构与设备管理框架类似:
|
||
|
||
```mermaid
|
||
graph TD
|
||
A[CDataMngFrame] --> B[左侧: CNavDataView]
|
||
A --> C[右侧: m_pAppDataView]
|
||
C --> D[CAppDataProView]
|
||
C --> E[CAppDataTzView]
|
||
C --> F[CAppDataRsp2DTdView]
|
||
C --> G[CAppDataIpsp2DTdView]
|
||
C --> H[CAppDataSP2DTdView]
|
||
C --> I[CAppDataRspCETdView]
|
||
C --> J[CAppDataIpspCETdView]
|
||
C --> K[CAppDataSPCETdView]
|
||
C --> L[CAppDataRsp3DTdView]
|
||
C --> M[CAppDataIpsp3DTdView]
|
||
C --> N[CAppDataSP3DTdView]
|
||
C --> O[CBlankView]
|
||
B --> P[数据树 m_dataTree]
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [datamngframe.cpp](file://cpp/Views/datamngframe.cpp#L183-L193)
|
||
- [datamngframe.h](file://h/datamngframe.h#L143)
|
||
|
||
右侧内容视图根据选中节点的类型动态切换,支持项目、测区以及多种类型的测量数据(2D、3D、CE等)的展示。框架通过ShowAppView方法根据数据类型创建相应的视图。
|
||
|
||
**Section sources**
|
||
- [datamngframe.cpp](file://cpp/Views/datamngframe.cpp#L604-L800)
|
||
- [datamngframe.h](file://h/datamngframe.h#L141)
|
||
|
||
### 任务管理框架
|
||
任务管理框架(CSptMngFrame)负责测量任务的创建和管理。其结构与前述框架类似,包含导航视图和内容视图:
|
||
|
||
```mermaid
|
||
graph TD
|
||
A[CSptMngFrame] --> B[左侧: CNavSptView]
|
||
A --> C[右侧: m_pAppSptView]
|
||
C --> D[CAppSptView]
|
||
C --> E[CAppSptOLView]
|
||
C --> F[CBlankView]
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [sptmngframe.h](file://h/sptmngframe.h#L78)
|
||
|
||
该框架支持创建标准和非标准的测量脚本,并提供脚本浏览和管理功能。
|
||
|
||
**Section sources**
|
||
- [sptmngframe.cpp](file://cpp/Views/sptmngframe.cpp#L17-L36)
|
||
- [sptmngframe.h](file://h/sptmngframe.h#L78)
|
||
|
||
## UI组件职责与交互
|
||
应用程序的UI组件遵循MVC(Model-View-Controller)设计模式,各组件职责明确。
|
||
|
||
### 导航视图组件
|
||
导航视图(CNavDevView、CNavDataView)负责显示树形结构数据,继承自CFormView。其主要职责包括:
|
||
|
||
```mermaid
|
||
classDiagram
|
||
class CNavDevView {
|
||
+CTreeCtrl m_devTree
|
||
+OnInitialUpdate()
|
||
+DoDataExchange()
|
||
+OnRclickNavDevTree()
|
||
+OnSelchangedNavDevTree()
|
||
+OnSelchangingNavDevTree()
|
||
}
|
||
class CNavDataView {
|
||
+CTreeCtrl m_dataTree
|
||
+OnInitialUpdate()
|
||
+DoDataExchange()
|
||
+OnRclickNavDataTree()
|
||
+OnSelchangedNavDataTree()
|
||
+OnSelchangingNavDataTree()
|
||
}
|
||
CNavDevView <|-- CFormView
|
||
CNavDataView <|-- CFormView
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [navdevview.h](file://h/navdevview.h#L17-L70)
|
||
- [navdataview.h](file://h/navdataview.h#L19-L74)
|
||
|
||
这些视图通过OnInitialUpdate方法初始化树形控件,通过消息映射处理右键点击、选择改变等用户交互事件,并向父框架发送调度消息。
|
||
|
||
### 内容视图组件
|
||
内容视图(CAppDevView、CAppDataProView等)负责显示具体数据内容,继承自CView。其主要职责包括:
|
||
|
||
```mermaid
|
||
classDiagram
|
||
class CAppDevView {
|
||
+CView* m_pDevDetailListView
|
||
+CView* m_pDevContentListView
|
||
+OnDraw()
|
||
+OnSize()
|
||
}
|
||
class CAppDataProView {
|
||
+CView* m_pProDetailListView
|
||
+CView* m_pProContentListView
|
||
+OnDraw()
|
||
+OnSize()
|
||
}
|
||
CAppDevView <|-- CView
|
||
CAppDataProView <|-- CView
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [appdevview.h](file://h/appdevview.h#L13-L60)
|
||
- [appdatadevview.h](file://h/appdatadevview.h#L16-L64)
|
||
|
||
这些视图通常包含一个CSplitterWnd,用于进一步分割窗口,显示详细信息列表和内容列表。
|
||
|
||
### 空白视图组件
|
||
CBlankView是一个占位视图,用于在没有选中任何项目时显示空白区域:
|
||
|
||
```mermaid
|
||
classDiagram
|
||
class CBlankView {
|
||
+CBlankView()
|
||
+~CBlankView()
|
||
+DoDataExchange()
|
||
+AssertValid()
|
||
+Dump()
|
||
}
|
||
CBlankView <|-- CFormView
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [blankview.cpp](file://cpp/Views/blankview.cpp#L1-L63)
|
||
- [blankview.h](file://h/blankview.h#L17-L63)
|
||
|
||
**Section sources**
|
||
- [blankview.cpp](file://cpp/Views/blankview.cpp#L1-L63)
|
||
- [blankview.h](file://h/blankview.h#L17-L63)
|
||
|
||
## 界面状态管理与消息处理
|
||
应用程序通过消息映射和状态管理机制实现复杂的用户交互。
|
||
|
||
### 消息处理机制
|
||
主框架和各子框架通过MFC的消息映射机制处理各种消息:
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant User as 用户
|
||
participant MainFrame as CMainFrame
|
||
participant DevFrame as CDevMngFrame
|
||
participant DataFrame as CDataMngFrame
|
||
User->>MainFrame : 点击"设备管理"菜单
|
||
MainFrame->>MainFrame : OnMngDevWin()
|
||
MainFrame->>DevFrame : CreateNewChild()
|
||
DevFrame->>DevFrame : OnCreateClient()
|
||
DevFrame->>DevFrame : 创建分割窗口和视图
|
||
User->>DevFrame : 在设备树中选择设备
|
||
DevFrame->>DevFrame : OnSelchangedNavDevTree()
|
||
DevFrame->>DevFrame : OnSchedule()
|
||
DevFrame->>DevFrame : ShowAppView()
|
||
DevFrame->>MainFrame : 发送状态更新消息
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L624-L668)
|
||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L212-L240)
|
||
|
||
### 状态管理
|
||
应用程序定义了多种状态常量来管理界面状态:
|
||
|
||
```mermaid
|
||
stateDiagram-v2
|
||
[*] --> PZ_STATE_NEW
|
||
[*] --> PZ_STATE_ONLINE
|
||
[*] --> PZ_STATE_OFFLINE
|
||
[*] --> PZ_STATE_ZERO
|
||
PZ_STATE_NEW --> PZ_STATE_ONLINE : 注册成功
|
||
PZ_STATE_NEW --> PZ_STATE_OFFLINE : 注册失败
|
||
PZ_STATE_ONLINE --> PZ_STATE_OFFLINE : 设备断开
|
||
PZ_STATE_OFFLINE --> PZ_STATE_ONLINE : 设备重连
|
||
PZ_STATE_OFFLINE --> PZ_STATE_NEW : 重新注册
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L258-L327)
|
||
- [datamngframe.cpp](file://cpp/Views/datamngframe.cpp#L604-L800)
|
||
|
||
**Section sources**
|
||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L258-L327)
|
||
- [datamngframe.cpp](file://cpp/Views/datamngframe.cpp#L604-L800)
|
||
|
||
## 多窗口协作机制
|
||
应用程序通过父-子窗口协作机制实现多窗口间的通信和数据共享。
|
||
|
||
### 窗口创建与激活
|
||
主框架通过CreateNewChild方法创建子窗口:
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
Start([开始]) --> CheckNull["检查 m_pDevMngFrm 是否为空"]
|
||
CheckNull --> |为空| CreateChild["创建 CDevMngFrame 子窗口"]
|
||
CheckNull --> |不为空| ActivateFrame["激活现有窗口"]
|
||
CreateChild --> ShowWindow["显示窗口最大化"]
|
||
ActivateFrame --> End([结束])
|
||
ShowWindow --> End
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L624-L635)
|
||
|
||
### 消息传递
|
||
子窗口通过SendMessage向主框架发送消息,实现状态同步:
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant DevFrame as CDevMngFrame
|
||
participant MainFrame as CMainFrame
|
||
DevFrame->>DevFrame : OnMDIActivate(TRUE)
|
||
DevFrame->>MainFrame : SendMessage(WM_SCHEDULE)
|
||
MainFrame->>MainFrame : 更新工具栏和菜单状态
|
||
DevFrame->>MainFrame : SendMessage(WM_REFRESH_NAV_DEVICE)
|
||
MainFrame->>DevFrame : 刷新设备树
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L151-L195)
|
||
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L64-L94)
|
||
|
||
**Section sources**
|
||
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L151-L195)
|
||
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L64-L94)
|
||
|
||
## MFC资源文件说明
|
||
MFC资源文件定义了应用程序的界面元素。
|
||
|
||
### 资源文件结构
|
||
GeoMative.rc2文件是MFC资源文件,包含手动编辑的资源:
|
||
|
||
```mermaid
|
||
erDiagram
|
||
RESOURCE_FILE {
|
||
string name "GeoMative.rc2"
|
||
string type "MFC Resource File"
|
||
string description "手动编辑的资源文件"
|
||
}
|
||
DIALOG_TEMPLATE {
|
||
int id "IDD_NAV_DEV"
|
||
string title "设备导航"
|
||
string type "CFormView"
|
||
}
|
||
DIALOG_TEMPLATE {
|
||
int id "IDD_NAV_DATA"
|
||
string title "数据导航"
|
||
string type "CFormView"
|
||
}
|
||
DIALOG_TEMPLATE {
|
||
int id "IDD_BLANK"
|
||
string title "空白视图"
|
||
string type "CFormView"
|
||
}
|
||
RESOURCE_FILE ||--o{ DIALOG_TEMPLATE : "包含"
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [GeoMative.rc2](file://res/GeoMative.rc2#L1-L14)
|
||
|
||
**Section sources**
|
||
- [GeoMative.rc2](file://res/GeoMative.rc2#L1-L14)
|
||
|
||
这些对话框模板在相应的视图类中通过AFX_DATA宏引用,如CNavDevView中的IDD = IDD_NAV_DEV。
|
||
|
||
## 用户导航指导
|
||
用户可以通过以下步骤进行界面导航:
|
||
|
||
1. **启动应用程序**:程序启动时显示启动画面,自动检测连接的设备。
|
||
2. **访问功能模块**:
|
||
- 点击菜单"设备管理"打开设备管理窗口
|
||
- 点击菜单"数据管理"打开数据管理窗口
|
||
- 点击菜单"任务管理"打开任务管理窗口
|
||
3. **设备管理**:
|
||
- 在左侧设备树中选择设备
|
||
- 右侧显示设备详细信息
|
||
- 通过右键菜单进行设备注册、参数修改等操作
|
||
4. **数据管理**:
|
||
- 在左侧数据树中选择项目或测区
|
||
- 右侧显示相应的测量数据列表
|
||
- 可以进行数据导出、删除等操作
|
||
5. **任务管理**:
|
||
- 创建新的测量任务
|
||
- 配置任务参数
|
||
- 生成测量脚本
|
||
|
||
## 开发者扩展方法
|
||
开发者可以通过以下方式扩展应用程序功能:
|
||
|
||
### 添加新的功能框架
|
||
1. 创建新的MDI子窗口类,继承自CMDIChildWnd
|
||
2. 实现OnCreateClient方法,创建分割窗口和视图
|
||
3. 在主框架中添加菜单命令和消息处理函数
|
||
4. 实现窗口创建和激活逻辑
|
||
|
||
### 扩展现有视图
|
||
1. 在现有视图类中添加新的控件成员变量
|
||
2. 在对话框资源中添加相应的控件
|
||
3. 在DoDataExchange方法中添加DDX/DDV绑定
|
||
4. 添加消息处理函数处理用户交互
|
||
|
||
### 添加新的消息类型
|
||
1. 定义新的WM_USER消息常量
|
||
2. 在消息映射中添加新的消息处理条目
|
||
3. 实现消息处理函数
|
||
4. 在需要的地方发送消息
|
||
|
||
通过遵循MFC框架的设计模式和应用程序的现有架构,开发者可以有效地扩展和维护Geomative Studio应用程序的用户界面功能。 |