Developing ActiveX Controls I always was unhappy to spend a fair amount of time to monotonous GUI work designing and implementing a property pages. After all I wrote this class that works in most cases as universal property page for any ATL-based ActiveX Control. The prototype for this class is property browser window known for any of Visual Basic's developers.
How it works:
Generally, this class uses IPropertyPage::SetObjects and query the control's IDispatch::GetTypeInfo to enumerate properties. Currently, this template class can handle following kinds of properties:
Current implementation don't display properties that has [hidden] or [nonbrowsable] attributes as well as indexed properties and properties of custom types (IFoo* or similar). The control's default interface should be dual and derived from IDispatch. If you use enumerated properties, the control must support IPerPropertyBrowsing::GetPredefinedStrings and IPerPropertyBrowsing::GetPredefinedValue (look the demo project for a sample) The main template class CPropertyBrowserPage is derived from both IPropertyPageImpl and CDialogImpl and uses some other helper classes that is briefly described below:
How to use:
1. Copy following files to your project directory:
and add *.cpp files to the project.
2. Select "New ATL Object" from the Insert menu. Select "Property Page" and fill all fields Wizard requires. (For example, assume you choose "CDemoCtrlPage" as the name of your page's class)
3. Go to CDemoCtrlPage class declaration and modify base classes list as following
class ATL_NO_VTABLE CDemoCtrlPage : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CDemoCtrlPage, &CLSID_DemoCtrlPage>, // public IPropertyPageImplnext, change message map chain macro as following:
, <--- this lines should be removed // public CDialogImpl /* next line should be added*/ public CPropertyBrowserPage<CDemoCtrlPage>
BEGIN_MSG_MAP(CDemoCtrlPage) /* CHAIN_MSG_MAP(IPropertyPageImpl<CDemoCtrlPage>) <--- this line should be removed*/ CHAIN_MSG_MAP(CPropertyBrowserPage<CDemoCtrlPage>) /*<--- this line should be added*/ END_MSG_MAP()and remove Wizard-generated CDemoCtrlPage::Apply() method and finaly don'f forget to include PropertyBrowserPage.h
4. Add following macro in your control's class property map
5. Go to Wizard-generated page's dialog template and remove all child controls.
6. Please note that this class uses some C RTL code that makes _ATL_MIN_CRT directive impossible so you have to remove it.
Note: This project was build using Visual C++ 5.0 SP3. I haven't tested it under Visual C++ 6.0
If you find this class useful and would like to use it in your projects I'll very pleased. But I provide no warranty of any kind so you use it at your own risk. Please let me know if you find a bug(s) in this code or have any suggestion about it and I'll try to respond you if I'll able.