编写ActiveX控件

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情


              (1)一是从MFC提供的控件类派生一个新类,通过合理地设计派生类,可以修改控件的行为和属性以达到用户的要求,但此类控件使用范围很小。

               (2)二是编写一个ActiveX控件,以后可以在不同的应用程序中重复使用。

             1、创建ActiveX控件框架:

                 (1)创建ActiveX控件工程

                        使用MFC ActiveX ControlWizard创建一个名为MyTime的ActiveX控件工程,使用默认设置。

                (2)MyTime控件的文件构成

                         查看MyTime工程的Class View页面,其中:

                        _DMyTime:一个dispinterface类型的结构,用来包含控件的属性和方法。

                       _DMyTimeEvents:也是一个dispinterface类型的结构,用来包含控件的事件。

                       CMyTimeApp:此类派生自COleControlModule,用于初始化控件。可以在该类的InitInstance函数中添加相应的初始化代码;在ExitInstance函数中添加清除代码。

                       CMyTimeCtrl:此类派生自COleControl类,主要处理控件的显示以及对消息的响应等,后面的大部分工作就是对这个类进行编程。

                       CMyTimePropPage:此类派生自COlePropertyPage类,这个类描述了控件属性对话框中的名为Control的选项卡。

                      全局对象DllRegisterServer函数用于注册控件,DllUnregisterServer用于移出注册。

            注意:使用ControlWizard产生的ActiveX控件都派生自COleControl类。

                (3)测试ActiveX控件

                       单击Tools|ActiveX Control Test Container菜单项,使用Visual C++6.0提供的ActiveX控件测试工具来测试MyTime控件。单击测试工具程序的Edit|Insert New Control菜单项,在Insert Control对话框中选择MyTime Control控件。

                  2、修改ActiveX控件的显示:

                        首先获取系统当前时间,然后将时间转换成文本在控件中输出。同时,还必须根据时、分、秒的数值将时钟画出来。

                      (1)显示时钟

                            1)修改CMyTimeCtrl类的构造函数CMyTimeCtrl如下:

                              CMyTimeCtrl::CMyTimeCtrl()
                             {
                                InitializeIIDs(&IID_DMyTime, &IID_DMyTimeEvents);

                                // TODO: Initialize your control's instance data here.
                                SetInitialSize(200, 230); //设置控件初始尺寸大小
                              }

                           2)修改CMyTimeCtrl类的OnDraw函数如下:

void CMyTimeCtrl::OnDraw(CDC* pdc, const CRect& rcBounds,const CRect&  rcInvalid)
{

 // TODO: Replace the following code with your own drawing code.
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
// pdc->Ellipse(rcBounds);
pdc->SetBkMode(TRANSPARENT); //设置背景透明

CTime time;
time = CTime::GetCurrentTime(); //获取系统时间

double pi = 3.14159265; //圆周率
int cx = rcBounds.left + 100; //时钟的中心位置x坐标
int cy = rcBounds.top + 100; //时钟的中心位置y坐标

//使用循环画出时钟盘面
for(int i=0; i<60; i++)
{
int x = cx + 80*cos(i*pi/30) +0.5;
int y = cy + 80*sin(i*pi/30) +0.5;

if(i%5 == 0) pdc->Ellipse(x-3, y-3, x+3, y+3); //大刻度
else pdc->Ellipse(x-1, y-1, x+1, y+1); //小刻度
}

CString str = time.Format("%H:%M:%S"); //将时间写入字符串

//输出字符串,在时钟下面以数字方式显示时间
pdc->TextOut(rcBounds.left+70, rcBounds.top+200, str);

///////////////////////////////////////////////////////////////////
// 下面将使用三种不同粗细的画笔来画出时钟的时针、分针和秒针
///////////////////////////////////////////////////////////////////
CPen pen1(PS_SOLID, 4, RGB(0,0,0)); //时针画笔
CPen pen2(PS_SOLID, 2, RGB(0,0,0)); //分针画笔
CPen pen3(PS_SOLID, 1, RGB(0,0,0)); //秒针画笔

//根据当前时间计算时针的终点位置(x1,y1)
int x1 = cx + 40*cos((time.GetHour()-3)*pi/6 +
(time.GetMinute()/12)*pi/30) + 0.5;
int y1 = cx + 40*sin((time.GetHour()-3)*pi/6 +
(time.GetMinute()/12)*pi/30) + 0.5;
//根据当前时间计算分针的终点位置(x2,y2)
int x2 = cx + 60*cos((time.GetMinute()-15)*pi/30) + 0.5;
int y2 = cx + 60*sin((time.GetMinute()-15)*pi/30) + 0.5;
//根据当前时间计算秒针的终点位置(x3,y3)
int x3 = cx + 70*cos((time.GetSecond()-15)*pi/30) + 0.5;
int y3 = cx + 70*sin((time.GetSecond()-15)*pi/30) + 0.5;

CPen * pOldPen = pdc->SelectObject(&pen1);
pdc->MoveTo(cx, cy); //画出时针
pdc->LineTo(x1, y1);

pdc->SelectObject(&pen2);
pdc->MoveTo(cx, cy); //画出分针
pdc->LineTo(x2, y2);

pdc->SelectObject(&pen3);
pdc->MoveTo(cx, cy); //画出秒针
pdc->LineTo(x3, y3);

pdc->SelectObject(pOldPen); //落选画笔
}

                      3)由于使用了数学函数sin和cos,因此在MyTimeCtl.cpp文件中包含math.h:

                             #include "math.h"

                   (2)增加计时器

                           接下来,要让时钟能够动起来。类似在状态栏上显示时间一样,将要为MyTime添加WM_TIMER消息处理,并设置定时器。

                           1)使用ClassWizard为CMyTimeCtrl类添加三个消息处理,WM_CREATE消息处理函数Oncreate,WM_TIMER消息处理函数OnTimer,WM_CLOSE消息处理函数OnClose。

                          2)修改OnCreate函数如下:

int CMyTimeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
SetTimer(1, 1000, NULL); //设置计时器
return 0;
}

                        3)修改OnTimer函数如下:

void CMyTimeCtrl::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
InvalidateControl(); //重画控件,相当于调用OnDraw函数
COleControl::OnTimer(nIDEvent);
}

                        4)修改OnClose函数如下:

void CMyTimeCtrl::OnClose() 
{
// TODO: Add your message handler code here and/or call default
KillTimer(1); //释放计时器
CWnd::OnClose();
}

                (3)修改控件示意图标

                       打开MyTime控件工程的资源,修改名为IDB_MYTIME的位图资源。

                      编译MyTime控件工程,将MyTime控件插入到Time工程。修改Time工程的IDD_TIME_DIALOG对话框模板,插入一个MyTime控件和一个分组框。

注意:(1)此时,查看MyTime控件的属性,会发现Control和All属性对话框都是空白的,因为此时还没有为MyTime控件添加任何属性。

           (2)此时,如果使用ClassWizard查看MyTime控件所能产生的事件时,会发现是空的,因为此时还没有为控件添加事件。

      3、添加属性:

      4、使用库存属性的对应方法:

      5、添加属性页:

      6、添加事件:

步骤总结:

1、使用MFC ActiveX Control Wizard创建控件工程框架

2、定制控件的界面和图标

3、为控件添加属性、事件和方法并进行相应的处理

全面掌握ActiveX控件的创建及应用实战 ActiveX控件是基于Microsoft COM(Component Object Model)技术的一组控件,旨在允许开发者在不同的编程语言和平台上共享组件。这些控件可以用于网页或应用程序,实现多媒体内容展示、数据处理、交互功能等。它们通过嵌入到网页中,使网页不再只是静态展示,而是能够提供更加丰富和动态的用户体验。COM(Component Object Model)接口是微软提出的一种跨语言、跨平台的软件组件架构标准。 阅读详情

相关推荐

ActiveX控件编写和使用

运用ActiveX控件技术进行程序的编写和使用

自己编写一个简单的ActiveX控件——详尽教程

最近开始学ActiveX控件编程,上手不太容易,上网想找相关教程也没合适的,最后还是在师哥的指导下完成了第一个简单控件的开发,现在把开发过程贴出来与大家分享一下~ (环境说明——平台:vs2005;语言:VC++;基于对话框)   ①新建工程: 首先以管理员身份运行vs2005,文件->新建->项目,选择Visual C++下MFC,模板选MFC ActiveX控件,自定义工程名(我的为M

3020

快速学会ActiveX控件开发

ActiveX 是一个打开集成平台提供用于开发Internet和Intranet程序集成和内容。

创建自己的ActiveX控件(vb)

          在“文件”选单中选择“新建工程”,然后双击“ActiveX控件”图标,生成一个控件工程项目(缺省名UserControl1)。此时设计窗口显示一个类似于窗体的界面(无边框),其属性窗口也类似于窗体的属性窗口,只是有很多熟悉的属性没有了,且还有一些一般窗体不具有的属性。选取“工程选单”最下面的“UserControl1属性”项,在出现的对话框中改工程名称为“TimeCtr”。在属

hexinchun148的专栏 1830

手把手教你学编ActiveX控件

  手把手教你学编ActiveX控件   杨山河   学习VB的人对ActiveX控件一定不会陌生,多数情况下使用VB编程的过程实际上就是利用控件的各种属性、方法响应事件的过程。控件是象微软这样的软件商在发售给用户之前编写的软件组件,利用这些软件商早已编好的功能,实现我们的各种要求。VB本身提供的控件能够帮助我们完成大多数的应用,但有时总有软件商们未想到的需求, “自己动手,丰衣足食”,此时我们可

shanhe的专栏 3323

【小沐学C++】ActiveX控件的MFC实现(VS2017,OpenGL)

文章目录1、简介2、代码编写3、注册控件4、结果运行后记 1、简介 ActiveX 控件是允许网站提供视频和游戏等内容的小应用。 浏览 Web 时,你也可以使用这些小应用与工具栏和股票代码等内容进行交互。 但是,这些应用有时可能出现问题,或者向你提供不需要的内容。 在某些情况下,这些应用可以用来从你的电脑收集信息、破坏电脑上的信息、在未获得你同意的情况下在你的电脑上安装软件或允许其他人远程控制你的电脑。 2、代码编写 打开VS2017,新建一个MFC ActiveX控件工程,如下图所示: (1)FxA

爱看书的小沐 2232

用C#编写ActiveX控件

选自“红马天下”的Blog,做了适当修改将上下两章合并(http://www.cnblogs.com/homer/) 前些日子做一个Web项目,必须自己编写一个ActiveX控件。如今的ActiveX控件大多是使用VB/C++来开发的,而我对他们并不熟悉,因此考虑使用熟悉的C#编写ActiveX控件。     首先,建立一个WinForm控件项目HelloWorld,并拖入一个Label控件,文字

qpl007(蓝色闪电)的专栏 1686

编写 ATL ActiveX 控件

一直想写一些ATL、ActiveX的东西,但是一直都没有下定决心去写,一来是自己对这方面的东西不太了解,写不出什么名堂;二来就是懒,懒得思考,懒得动手。这篇文章只是记录一下ATL ActiveX控件的一个大概写法跟使用方法,方便有这方面需求的同学快速上手。

reaL's Blog 1731

用C#编写ActiveX控件(一)

出现这个结果是微软的默认设置造成的,作者必须在控件所在的控件的 AssemblyInfo.cs/vb 中执行一个安全声明,声明这个控件必须使用赋予的权限,才可以显示出界面。这个控件到现在为止,还只是能够实现自身的显示,并且不能实现更多的功能,比如实现与脚本的交互或者操作客户端的注册表或者磁盘。如果我们希望这个控件突破.Net Framework安全模型的限制,实现与脚本的交互或者操作客户端的注册表或者磁盘的话,必须要让它成为真正的ActiveX控件。下面,我们把刚才的控件变成真正的ActiveX控件

biyusr的专栏 1124

ActiveX控件 编写及使用例程

C++开发的OCX控件,你可以在其它语言里面都能调用,这样很好的实现了功能化组件的良好循环使用,而且还可以实现跨语言地调用(例如,你完全可以用C#调用C++开发的OCX控件)。本文详细介绍了ActiveX控件的创建,注册,使用。并提供了很好的例子,幅图详细,是学习ActiveX控件很好的资料。

用C#编写ActiveX控件!!!

By: Imran Nathani 翻译:veryhappy(wx.net) ActiveX控件支持自定义程序接口。利用这种方法,外部可以访问控件的事件和属性,Web开发者可以自动操作他们的Web页面,等同于一般的桌面应用的功能。 介绍 作为一个Web应用程序开发者我们想提供给我们的用户具有更强功能的应用程序。我们想为用户通过脚本提供像打印流,本地Socket程序,本地线...

117

关于《用C#编写ActiveX控件》的几点说明

关于《用C#编写ActiveX控件》的几点说明    在我的第一篇blog发表之后,得到大家的支持,我的工作得到了认可,感到很开心。当然,很多朋友也提出了很多出色的见地。我想在这里说明一下我对这些问题的理解。         我所完成的控件是一个用来获取客户端摄像头图片并保存在特殊文件夹里,然后上传到服务器的ActiveX控件。给大家一个截图。 显示图片的就是那个控件。     之所以当初想到用

daishengs的专栏 1348
上一篇: 嵌入式操作系统VxWorks下PPPoE的实现
下一篇: iptables命令详解(链接)
dsg333
博客等级 码龄18年 34粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值