本文档详细说明了CATIA CAA中对话框的基本使用方式,特别关注四个核心方法:构造函数、Build方法、SetFather方法和SetVisibility方法。
1. 对话框的生命周期
在CATIA CAA中,对话框的典型生命周期包括以下步骤:
- 创建实例:通过构造函数创建对话框对象
- 构建界面:调用Build方法创建所有UI控件
- 设置父子关系:通过SetFather方法设置事件处理关系
- 显示对话框:使用SetVisibility方法控制对话框的可见性
- 事件处理:响应用户交互
- 销毁:通过RequestDelayedDestruction方法释放资源
2. 核心方法详解
2.1 构造函数
代码示例:
_pCase1Dlg = new UICase1Dlg();
UICase1Dlg的构造函数实现:
UICase1Dlg::UICase1Dlg() :
CATDlgDialog ((CATApplicationFrame::GetApplicationFrame())->GetMainWindow(),
"UICase1Dlg",CATDlgGridLayout)
{
_Frame001 = NULL;
_SelectorList002 = NULL;
_Label003 = NULL;
_PushButton004 = NULL;
_MultiList005 = NULL;
}
作用:
- 初始化对话框对象并设置基本属性
- 继承自CATDlgDialog基类,需要提供父窗口、对话框名称和布局样式
- 在初始化列表中调用基类构造函数
- 初始化对话框中包含的所有控件指针为NULL
参数说明:
-
父窗口:通常使用应用程序的主窗口,通过
CATApplicationFrame::GetApplicationFrame()->GetMainWindow()获取 - 对话框名称:唯一标识符,用于资源文件和事件通知
-
布局样式:如
CATDlgGridLayout表示使用网格布局
2.2 Build方法
代码示例:
_pCase1Dlg->Build();
UICase1Dlg的Build方法实现:
void UICase1Dlg::Build()
{
_Frame001 = new CATDlgFrame(this, "Frame001", CATDlgGridLayout);
_Frame001 -> SetGridConstraints(0, 0, 1, 1, CATGRID_4SIDES);
_SelectorList002 = new CATDlgSelectorList(_Frame001, "SelectorList002");
_SelectorList002 -> SetVisibleTextHeight(1);
_SelectorList002 -> SetGridConstraints(0, 1, 1, 1, CATGRID_4SIDES);
// 更多控件的创建和配置...
}
作用:
- 实际创建对话框中的所有UI控件
- 配置每个控件的属性和布局约束
- 建立控件之间的父子关系和层级结构
- 设置控件的初始状态
特点:
- Build方法不会自动调用,必须显式调用
- 控件的创建顺序通常遵循从外到内的原则
- 使用SetGridConstraints设置网格布局中的位置和大小
- 可以在这里设置控件的初始属性,如可见性、高度等
2.3 SetFather方法
代码示例:
_pCase1Dlg->SetFather(this);
作用:
- 建立对话框与其命令对象之间的父子关系
- 设置事件通知的路由方向
- 确保对话框的生命周期与命令对象关联
- 允许命令对象接收和处理来自对话框的事件
重要性:
- 如果不设置Father,对话框产生的事件将无法正确路由到命令对象
- 影响命令对象的状态管理和事件处理流程
- 确保对话框在命令结束时能够被正确销毁
2.4 SetVisibility方法
代码示例:
_pCase1Dlg->SetVisibility(CATDlgShow);
作用:
- 控制对话框的显示状态
-
CATDlgShow参数表示显示对话框 - 其他可能的参数包括
CATDlgHide(隐藏)
调用时机:
- 通常在对话框创建、构建并设置好父子关系后调用
- 可以在需要时多次调用,以控制对话框的显示和隐藏
3. 对话框资源管理
3.1 销毁机制
在命令的析构函数中,应该正确释放对话框资源:
UICase1Cmd::~UICase1Cmd()
{
if (_pCase1Dlg != NULL)
_pCase1Dlg->RequestDelayedDestruction();
// 释放其他资源...
}
注意事项:
- 使用
RequestDelayedDestruction而不是直接delete - 这确保了对话框在适当的时机被安全销毁
- 对话框的子控件会被自动销毁,不需要手动释放
3.2 事件通知处理
设置对话框事件通知处理示例:
// 处理对话框关闭事件
AddAnalyseNotificationCB(_pCase1Dlg,
_pCase1Dlg->GetDiaCLOSENotification(),
(CATCommandMethod)&UICase1Cmd::ExitAction,
NULL);
// 处理按钮点击事件
AddAnalyseNotificationCB(_pCase1Dlg->_PushButton004,
_pCase1Dlg->_PushButton004->GetPushBActivateNotification(),
(CATCommandMethod)&UICase1Cmd::Case1PushButtonAction,
NULL);
4. 完整的对话框创建流程示例
结合上述四个方法,一个完整的对话框创建流程如下:
// 1. 创建对话框实例
_pCase1Dlg = new UICase1Dlg();
// 2. 构建对话框界面
_pCase1Dlg->Build();
// 3. 设置父子关系,建立事件路由
_pCase1Dlg->SetFather(this);
// 4. 显示对话框
_pCase1Dlg->SetVisibility(CATDlgShow);
// 5. 添加事件通知处理
AddAnalyseNotificationCB(_pCase1Dlg,
_pCase1Dlg->GetDiaCLOSENotification(),
(CATCommandMethod)&UICase1Cmd::ExitAction,
NULL);
// 6. 在命令结束时销毁对话框
// 在析构函数中调用: _pCase1Dlg->RequestDelayedDestruction();
5. 最佳实践
- 遵循正确的初始化顺序:构造函数 → Build → SetFather → SetVisibility
- 适当管理资源:使用RequestDelayedDestruction释放对话框
- 正确设置事件处理:确保所有需要的事件都有对应的处理函数
- 保持对话框简洁:避免在一个对话框中放置过多控件
- 使用资源文件:将文本和资源定义放在专门的资源文件中
6. 对话框定义文件
CATIA CAA对话框通常有一个对应的.CATDlg文件,用于定义对话框的结构:
CATDlgDialog UICase1Dlg
{
STYLE = CATDlgGridLayout;
}
CATDlgFrame Frame001
{
FATHER = UICase1Dlg;
STYLE = CATDlgGridLayout;
GRID = { 0, 0, 1, 1, CATGRID_4SIDES };
}
// 更多控件定义...
这个文件定义了对话框的布局结构,可以通过CAA向导自动生成。
通过以上四个核心方法的合理使用,可以在CATIA CAA中创建和管理功能完整的对话框界面。这些方法构成了CAA对话框编程的基础框架,掌握它们对于开发CATIA CAA界面至关重要。