Environment: Windows 2000 RC2, Windows NT4 SP6, Visual C++ 6 SP3
Dynamic Dialog class
These classes are being used for displaying a modal dialog,
on which the controls are dynamically added,
without the need of having a dialog template as resource.
These classes were developed as base classes for use in a script parser,
where users can build there own dialogs, using a VB-script alike language.
So basically there can be any number of controls on the dialog,
at any place on the dialog.
Global structure of the CDynDialogEx
class:
- class is derived of
CDialog
- in the class there is an array of
CDynDialogItemEx
pointers, the dialog controls - class includes
DoDataExchange()
function. - add controls to dialog through function
AddDlgControl()
Global structure of the CDynDialogItemEx
class:
- holds the data of the control that was added to the dialog, like the
caption, the rectangle, etc. - creates the controls on the dialog
Small piece of sample code on how to use the classes
void CTestDynDialogDlg::OnButton1(); { int nRadio1 = 0; //Create a rectangle in dialog units, where //the control should be placed CRect rect(10,5,60,19); //create the dynamic dialog, //using this as parent window CDynDialogEx dlg(this); dlg.SetWindowTitle(_T("Dynamic Dialog : WindowTitle.....")); //Add a button control at the given position dlg.AddDlgControl(_T("BUTTON"), // Type of control OR control classname _T("Press me!"), // Caption of control STYLE_BUTTON, // dwStyle of control EXSTYLE_BUTTON, // dwStyleEx of control &rect, // Position of control on dlg in dlg units NULL, // void ptr to DDX var - default=NULL IDC_DYN_BUTTON); // control ID - 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() }
Working explained
CDynDialogEx::AddDlgControl()
function creates new object of classCDynDialogItemEx
and adds it to the array of controls. Function also checks/sets the size of
the dialog, so the control is seen on the dialog.CDynDialogEx::DoModal()
function initializes theDLGTEMPLATE
structure
using the selected font and callsCDialog::InitModalIndirect()
CDynDialogEx::OnInitDialog()
function creates all the controls on the
dialogCDynDialogItemEx::CreateEx()
function converts from dialog units to
screen units and creates the control
Possible extensions:
- adding ActiveX controls dynamically to the dialog
- adding Menus dynamically to the dialog
- …