当前位置:首页 > VC++控件开发教程(实用)
图7 对属性、方法的测试
图8 设置了属性后的控件
对于控件属性的添加,在MFC ClassWizard对话框的ActiveX Events页中通过\Event…\按钮弹出如图9所示的\事件添加对话框。与方法、属性的添加类似,在External name组合框中可以输入要添加的自定义事件名称,也可以从下拉列表选择库存事件。Implementation项将根据所要添加的事件类型而自动设置Stock或Custom选项。ActiveX
图9 事件的添加
dispinterface _DSample68Events {
properties:
// Event interface has no properties methods:
// NOTE - ClassWizard will maintain event information here. // Use extreme caution when editing this section. //{{AFX_ODL_EVENT(CSample68Ctrl) [id(1)] void MsgOut();
//}}AFX_ODL_EVE// Dispatch and event IDs public: enum {
//{{AFX_DISP_ID(CSample68Ctrl) ……
eventidMsgOut = 1L, //}}AFX_DISP_ID }; ……
BEGIN_EVENT_MAP(CSample68Ctrl, COleControl) //{{AFX_EVENT_MAP(CSample68Ctrl)
EVENT_CUSTOM(\//}}AFX_EVENT_MAP END_EVENT_MAP()
上述代码添加了一个MsgOut的自定义事件,可以在通过调用FireMsgOut()来激发。下面对Message属性的OnMessageChanged()消息响应函数进行修改,每当Message属性内容被更改都会调用该函数,在该函数中调用此前添加的MessageLen()方法以确定更改后的Message属性的字符串长度,在长度大于10时调用FireMsgOut()触发MsgOut事件:
void CSample68Ctrl::OnMessageChanged() { InvalidateControl(); if (MessageLen() >= 10) FireMsgOut(); SetModifiedFlag(); }
图10 选择要记录的事件
在用ActiveX Control Test Container对刚添加的事件进行测试时,首先通过\菜单下的\…\菜单项弹出如图10所示的对话框,并从\属性页中选中要跟踪记录的事件。当通过Invoke Methods对话框设置Message属性的内容超过10个字符后,位于程序框架下方的分割视图将记录控件所触发的MsgOut事件(如图11所示)。
图11 对事件的测试
实现属性表
属性表是ActiveX控件所特有的一种技术,可以在包容器程序处于设计阶段时为其提供
一个可视化的人机交互界面,并可以通过其对控件的自定义属性和库存属性进行设置。在用向导生成程序框架的同时即已经生成了一个空的用于管理自定义属性的属性页。在代码上通过控件类实现文件中的属性页ID表对其进行维护: 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(\ DDX_Text(pDX, IDC_MESSAGE, m_sMessage); DDP_Text(pDX, IDC_TITLE, m_sCaption, _T(\ DDX_Text(pDX, IDC_TITLE, m_sCaption); DDP_Text(pDX, IDC_XPOS, m_nXPos, _T(\ DDX_Text(pDX, IDC_XPOS, m_nXPos); DDP_Text(pDX, IDC_YPOS, m_nYPos, _T(\ DDX_Text(pDX, IDC_YPOS, m_nYPos); //}}AFX_DATA_MAP DDP_PostProcessing(pDX); }
共分享92篇相关文档