Files
coco df489d5640 a
2026-07-03 16:05:30 +08:00

13 KiB
Raw Permalink Blame History

用户界面指南

**本文档引用的文件** - [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)

目录

  1. 简介
  2. 主框架窗口布局
  3. 主要功能框架
  4. UI组件职责与交互
  5. 界面状态管理与消息处理
  6. 多窗口协作机制
  7. MFC资源文件说明
  8. 用户导航指导
  9. 开发者扩展方法

简介

Geomative Studio应用程序采用MFCMicrosoft Foundation Classes)框架构建,实现了多文档界面(MDI)架构。该应用程序主要包含设备管理、数据管理和任务管理三大功能模块,通过主框架窗口(CMainFrame)统一调度和管理各个子窗口。系统采用树形导航视图与内容视图分离的设计模式,左侧为导航树(CNavDevView、CNavDataView等),右侧为内容展示区,通过CSplitterWnd实现窗口分割。应用程序支持中文和英文双语界面切换,并通过消息映射机制处理用户交互和系统事件。

Section sources

主框架窗口布局

主框架窗口(CMainFrame)继承自CMDIFrameWnd,作为整个应用程序的容器窗口,负责管理所有子窗口的创建、激活和销毁。其布局结构如下:

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

主框架在OnCreate方法中创建了工具栏和状态栏。工具栏包含多个图标按钮,用于快速访问常用功能;状态栏位于窗口底部,显示当前状态信息。MDI客户区用于容纳和管理多个子窗口,如设备管理框架、数据管理框架和任务管理框架。通过消息映射,主框架响应菜单命令和系统消息,实现窗口的创建和调度。

Section sources

主要功能框架

应用程序包含三个主要功能框架:设备管理框架(CDevMngFrame)、数据管理框架(CDataMngFrame)和任务管理框架(CSptMngFrame),均继承自CMDIChildWnd。

设备管理框架

设备管理框架(CDevMngFrame)负责设备的注册、参数配置和状态监控。其布局采用CSplitterWnd分割为左右两部分:

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

左侧的CNavDevView包含一个CTreeCtrl控件(m_devTree),用于显示设备树形结构。右侧的内容视图根据设备状态动态切换:当设备处于离线状态时显示CAppDevView;在线状态时显示CAppDevOLView;无选中设备时显示CBlankView。框架通过ShowAppView方法实现视图的动态切换。

Section sources

数据管理框架

数据管理框架(CDataMngFrame)负责项目、测区和测量数据的管理。其布局结构与设备管理框架类似:

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

右侧内容视图根据选中节点的类型动态切换,支持项目、测区以及多种类型的测量数据(2D、3D、CE等)的展示。框架通过ShowAppView方法根据数据类型创建相应的视图。

Section sources

任务管理框架

任务管理框架(CSptMngFrame)负责测量任务的创建和管理。其结构与前述框架类似,包含导航视图和内容视图:

graph TD
A[CSptMngFrame] --> B[左侧: CNavSptView]
A --> C[右侧: m_pAppSptView]
C --> D[CAppSptView]
C --> E[CAppSptOLView]
C --> F[CBlankView]

Diagram sources

该框架支持创建标准和非标准的测量脚本,并提供脚本浏览和管理功能。

Section sources

UI组件职责与交互

应用程序的UI组件遵循MVCModel-View-Controller)设计模式,各组件职责明确。

导航视图组件

导航视图(CNavDevView、CNavDataView)负责显示树形结构数据,继承自CFormView。其主要职责包括:

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

这些视图通过OnInitialUpdate方法初始化树形控件,通过消息映射处理右键点击、选择改变等用户交互事件,并向父框架发送调度消息。

内容视图组件

内容视图(CAppDevView、CAppDataProView等)负责显示具体数据内容,继承自CView。其主要职责包括:

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

这些视图通常包含一个CSplitterWnd,用于进一步分割窗口,显示详细信息列表和内容列表。

空白视图组件

CBlankView是一个占位视图,用于在没有选中任何项目时显示空白区域:

classDiagram
class CBlankView {
+CBlankView()
+~CBlankView()
+DoDataExchange()
+AssertValid()
+Dump()
}
CBlankView <|-- CFormView

Diagram sources

Section sources

界面状态管理与消息处理

应用程序通过消息映射和状态管理机制实现复杂的用户交互。

消息处理机制

主框架和各子框架通过MFC的消息映射机制处理各种消息:

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

状态管理

应用程序定义了多种状态常量来管理界面状态:

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

Section sources

多窗口协作机制

应用程序通过父-子窗口协作机制实现多窗口间的通信和数据共享。

窗口创建与激活

主框架通过CreateNewChild方法创建子窗口:

flowchart TD
Start([开始]) --> CheckNull["检查 m_pDevMngFrm 是否为空"]
CheckNull --> |为空| CreateChild["创建 CDevMngFrame 子窗口"]
CheckNull --> |不为空| ActivateFrame["激活现有窗口"]
CreateChild --> ShowWindow["显示窗口最大化"]
ActivateFrame --> End([结束])
ShowWindow --> End

Diagram sources

消息传递

子窗口通过SendMessage向主框架发送消息,实现状态同步:

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

Section sources

MFC资源文件说明

MFC资源文件定义了应用程序的界面元素。

资源文件结构

GeoMative.rc2文件是MFC资源文件,包含手动编辑的资源:

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

Section sources

这些对话框模板在相应的视图类中通过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应用程序的用户界面功能。