<!-- Article image -->
<!-- Add the rest of your HTML here -->
This article extends Chris Losinger's work on
<a href = http://www.codeproject.com/property/saprefs.asp#xx43138xx>CSAPrefsDlg.
CSettingsDialog is an MFC class which enables to customize the project settings.
The settings of a project are categorized as pages based on their nature of those pages.
If you are familiar with the Netscape preferences-dialog, you will have no problem understanding
the interfaces of
Unlike those similar dialogs posted in CodeProject and CodeGuru, which only allow
one type of Window (e.g.,
CPropertyPage or CDialog),
CWnd derived windows to be used as setting pages (Look at the demo figures
above, a property page, a form view and a generic
CWnd Windows are used for different
settings.I believe that this design extend the applicability of the class to meet the
need of various situations. Furthermore, each tree node does not have to have a setting page to be associated, it can be a generic tree node, e.g., a label used as a category index.
New features are added to this newest version.
is supported (take a look at the first demo picture). However, in order to use the
(or derived) class, you need to override the
virtual function to avoid the
ASSERTion error in your
(or derived) class.
Another new feature of
is that it support both modal and modaless state of display. There are some rules need to be followed. For the
modeless dialog, the dialog variable must be declared as a pointer and be instantiated using
new operator. You need to create the dialog using member function
to diaplay the dialog. The Apply
button in the dialog is disabled in the modal state and is enabled in the modeless
How to use
Use of the class is pretty simple. Just follow the following steps:
Add the following files to your project :
- SettingsDialog.cpp, SettingsDialog.h
- Copy the
dialog resource from the sample project to your project.
Create your Settings "pages" in the resource editor. If the page is a dialog, make
sure that the dialog has the following settings:
Use Class Wizard to create the dialog classes for the pages.
- Style - Child
- Border - None
- If used as a modal dialog:
Create and initialize the
CSettingsDialog as demonstrated in the demo project:
dlg.AddPage(RUNTIME_CLASS(CMyHtmlView), _T("Project Setting"), 0);
CPropPage1 *pModelPage = (CPropPage1*) dlg.AddPage(RUNTIME_CLASS(CPropPage1),
_T("Form View"), IDD_FORMVIEW, pModelPage);
dlg.AddPage(RUNTIME_CLASS(CMyView), _T("Generic View Page"), 0);
dlg.AddPage(NULL, _T("Generic Tree Item"), 0);
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
else if (nResponse == IDCANCEL)
- If used as a modaless dialog:
- Declare a
variable as a pointer in your parent window class,
- Instantiate an object of
CSettingsDialog *m_pDlg = new CSettingsDialog(this) ;
- create, initialize, and display the settings pages and dialog, e.g.,
m_pDlg = new CSettingsDialog(this);
_T("Project Setting"), 0);
= (CPropPage1*) m_pDlg->AddPage(RUNTIME_CLASS(CPropPage1),
_T("Model (PropertyPage)"), IDD_PROPERTY_PAGE1,
_T("Visibility (PropertyPage)"), IDD_PROPERTY_PAGE2,
m_pDlg->AddPage(RUNTIME_CLASS(CMyFormView), _T("Form View"),
m_pDlg->AddPage(RUNTIME_CLASS(CMyView), _T("Generic View Page"), 0);
m_pDlg->AddPage(NULL, _T("Generic Tree Item"), 0);
Add a message handler of
in your parent window which "owns" the dialog.
Finally do not forget to free the dialog memory in the parent window's destructor.
If you are not sure exactly how to do it, take a look at the attached demo project,
- Chris Losinger for his
<a href= http://www.codeproject.com/property/saprefs.asp#xx43138xx> CSAPrefsDialog (I modified from) and
<a href= http://www.codeproject.com/property/saprefs.asp#xx43138xx> CSAPrefsStatic (I used directly) classes
- V1.0 02/12/02 First version of the class
- V1.1 03/01/02
- Memory leak bug fixed.
- Thick frame style of CView type class (including CFormView) is removed to make it look more industrial standard.
- Html view supported.
- V1.2 03/08/02 Both modal and modaless states supported. The demo project shows the CSettingsDialog in both modal and modaless way.