动态对话框类






4.52/5 (15投票s)
2000年2月15日

283568

9072
动态且轻松地创建对话框,无需对话框资源脚本。
动态对话框类
这些类用于显示模式/非模式对话框,控件是动态添加的,不需要对话框模板作为资源。 这些类开发为脚本解析器的基类,用户可以使用类似 VB 脚本的语言构建自己的对话框。 所以基本上对话框上可以有任意数量的控件,位于对话框上的任何位置。
CDynDialogEx
类的全局结构
- 类派生自
CDialog
- 类中有一个
CDynDialogItemEx
指针数组,即对话框控件 - 类包含
DoDataExchange()
函数。 - 通过函数
AddDlgControl()
将控件添加到对话框
CDynDialogItemEx
类的全局结构
- 类派生自
CWnd
- 保存添加到对话框的控件的数据,如标题、矩形等。
- 在对话框上创建控件
关于如何使用这些类的小段示例代码
void CTestDynDialogDlg::OnButton1(); { int nRadio1 = 0; //Create a rectangle in dialog units, where the control should be placed CRect rect(10,5,60,19); CDynDialogEx dlg(this); //create the dynamic dialog, using this as parent window dlg.SetWindowTitle(_T("Dynamic Dialog : WindowTitle.....")); //Add a button control at the given position dlg.AddDlgControl(_T("BUTTON"), // Type of control OR classname of the control _T("Press me!"), // Caption of control STYLE_BUTTON, // dwStyle of control EXSTYLE_BUTTON, // dwStyleEx of control &rect, // Position of control on dialog in dialog units, default = NULL NULL, // void pointer to variable use for DDX, default = NULL IDC_DYN_BUTTON); // ID of the contol, default = zero //Add a group of radio buttons //variable nRadio1 is used for DDX dlg.AddDlgControl(_T("BUTTON"), _T("Radio1Caption 1"), STYLE_RADIO_GROUP, EXSTYLE_RADIO, NULL, (void*)&nRadio1); dlg.AddDlgControl(_T("BUTTON"), _T("Radio1Caption 2"), STYLE_RADIO, EXSTYLE_RADIO); //Now show me the dialog dlg.DoModal() }
工作原理说明
CDynDialogEx::AddDlgControl()
函数创建CDynDialogItemEx
类的新对象,并将其添加到控件数组。 函数还检查/设置对话框的大小,以便在对话框上看到该控件。CDynDialogEx::DoModal()
函数使用所选字体初始化DLGTEMPLATE
结构,并为模式对话框调用CDialog::InitModalIndirect()
,为非模式对话框调用CDialog::CreateIndirect()
。CDynDialogEx::OnCreate()
函数在对话框上创建所有控件CDynDialogItemEx::CreateEx()
不执行任何操作(ActiveX 控件),或创建窗口CDynDialogEx::OnInitDialog()
函数重新定位对话框上的所有控件,或创建 ActiveX 控件CDynDialogItemEx::SetWindowPos()
函数从对话框单位转换为屏幕单位,并创建 ActiveX 控件
更新于 2002 年 6 月 18 日
- 类
CDynDialogItemEx
现在从 CWnd 派生,而不是拥有 CWnd 成员 - 正如 CodeBuddy 建议的那样,添加了非模式对话框的可能性。 (
CDynDialogEx::SetUseModeless()
) - 添加了子类化的控件,因为我需要它们。 添加控件后,您可以使用 SubclassDlgItem 和调用
CDynDialogEx::AddSubclassedDlgControl()
返回的 Control_ID。 - 改进了对对话框项的
DDX_Control
支持 - 添加了部分 ActiveX 控件支持。 部分原因是控件已创建,但不支持 EVENT_SINK! 但是有动态创建授权控件的代码。
- 添加了非模式对话框、添加和填充 CListbox 以及在对话框上添加 ActiveX 控件的示例
提示!
- 将此代码与 Paolo Messina 的文章 CResizableDialog 中的代码混合使用
可能的扩展
- 改进 ActiveX 控件支持,特别是与 EVENT_SINK 相关的支持
- 将菜单动态添加到对话框
- ...