# 用户界面指南 **本文档引用的文件** - [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组件职责与交互](#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应用程序的用户界面功能。