9.6 KiB
Views模块
**Referenced Files in This Document** - [MainFrm.cpp](file://cpp/Views/MainFrm.cpp) - [devmngframe.cpp](file://cpp/Views/devmngframe.cpp) - [taskmngframe.cpp](file://cpp/Views/taskmngframe.cpp) - [datamngframe.cpp](file://cpp/Views/datamngframe.cpp) - [DialNew2DTask.cpp](file://cpp/Views/DialNew2DTask.cpp) - [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp) - [CCrossHoleConfig2DMainDlg.cpp](file://cpp/crossHole/CCrossHoleConfig2DMainDlg.cpp) - [CDialogLoggingWnd.cpp](file://cpp/logging/CDialogLoggingWnd.cpp) - [CDragListCtrl.cpp](file://cpp/ctrl/CDragListCtrl.cpp)目录
简介
Views模块是GeomativeStudio项目的核心用户界面组件集合,负责实现所有UI相关的功能。该模块包含主框架窗口、设备管理、任务管理、数据管理等多个框架窗口,以及各种对话框和自定义控件。这些组件共同构成了应用程序的用户交互界面,通过MFC框架实现丰富的图形用户界面功能。
主框架窗口设计
主框架窗口由MainFrm.cpp实现,作为应用程序的主容器,管理所有子窗口和UI元素。该窗口继承自CMDIFrameWnd,支持多文档界面(MDI)架构。在OnCreate方法中,初始化了工具栏和状态栏,并创建了启动画面。主框架窗口通过成员变量m_pDataMngFrm、m_pDevMngFrm和m_pSptMngFrm分别管理数据管理、设备管理和任务管理框架窗口的实例。
消息映射系统处理各种用户操作,如菜单命令IDM_MNG_DATA_WIN、IDM_MNG_EXEC_WIN和IDM_MNG_DEV_WIN,分别用于显示数据管理、执行管理和设备管理窗口。当用户选择这些菜单项时,框架会检查相应窗口是否已存在,如果不存在则创建新的子窗口,否则激活已存在的窗口。
Section sources
设备管理框架
设备管理框架由devmngframe.cpp实现,继承自CMDIChildWnd,作为MDI子窗口运行。该框架采用分割窗口设计,左侧为导航视图(CNavDevView),右侧为内容视图,根据设备状态动态切换显示内容。
框架通过m_splitter对象创建静态分割窗口,左侧显示设备树形结构,右侧根据设备状态显示不同的视图:在线设备显示CAppDevOLView,离线设备显示CAppDevView,无选择状态显示CBlankView。这种设计实现了灵活的UI布局,能够根据设备连接状态动态调整界面内容。
消息映射系统处理设备管理相关的各种操作,如IDM_OP_DE_REG_O_UPG(设备升级)、IDM_OP_DE_REG_O_MP(修改设备参数)和IDM_REM_GD10_TASK_MANAGER(远程任务管理)。ShowAppView方法根据设备状态决定显示哪个视图,并调用相应的操作类方法更新界面内容。
Section sources
任务管理框架
任务管理框架由taskmngframe.cpp实现,同样继承自CMDIChildWnd。该框架的实现相对简单,目前仅包含基本的框架结构和消息映射,没有具体的UI元素或业务逻辑实现。
从代码结构看,该框架预留了扩展空间,但当前版本中未实现具体的功能。这表明任务管理功能可能在其他模块中实现,或者该框架将在后续版本中进一步开发。
Section sources
数据管理框架
数据管理框架由datamngframe.cpp实现,继承自CMDIChildWnd,采用与设备管理框架类似的分割窗口设计。左侧为CNavDataView导航视图,右侧为内容视图,根据数据类型动态切换。
框架支持多种数据类型的管理,包括2D电阻率数据(CAppDataRsp2DTdView)、2D激电数据(CAppDataIpsp2DTdView)、3D电阻率数据(CAppDataRsp3DTdView)等。ShowAppView和ShowContentListByPageView方法根据数据类型和状态决定显示哪个视图,并调用CDataOperator操作类的方法加载和显示数据。
消息映射系统处理数据管理的各种操作,如IDM_OP_TD_2DRSP_DB_D(删除2D电阻率数据)、IDM_OP_TD_2DRSP_DB_EXCEL(导出2D电阻率数据到Excel)和IDM_OP_TD_2DRSP_DB_GRAP(显示2D电阻率数据图表)。这些操作通过CDataOperator类与后台数据管理器进行交互,实现数据的增删改查功能。
Section sources
对话框用户交互逻辑
Views模块包含多个对话框实现,用于处理特定的用户交互场景。DialNew2DTask.cpp实现创建新2D任务的对话框,提供任务名称、测试地点、测试类型、装置类型等参数的输入界面。
对话框通过组合框控件实现选项选择,如m_cmbTestType用于选择测试方法(电阻率、激电、自电),m_cmbArray用于选择装置类型。OnInitDialog方法初始化界面元素,设置默认值和本地化文本。OnSelchangeCombo2dTestType等事件处理方法根据用户选择动态更新相关控件的状态。
DialCfgTaskPacket.cpp实现配置任务包的对话框,允许用户将多个任务组合成一个任务包,并设置循环次数、时间间隔等参数。对话框使用列表控件m_listTaskPacket显示已添加的任务,提供添加和删除功能。用户可以通过界面设置PLC ID、循环次数和时间间隔,然后保存到数据库。
Section sources
跨孔测量UI组件
跨孔测量功能由crossHole目录下的组件实现,主要包括CCrossHoleConfig2DMainDlg.cpp。该对话框提供跨孔测量的配置界面,包含电极坐标、井下、地面和参数四个选项卡页面。
通过m_tabChange选项卡控件实现多页面切换,每个页面对应不同的配置内容。井下和地面页面使用COption2DBoreholeDlg和COption2DSurfaceDlg等子对话框实现具体功能。CCrosshole2dDrawingBoardDlg用于显示和编辑电极坐标,C2DSimulationDlg用于模拟测量过程。
TwoBoreholeGenerateScript方法实现跨孔测量脚本的生成算法,根据两个孔的电极位置计算测量点的ABMN参数和几何因子K值。SaveTestPointToDB方法将生成的脚本保存到数据库,包括脚本基本信息、通道信息和测点信息。
Section sources
测井功能UI
测井功能由logging目录下的组件实现,主要包括CDialogLoggingWnd.cpp。该对话框实现测井数据的显示界面,采用自定义绘制方式呈现测井曲线和岩性柱状图。
OnInitDialog方法初始化界面布局,设置各静态文本控件的位置。DrawFirstColumnStatic到DrawSixColumnStatic系列方法负责绘制界面的六个列区域,包括钻孔编号、探管型号、测量时间等基本信息。OnPaint方法实现自定义绘制,绘制测井曲线、深度刻度线和岩性柱状图。
UpdateLowHighValue方法更新各测量参数的最小值和最大值显示,用于指示数据范围。对话框支持加载测井数据文件,根据数据动态调整绘图区域大小,并在界面上绘制SP(自电)、长电位电阻率、短电位电阻率和梯度电阻率等测井曲线。
Section sources
自定义控件实现
ctrl目录包含自定义控件的实现,主要是CDragListCtrl.cpp。该控件继承自CListCtrl,扩展了拖拽功能,允许用户通过鼠标拖拽重新排序列表项。
控件通过重写OnLvnBegindrag、OnMouseMove和OnLButtonUp等消息处理方法实现拖拽逻辑。在OnLvnBegindrag中创建拖拽图像列表,并开始拖拽操作。OnMouseMove方法更新拖拽图像的位置,OnLButtonUp方法结束拖拽操作并清理资源。
CDragList辅助类提供拖拽操作的底层支持,BeginDrag、Dragging和EndDrag方法分别处理拖拽的开始、过程和结束阶段。这种设计实现了流畅的拖拽用户体验,允许用户直观地重新排列列表项。
Section sources
UI消息映射机制
Views模块采用MFC的消息映射机制处理用户交互。每个UI类通过BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏定义消息映射表,将Windows消息或命令ID映射到相应的处理方法。
例如,主框架窗口的消息映射表将ON_COMMAND(IDM_MNG_DATA_WIN, OnMngDataWin)映射到OnMngDataWin方法,当用户点击"数据管理"菜单时触发该方法。设备管理框架通过ON_MESSAGE(WM_SCHEDULE, OnSchedule)处理自定义的WM_SCHEDULE消息,用于更新界面状态。
消息处理方法通常先进行参数验证和状态检查,然后调用相应的业务逻辑类完成具体操作。例如,OnDevieUpgrade方法先确认用户是否要进行升级,然后调用m_pDevOperator->DevieUpgrade方法执行升级操作。这种设计实现了UI层与业务逻辑层的分离,提高了代码的可维护性。
Section sources