65.9K
CodeProject 正在变化。 阅读更多。
Home

动态对话框类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.52/5 (15投票s)

2000年2月15日

viewsIcon

283568

downloadIcon

9072

动态且轻松地创建对话框,无需对话框资源脚本。

Sample Image Testappliction - TestDynDialog.gif Sample Image Dynamic dialog - DynamicDialog.gif

Sample Image Dynamic dialog with List control - DynDialogList.gif Sample Image Dynamic dialog with ActiveX control - DynDialogActiveX.gif

动态对话框类

这些类用于显示模式/非模式对话框,控件是动态添加的,不需要对话框模板作为资源。 这些类开发为脚本解析器的基类,用户可以使用类似 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 控件的示例

提示!

可能的扩展

  • 改进 ActiveX 控件支持,特别是与 EVENT_SINK 相关的支持
  • 将菜单动态添加到对话框
  • ...
© . All rights reserved.