BEGIN_PROPPAGEIDS(CSample68Ctrl, 1) PROPPAGEID(CSample68PropPage::guid) END_PROPPAGEIDS(CSample68Ctrl) |
这里的CSample68PropPage类是从COlePropertyPage派生出来的,而COlePropertyPage的基类又是CDialog,因此不难发现CSample68PropPage与通常的对话框类是比较相似的。可以象处理对话框一样在资源视图中为缺省的属性页添加与自定义属性相关的交互用控件,并通过ClassWizard将这些控件与类成员变量建立绑定关系。但是有一点不同,就是在绑定成员变量时还要与控件中的相应属性建立起对应关系。如图12所示,在Optional property name组合框中输入自定义属性名或是直接从下拉列表选择库存属性名,ClassWizard向导将在属性页类的DoDataExchange()函数中添加控件、变量和属性的绑定代码:
void CSample68PropPage::DoDataExchange(CDataExchange* pDX) { //{{AFX_DATA_MAP(CSample68PropPage) DDP_Text(pDX, IDC_MESSAGE, m_sMessage, _T("Message") ); DDX_Text(pDX, IDC_MESSAGE, m_sMessage); DDP_Text(pDX, IDC_TITLE, m_sCaption, _T("Caption") ); DDX_Text(pDX, IDC_TITLE, m_sCaption); DDP_Text(pDX, IDC_XPOS, m_nXPos, _T("XPos") ); DDX_Text(pDX, IDC_XPOS, m_nXPos); DDP_Text(pDX, IDC_YPOS, m_nYPos, _T("YPos") ); DDX_Text(pDX, IDC_YPOS, m_nYPos); //}}AFX_DATA_MAP DDP_PostProcessing(pDX); } |
图12 成员变量、控件与属性的绑定
这里只是在向导生成的缺省属性页中实现了自定义属性的可视化设置。虽然也可以用相同的方法为库存属性进行设置,但是更多的还是采用添加库存属性页ID的方法来直接使用库存属性页来对其进行维护。例如,对于库存属性BackColor和ForeColor,可以通过ID号为CLSID_CcolorPropPage的库存属性页来进行设置,在将其添加到属性页ID表的同时一定要注意修改BEGIN_PROPPAGEIDS()宏的属性页计数,否则将会引起系统的崩溃:
BEGIN_PROPPAGEIDS(CSample68Ctrl, 2) PROPPAGEID(CSample68PropPage::guid) PROPPAGEID(CLSID_CColorPropPage) END_PROPPAGEIDS(CSample68Ctrl) |
继续在ActiveX Control Test Container中测试控件,将其插入后选择"Edit"菜单的"Properties…"菜单项,将弹出入图13所示的属性表。该属性表共有三个属性页,其中第一个属性页为刚才编辑的自定义属性页,第二个属性页(如图14所示)即为CLSID_CcolorPropPage所指定的颜色属性页(为库存属性页),最后一个属性页则是向导自动添加的扩展属性页。在属性表中设置了相应的属性后,点击"应用"按钮即可让控件使用新的属性。这与在"Invoke Methods"对话框中所完成的功能一样,但显然要方便的多。而且在包容器程序的设计阶段,也是通过该属性表来完成控件与客户的属性设置交互的。
图13 控件的属性表
图14 颜色属性页