VC随笔ActiveX控件.doc_第1页
VC随笔ActiveX控件.doc_第2页
VC随笔ActiveX控件.doc_第3页
VC随笔ActiveX控件.doc_第4页
VC随笔ActiveX控件.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VC随笔ActiveX控件ActiveX、OLE和COM:COM(Component Object Model)即组件对象模型是用来解决Windows程序模块之间相互通信的标准方法,是Windows统一的、可扩充的、面向对象的通信协议。COM是一种协议,建立了一个软件模块同另一个软件模块之间的连接,然后将其描述出来。当这种连接建立起来后,两个软件模块之间就可以通过一个称为“接口”的机制来进行通信。OLE(Object Linking & Embedded)是指对象的链接与嵌入技术。是可嵌入的组件对象模型(COM),它是作为一个进程中的服务器的动态链接库来实线的。(可以将被使用的控件称为服务器,而使用控件的应用程序就是客户程序或者容器程序。)虽然OLE控件是通过DLL来实现的,但不仅止于此。OLE控件还是一个独立的对象,它可以激起和响应事件、处理消息,它具有唯一的属性,并且它有多线程能力。OLE控件不能独立存在,需要嵌入到容器中去。ActiveX控件是在其他应用程序中可以使用的,而且与应用程序无关的小型动态链接库,是OLE控件的子集。能够用于Internet应用程序,当然也可以运行在非Internet应用程序中。和普通的Windows控件一样,ActiveX控件也是一个子窗口,通常是对话框的子窗口。包含ActiveX控件的窗口称为包容器。(1)如果要在对话框中加入一个ActiveX控件,和加入一个普通的Windows控件一样,只要在对话框编辑器中,将ActiveX控件放在适当的位置,并在资源模板中表示该ActiveX控件即可。(2)如果要在程序中动态地建立ActiveX控件,则可以调用相应类的Create成员函数。ActiveX控件不像普通的控件那样,发送以WM_打头的通知消息给它的包容器窗口,而是“激发事件”。在一般情况下,一个或多个ActiveX控件会保存在一个动态链接库中,但这种动态链接库的文件扩展名通常为OCX,而不是DLL。包容器通过Windows注册表,利用COM技术在需要的时候动态地载入动态链接库。属性、方法和事件:ActiveX控件有三个重要的属性集:属性(Property)、方法(Method)和事件(Event)。作个简单的类比,属性好比成员变量;方法就是成员函数;而事件则允许控件向容器应用程序发送相应的消息。属性是ActiveX控件的特性或特征,用户可以访问或设置这些属性。用户可以定制属性或使用库存属性。ActiveX控件的10个库存属性:Appearance、BackColor、BorderStyle、Caption、Enabled、Font、ForeColor、hWnd、ReadyState。方法是控件访问其本身功能的函数。能够提供访问ActiveX控件的属性和数据的访问函数。方法可以是库存的也可以是定制的。库存方法可以访问库存属性(颜色、字体等),定制方法可以访问定制属性。对应属性的库存方法分为Get方法和Set方法,如shor GetAppearance()、void SetAppearance(short sApear)等。MFC提供了两个库存方法,Doclick方法和Refresh方法。使用Doclick方法可以向容器程序激起一个鼠标敲击事件,使用Refresh方法可以使容器更新控件的外观。事件是控件在响应外部作用时由控件触发的消息。控件利用事件与控件的容器应用程序进行通信。这种通信只能实现单一计算机的进程之间及进程内部的通信。通过IDispatch接口,控件可以向容器发送消息,容器也可以向控件发送消息。MFC也提供了一些库存的事件:Click、DblClick、Error、KeyDown、KeyPress、KeyUp、MouseDown、MouseMove、MouseUp。相应的驱动事件的函数为void FireClick()等。组件和控件:组件是具有特定功能的程序模块,通常是符合一定规范的类,用不同语言开发的组件可相互通信。控件可以看成是有形的组件,除属性和方法外,通常还有相应的事件。二者都是能完成一定功能的实体,区别在于控件有一定的形状,一般还有响应事件;组件一般没有形状和事件。使用ActiveX控件:1、插入ActiveX控件(1)创建使用控件的程序创建一个名为Time的基于对话框的工程,确保在第2步中勾选了ActiveX Controls复选框(系统默认设置)。修改对话框的标题为“测试ActiveX控件”。(2)添加日历控件1)单击Project|Add to Project|Components and Controls菜单项,双击Registered ActiveX Controls目录,插入Calendar Control 8.0的日历控件。2)使用默认设置。此时,在对话框编辑窗口右边的控件面板上,在最下面多了一个日历控件的图标,同时在Class View中新添加了两个类CCalendar和COleFont。3)在对话框模板上添加日历控件。在日历控件外添加一个分组框“日期”,下方添加一个只读编辑框。2、使用属性、方法和事件(1)修改控件的属性在日历控件的属性对话框中修改日历控件的背景颜色属性为“桌面”(2)添加事件处理函数ActiveX控件不像普通的控件那样,发送以WM_打头的通知消息给它的包容器窗口,而是“激发事件”。但是它们的处理方式却是相似的,都可以使用ClassWizard来为事件(或者消息)添加处理函数。打开ClassWizard对话框,单击Message Maps选项卡,在Class name中选择对话框类CTimeDlg,在object IDs列表中选择日历控件IDC_CALENDAR1,双击Click(单击)事件,添加处理函数OnClickCalendar1。注意:不是“消息处理函数”(3)使用控件方法当日历控件被单击时,将调用控件的方法GetYear、GetMonth、GetDay获取当前的年份、月份以及日期。然后将获得的日期输出到只读编辑框中。1)为日历控件和编辑框添加对应的成员变量。使用ClassWizard为日历控件添加一个CCalendar类型的控件成员m_Calendar;为编辑框添加一个CString类型的数据成员m_sDate。2)修改CTimeDlg类中的OnClickCalendar1函数如下:void CTimeDlg:OnClickCalendar1() / TODO: Add your control notification handler code here/使用日历控件的方法获取日期int year = m_Calendar.GetYear();int month = m_Calendar.GetMonth();int day = m_Calendar.GetDay();/将获得的日期写入于编辑框对应的成员变量中m_sDate.Format(%4d年%2d月%2d日, year, month, day);/将日期显示在编辑框中UpdateData(FALSE);3)此时,当对话框刚显示出来时,编辑框中没有显示任何文本(因为对应变量的初始值为空)。可以在CTimeDlg的OnInitDialog函数中添加类似的代码,使编辑框初始便显示日期。同时对日历控件的显示进行初始化。OnInitDialog函数的部分代码如下:BOOL CTimeDlg:OnInitDialog()CDialog:OnInitDialog();./ TODO: Add extra initialization hereCTime time;time = CTime:GetCurrentTime();/获取系统时间/初始化日历控件的显示m_Calendar.SetYear(time.GetYear();m_Calendar.SetMonth(time.GetMonth();m_Calendar.SetDay(time.GetDay();/初始化编辑控件成员变量的数值m_sDate.Format(%4d年%2d月%2d日, time.GetYear(),time.GetMonth(), time.GetDay();/将日期显示在编辑框中UpdateData(FALSE);return TRUE; / return TRUE unless you set the focus to a control编写ActiveX控件:编写控件可以分为两种:(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 controls 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; iEllipse(x-3, y-3, x+3, y+3);/大刻度elsepdc-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 hereSetTimer(1,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论