ActiveX(六)

6.属性页

属性页使 ActiveX 控件用户得以查看和更改 ActiveX 控件属性。可通过调用控件属性对话框访问这些属性。该对话框包含一个或多个属性页,这些属性页提供自定义的图形界面用于查看和编辑控件属性。

使用默认属性页

创建ActiveX控件项目后,系统就自动为我们添加了一个属性页类,这里就是Cactivexdemo1PropPage。同时在对话框资源里也会有一个属性页对话框资源,这里就是IDD_PROPPAGE_ACTIVEXDEMO1。

在ActiveX控件测试容器中点击工具栏上的属性按钮,就会看到这个属性页对话框。

比如就像下图这样。当然这个上面什么还没有。

如果是在使用控件开发时,则在选中控件后,在属性窗口中点击属性页按钮可以打开这个属性页,开发人员可以在这个弹出的属性页窗口中设定控件的属性。

如果要通过属性页修改控件属性,那么就要通过在属性页上放置一些控件给用户来修改属性值。比如我们上面添加了一个Caption属性,我们要在属性页上提供修改这个属性的功能一般就是要用一个文本输入框。这样我们在属性页的对话框上放置一个Edit控件,设id为IDC_EDIT_CAPTION。然后为这个Edit控件绑定一个变量。用右键点这个Edit控件,学则添加变量,打开

在添加成员变量向导中添加一个新变量,设为m_caption,这里注意要把类型设为Value,由于属性是个字符串,所以这个地方变量类型也使用CString。

然后我们来看一下属性页类中的一个DoDataExchange函数。这个函数是由系统自动调用的,用来将控件与成员变量进行数据交换。由于我们刚把Edit控件绑定了m_caption变量,在DoDataExchange已经给我们写入了这么一句DDX_Text(pDX, IDC_EDIT_CAPTION, m_caption);,就是这一句实现了m_caption与Edit控件之间的数据交换。但此时控件Caption属性还不能自动从Edit控件中填写的值获得,还需要一个操作,即DDP_Text(pDX, IDC_EDIT_CAPTION, m_caption, _T(“Caption”));,这样就把Caption属性与与属性页中的m_caption变量绑定,这样每当我们在修改了属性页窗口中的Edit控件内容后,就能修改控件的Caption。

那么完整的DoDataExchange函数就应该像下面这样。

void Cactivexdemo1PropPage::DoDataExchange(CDataExchange* pDX)

{

DDX_Text(pDX, IDC_EDIT_CAPTION, m_caption);

DDP_Text(pDX, IDC_EDIT_CAPTION, m_caption, _T(“Caption”));

DDP_PostProcessing(pDX);

}

另外注意这个地方DDP_PostProcessing是系统自动生成的代码,这句话一定要放在DDX_Text和DDP_Text的后面,否则不能实现控件属性与属性页上控件的绑定。至此,我们就可以在设计时通过这个属性页来修改Caption属性,而不必通过程序代码来修改了。

添加其他自定义属性页

默认情况下只有一个属性页,如果需要设置的属性太多就需要另外添加自定义属性页。

新添加属性页的方法是这样的,打开VS的资源视图,添加一个新的Dialog资源。

在这里我们选择IDD_OLE_PROPPAGE_SMALL,当然也可以选和Large。给这个新资源ID指定为IDD_OLE_PROPPAGE_SMALL。

然后需要给这个资源新建一个关联类。这个关联类应当是MFC类,设类名为CPropPage1,基类应当是COlePropertyPage,对话框ID选择我们新添加的这个对话框资源ID。

然后,打开控件类Cactivexdemo1Ctrl的cpp文件,找到属性页的宏声明部分。

BEGIN_PROPPAGEIDS(Cactivexdemo1Ctrl, 1)

PROPPAGEID(Cactivexdemo1PropPage::guid)

END_PROPPAGEIDS(Cactivexdemo1Ctrl)

把我们新建的这个属性页添加进去,并将属性页计数加一。

// TODO: 按需要添加更多属性页。请记住增加计数!

BEGIN_PROPPAGEIDS(Cactivexdemo1Ctrl, 2)

PROPPAGEID(Cactivexdemo1PropPage::guid)

PROPPAGEID(CPropPage1::guid)

END_PROPPAGEIDS(Cactivexdemo1Ctrl)

这样就把新添加的这个属性页附加到控件中去了,再打开控件的属性页就会看到多了一个属性页了。

常用属性页

除了可以根据需要自定义属性页外,系统还提供给开发人员一些预制的常用属性页,如颜色、字体等属性页。MFC 提供了三个与 ActiveX 控件一起使用的常用属性页:CLSID_CColorPropPage、CLSID_CFontPropPage  和 CLSID_CPicturePropPage。这些页分别显示常用颜色、字体和图片属性的用户界面。

要将这些属性页合并到控件中,只需要请将它们的 ID 添加到初始化控件的属性页 ID 数组的代码。也就是在类控件Cactivexdemo1Ctrl的cpp文件中的PROPPAGEIDS声明处修改成如下形式。与自定义属性页中相同,也需要增加属性页计数。

// TODO: 按需要添加更多属性页。请记住增加计数!

BEGIN_PROPPAGEIDS(Cactivexdemo1Ctrl, 3)

PROPPAGEID(Cactivexdemo1PropPage::guid)

PROPPAGEID(CPropPage1::guid)

PROPPAGEID( CLSID_CColorPropPage )

END_PROPPAGEIDS(Cactivexdemo1Ctrl)

这样就在属性页里添加了一个颜色属性页,但要想使用这个属性页还需要添加几个常用属性,比如说我们希望能通过这个属性页设定BackColor和ForeColor属性,就参照常用属性一节中的方法添加一个BackColor和一个ForeColor属性,编译生成控件后在ActiveX控件测试容器中点击工具栏中的属性。

在弹出的属性窗口中就能看到有关这两个属性的设定了。

若要使用颜色属性,则需要调用COleControl::TranslateColor成员函数。此函数的参数为颜色属性值和可选的调色板句柄。返回值为 COLORREF 值,可以将它传递给 GDI 函数,如 SetTextColor 和 CreateSolidBrush。下例说明如何在绘制控件时使用这两个颜色属性。

CBrush bkBrush(TranslateColor(GetBackColor()));

COLORREF clrFore = TranslateColor(GetForeColor());

pdc->FillRect( rcBounds, &bkbrush );

pdc->SetTextColor( clrFore );

pdc->DrawText( InternalGetText(), -1, rcBounds, DT_SINGLELINE | DT_CENTER | DT_VCENTER );


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值