📄 18.2.1 标准属性.txt
字号:
18.2.1 标准属性
在 VC++开发环境中,如果想要为控件添加属性,可以通过 ClassWizard来完成。首先打开 ClassWizard对话框,然后选择 Automation选项卡,接着单击该选项卡上的【 Add Property.. .】按钮,将出现如图 18.23所示的添加属性对话框。
图 18.23添加属性对话框
在此对话框上,单击 Extemal name (外部名称)下拉列表框,将会看到在出现的列表框中有许多属性,这些都是 MFC为 ActiveX控件提供的标准属性,其中就有 BackColor(背景色)和 ForeColor(前景色〉属性,如果想要为控件添加某种标准属性,只需要从该列表中选择该属性,例如选择 BackColor,并保持默认的 Stock选项选中状态,单击【 OK】按钮即为控件添加了背景色属性。然后按照同样的方法为 Clock控件添加 ForeColor属性。这时, Clock控件的 Automation选项卡的内容如图 18.24所示。
可以看到,新添加的这两个属性前面都有一个 "S"
图 18.24为 Clock控件添加了两个标准属性
标志,而且下面的提示说明它们
一个" Stock Property ",即常规的,或储备的属性。在 ActiveX控件中有四种属性。
. Stock:为每个控件提供的标准属性,如字体或颜色。
. Ambient:围绕控件的环境属性一一己被置入容器的属性。这些属性不能被更改,但控件可以使用它们调整自己的属性。
. Extended:这些是由容器处理的属性,一般包括大小和在屏幕上的位置。
. Custom:由控件开发者添加的属性。
单击如图 18.24所示对话框上的【 OK】按钮关闭 ClassWizard对话框,然后,在 VC++开发环境中的 ClassView选项卡上的 DClock接口下,可以看到添加了两个属性: BackColor 和 ForeClor。
再次利用 Build命令生成 Clock控件,然后在 VB中打开刚才保存的 VBTest测试程序,在窗体中选中 Clock控件,这时,在 VB提供的属性面板上就可以看到新添加的两个属性: BackColor和 ForeColor,如图 18.25所示。
图 18.25在 VB属性面板上列出了 Clock控件新添加的属性
在该属性面板上,我们可以设置这两个属性的值,例如将 BackColor设置为红色,将 ForeColor设置为蓝色,但发现窗体中的 Clock控件井没有发生改变。用户当然希望当修改了这两个属性的值以后,该控件的背景和文本颜色能够做出相应的改变。为了实现这一功能,还需要在 CClockCtrl类的 OnDraw函数中编写一些代码,结果如例 18-5所示。
例 18-5
void CClockCtrl : : OnDraw(CDC* pdc , const CRect& rcBounds , const CRec t &
rc Invalid)
{
1. CBrush brush(TranslateColor(GetBackColor()));
2. pdc->FillRect(rcBounds, &brush);
3. pdc->SetTextColor(TranslateColor(GetForeColor()));
4. CTime time=CTime: :GetCurrentTime();
5. CString str=time .Format( "%H: %M :%S " ) ;
6. pdc->TextOut(0, 0, str);
因为 BackColor和 ForeColor这两个属性是 ActiveX控件的标准属性,所以需要调用 MFC提供的函数才能得到这两个属性的值。在上述 OnDraw函数中,首先通过调用
该函数是 COleControl类的一个成员函数,
GetB ackColor函数得到 BackColor属性的值。其原型声明如下所示:
OLE_COLOR GetBackColor(
GetBackColor函数的返回值类型是 OLE 成员函数: TranslateColor可以将这种类型的值转换为我们通常使用的颜色类型: COLORRGB的值。 TranslateColor函数的原型声明如下所示 :
COLORREF TranslateColor(OLE_COLOR clrColor , HPALETTE hpal = NULL );
该函数有两个参数,第一个参数 clrColor就是将要转换的 OLE COLOR类型的颜色值,第二个参数是一个调色板的句柄,该参数是可选的,默认值是 NULL。返回值就是 COLORREF类型的颜色值。
接着利用得到的 BackColor属性的值构造一个 CBrush对象,即画刷对象。然后就可以调用 FillRect函数利用该画刷填充控件的背景色。接下来利用用户设置的 ForeColor属性的值设置控件的文本颜色,即控件的前景色。同样地,得到控件的前景色属性可以调用 COleControl类的成员函数: GetForeColor函数。
利用 Build命令生成 Clock控件,然后在 W中打开 VBTest测试程序测试最新的 Clock控件,先将其 BackColor属性设置为红色,立即就会看到窗体上 Clock控件的背景色变成了红色。然后将其 ForeColor属性设置为蓝色,立即就会看到窗体上 Clock控件的前景色变成了蓝色,如图 18.26所示。
但是,可以看到 Clock控件上文字下方有一块白色的区域,这是文字的背景色。如果
把控件的文字背景设置为透明模式,就不会有这块白色区域了,效果会比较协调些。因此,关闭 VBTest工程,然后回到 VC++开发环境中,在上述如例 18-5所示 CClockCtrl类的 OnDraw函数的第 3行代码之前添加下面这条语句,将文字的背景设置为透明的 :
pdc->SetBkMode(TRANSPARENT) ;
利用 Build命令生成最新的 Clock控件,然后再次在 VB中打开 VBTest测试程序测试该控件,在 VB属性面板上,将该控件的 BackColor和 ForeColor属性分别选定为红色和蓝色,这时将发现 VB窗体上 Clock控件看上去就比较协调了,如图 18.27所示。
图 18.26通过设置 VB属性面板上图 18.27
将控件的文字背景设置为透明色
的属性修改控件的外观明模式后的控件显示效果如果在 VB窗体中,在 Clock控件上单击鼠标右键,井从弹出的快捷菜单中选择【特
性】菜单项的话,将弹出如图 18.28所示的对话框,这就是 ActiveX控件自身的一个属性
图 18.28 ActiveX控件自身的属性表单
通常,作为 ActiveX控件来说,它会提供一个属性表单,该属性表单由多个属性页组成,每页上会提供一些选项,用来对这个 ActiveX控件进行设置。这时,我们看到如图 18.28所示的 Clock控件的 General属性页中显示的内容,实际上就是 Clock程序中 IDD PROPPAGE_CLOCK对话框资源中显示的内容。而通过查看程序,将会发现, CClockPropPage类就是 IDD_PROPPAGE_CLOCK对话框资源的实现类。也就是说,这时, Clock控件的属性表单中已经有了一个属性页,该属性页是通过 CClockPropPage类实现的。
下面,我们希望在 Clock控件的属性表单中增加一个提供颜色属性的属性页,让用户可以通过该控件自身的属性表单设定其背景色和前景色,因为并不是所有的容器都会像 VB那样提供一个控件属性面板。如果某个容器没有提供这样的属性面板,就可以让用户通过控件自身的属性表单对控件进行设置。
关闭 VBTest程序,让我们再回到 VC++开发环境中,在 ClockCtl. cpp源文件中可以看到下面如例 18-6所示这段代码。
例 18-6
/////////////////////////////////////////////////////////////////////// // Property pages
/ / TODO: Add more property pages as needed . Remember to increase the count! BEGIN_PROPPAGEIDS(CClockCtrl , 1) PROPPAGEID(CClockPropPage::guid)
END_PROPPAGE工 DS(CClockCtrl)
上述如例 18-6所示代码提示我们:可以根据自己的需要增加属性页,但应相应地增加属性页总量。刚才我们在 VB中能够显示 CClockPropPage类对应的属性页,就是因为添加了上述加灰显示的代码,这行代码通过使用 CCloc kPropPage类的全局惟一标识符 Cguid)调用 PROPPAGEID宏增加该属性页。 guid是一个 128位的整数,用来惟一地标识一个组件,或者一个接口。同样地,为了增加颜色属性页,也需要在这里调用 PROPPAGEID宏来实现,并且还需要使用该属性页的 guid,对 ActiveX控件来说,其颜色属性页的 guid值
是CLSID_CColorPropPage,因此在如例 18-6所示代码的END_PROPPAGEIDS宏之前添加下面这条语句:
PROPPAGEID(CLSID_CColorPropPage)
这时,在Clock控件的属性表单中就添加了一个颜色属性页,但是,读者一定注意,
一定要相应地增加属性页的总数,即增加如例 18-6所示代码中 BEGIN PROPPAGEIDS 宏的第二个参数的值,该参数表示属性表单中当前属性页的个数,因为现在我们为Clock属性表单增加了一个属性页,因此该数字也要相应地改变,变成 2,否则在使用该控件时,在调用其属性表单时会出现非法访问错误。这时如例 18-6所示代码将变为下面如例 18-7所示代码,其中加灰显示的代码就是新增的或修改的代码。
11IJ 18-7
/////////////////////////////////////////////////////////////////////// // Property pages
1/ TODO : Add more property pages as needed . Remember to increase the count! BEGIN_PROPPAGEIDS(CClockCtrl. 2) PROPPAGEID(CClockPropPage : :guid)
PROPPAGE工D(CLSID_CColorPropPage)
END_PROPPAGEIDS(CClockCtrl)
利用Build命令再次生成Clock控件,然后在 VB中打开VBTest程序测试该控件,这时当我们打开该控件自身的属性表单时,就可以看到多了一个属性页:颜色属性页,如图
18.29所示。在此属性页中可以设置 Clock控件的背景色和前景色,读者可以自行测试下设置效果。读者应注意,这个属性表单是控件自身提供的。
JBackC 01町~
口
系籍"色也】
嚎菌素亩一
口口
图 18.29为 Clock控件增加了一个颜色属性页
同样地,在ActiveX Con位01 Test Container容器中也可以看到Clock控件自身提供的这个属性表单。在该容器中,首先插入Clock控件,然后选择【Edi趴特性】菜单项,就可以调出控件自身的属性表单,将会看到其中也有颜色属性页,如图 18.30所示。
" ‘ I 677
第 18章 ActiveX撞件
山山【 0川lI:!lJ脱僻州f~ -
_01 1理E羁喇l
楼主
严旦
.
旦二J
当当
··口口
口··口
图 18.30在 ActiveX Control Test Container容器中可以看到 Clock控件自身提供的属性表单
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -