基于VC++中ATL创建ActiveX控件的探讨(2)
3)为ActiveX控件添加自定义属性
现在来添加Circle控件的一个基本属性――Radius。
在Workspace Windows中Class View状态下,右击 ICircleCtl接口,选择Add Property,属性类型为short,名为Radius,参数为空。系统会自动生成get_Radius和put_Radius两个成员函数。在CCircleCtl中添加m_radius变量,用来存储半径。在CCircleCtl的构造函数中将其初始化为50,并在get_Radius函数中添加*pVal=m_radius; 在put_Radius函数中添加m_radius=newVal; FireViewChange();用来及时更新视图。对于Radius的属性,我们通过修改控件的绘制代码来使它起作用。
4) 修改ActiveX控件的绘制代码实现属性交换
首先,在CCircleCtl的构造函数中对绘制圆的填充色进行初始化,将它的初始值设为红色,即m_clrFillColor=RGB(255,0, 0)。
接下来,我们需要几个全局变量来保存控件区域的信息,在CircleCtl.h中添加如下变量:
static POINT CenterPt;
static long RectHt = 0;
static long RectWd = 0;
然后修改OnDraw函数,在该绘制函数中,使用 Windows API中标准的HDC、HPEN、HBRUSH以及SelectObject、Ellipse等结构和函数来实现绘制的。例如:
// 创建画笔和画刷并选中颜色画圆
hPen = (HPEN)GetStockObject(BLACK_PEN);
hOldPen = (HPEN)SelectObject(hdc, hPen);
hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
hBrush = CreateSolidBrush(colFore);
SelectObject(hdc, hBrush);
Ellipse (hdc, (CenterPt.x - m_radius), (CenterPt.y - m_radius), (CenterPt.x +m_radius),(CenterPt.y+ m_radius));
5) 为ActiveX控件添加事件
现在将向ATL控件中添加Click和RClick事件。如果用户在矩形区内点击,则会激发相应事件。现在要向ICircleCtlEvents接口添加Click方法,首先在“ClassView”中选中“ICircleCtlEvents”右击,选择Add Method,出现如下对话框,并按下图设置,最后点“OK”按钮就可以添加Click事件的实现方法。用同样的方法添加RClick事件,参数与Click事件一致。接下来我们要为控件实现连接点接口IConnectionPoint和连接点容器接口IConnectionPointContainer。编译好Circle.idl文件,生成对应的Circle.tlb,在“ClassView”中选中“CCircleCtl”,右击,在Popup菜单中选择“Implement Connection Point”命令,在弹出的对话框中选中“_ICircleCtlEvents”接口。在类中定义了以两个坐标为参数的Fire_Click和Fire_RClick方法,调用这两个方法就可以在控件中激发响应的事件。
- 上一篇:VC++实现显示透明的256色以上的图标
- 下一篇:BMP位图文件结构及VC操作