可视化编程讲义06_第1页
可视化编程讲义06_第2页
可视化编程讲义06_第3页
可视化编程讲义06_第4页
可视化编程讲义06_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

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

文档简介

1、第6章 ActiveX与OLE部件库的基本概念ActiveX的概念ActiveX控件的使用OLE的基本概念OLEOLE服务器1部件库的内容VC+提供部件:弥补AppWizard中没有或不便提供的功能例如,对话框条、状态条、属性页、密码ActiveX控件:现成的ActiveX控件用户自定义部件:以类为单位保存的部件,供其它的程序重用2对话框条的使用DialogBar将对话框作成工具条形式Project-Add To Project-Visual C+ Component,从列表中选择DialogBar从Resource View中修改DialogBar3状态条的使用Status bar是窗口底端

2、的说明部分,如果要显示日期和时间,可使用部件库中的状态条Project-Add To Project-Visual C+ Component,从列表中选择Status bar,并选定日期和时间从Resource View中修改Status bar4属性页与Wizard(1)属性页是几个对话框的集合,用户可以显示任意对话框,并进行相应的操作Wizard是几个对话框的集合,但不是同时显示这些对话框,而是按顺序逐个显示5属性页与Wizard(2)Project-Add To Project-Visual C+ Component,从列表中选择Property Sheet建立菜单项ID_PAGE_PR

3、OPERTY在菜单ID_PAGE_PROPERTY上添加函数CMyPropertySheet Sheet;Sheet.DoModal();6属性页与Wizard(3)Project-Add To Project-Visual C+ Component,从列表中选择Property Sheet建立菜单项ID_PAGE_WIZARD在菜单ID_PAGE_WIZARD上添加函数7属性页与Wizard(4)8ActiveX的概念(1)ActiveX:对象链接与嵌入(OLE)的扩展ActiveX文档ActiveX文档是OLE文档扩展,包括4种COM接口:IOleDocument、IOleDocument

4、View、IOleCommandTarget与IPrintActiveX文档可以包含多个页ActiveX文档显示在浏览器(例如IE)或其它容器(Binder)9ActiveX的概念(2)ActiveX控件ActiveX控件是OLE控件的扩展,不仅可以嵌入网页,还可用于非网络应用程序DCOMDCOM是COM在网络中的扩展,以在网络中使用与交换对象Internet MonikersInternet Monikers是一种资源对象,例如URL Monikers与异步Monikers10ActiveX的概念(3)ActiveX超链接在HTML文件中激活非HTML文件,例如Word、Excel与Powe

5、rPoint等ActiveX服务器扩展实际上是ISAPI,增强服务器功能。ISAPI只能通过CGI实现,它可以通过DLL实现ActiveX脚本将OLE自动化引入Internet,可使用的脚本包括:VBScript与JavaScript11ActiveX控件(1)ActiveX控件是程序封装的、可重用的控件ActiveX容器使用接口与ActiveX控件交流ActiveX控件使用标准接口,不局限于某种特定的程序语言,很多开发工具都可以使用12ActiveX控件(2)ActiveX控件与它的容器通信,控件容器使用ActiveX接口13ActiveX控件(3)ActiveX事件(event):控件发送

6、给包含控件的应用程序的消息ActiveX属性(property):与控件相关的一些属性,例如颜色或按钮高度ActiveX方法(method):由控件提供的、控件容器调用的函数14添加ActiveX控件(1)Project-Add to Project-Components and Controls-Registered ActiveX Controls用户可像使用其它控件一样,开始使用新添加的ActiveX控件15添加ActiveX控件(2)16ActiveX控件的建立过程建立ActiveX控件增加控件属性与属性页增加控件事件增加控件方法注册ActiveX控件使用ActiveX控件17Acti

7、veX控件的建立(1)建立ActiveX控件工程ActiveX控件是以.OCX为后缀用户创建控件与系统提供控件一样通过AppWizard工具,用户可以建立项目文件,自动生成ActiveX控件代码框架,在此基础上实现ActiveX控件18ActiveX控件的建立(2)19ActiveX控件的建立(3)_DClock与_DClockEvents是控件的接口CClockApp是COleControlModule的派生类20ActiveX控件的建立(4)CClockCtrl是COleControl派生类CClockPropPage是COlePropertyPage派生类21ActiveX控件的测试(1

8、)ActiveX Control Test ContainerWeb Browser22ActiveX控件的测试(2)在容器中添加ActiveX控件23ActiveX控件的测试(3)在CClockCtrl:OnDraw()中在CClockCtrl:OnCreate()中SetTimer(1,1000,NULL);在CClockCtrl:OnTimer()中Invalidate();CTime time=CTime:GetCurrentTime();CString str=time.Format(%H:%M:%S);pDC-TextOut(0,0,str);24ActiveX控件的测试(4)25

9、ActiveX控件属性(1)在ClassWizard中选择Automation26ActiveX控件属性(2)增加BackColor和ForeColor标准属性在CClockCtrl:OnDraw()中CBrush bkBrush(TranslateColor (GetBackColor();pdc-FillRect(rcBounds,&bkBrush);pdc-SetBkMode(TRANSPARENT);pdc-SetTextColor(TranslateColor (GetForeColor();27ActiveX控件属性(3)AppWizard生成ActiveX程序时,自动生成属性页(

10、General与Extended)通过增加属性页ID增加页面,系统提供一些标准页面,例如调色板(CLSID_CColorPropPage)BEGIN_PROPPAGEIDS(CClockCtrl,1) PROPPAGEID(CClockPropPage:guid)END_PROPPAGEIDS(CClockCtrl)28ActiveX控件属性(4)增加标准属性页BEGIN_PROPPAGEIDS(CClockCtrl,2) PROPPAGEID(CClockPropPage:guid) PROPPAGEID(CLSID_CColorPropPage)END_PROPPAGEIDS(CClock

11、Ctrl)29ActiveX控件属性(5)增加定制属性在ClassWizard中选择Automation选择Add Property按钮选择Member Variable填写属性的名称、类型、变量和通知函数30ActiveX控件属性(6)增加Interval定制属性,每隔m_Interval更新在CClockCtrl:OnCreate()中 SetTimer(1,m_interval,NULL);在CClockCtrl:OnIntervalChanged()中if(m_intervalUpdateAllViews(NULL);m_rect=rectPos;GetDocument()-SetMo

12、difiedFlag();if(ar.IsStoring() arm_rect;54OLE容器(6)命中测试函数CMy222CntrItem* CMy222View:HitTestItems(CPoint point) CMy222Doc* pDoc=GetDocument(); CMy222CntrItem* pHitItem=NULL; CMy222CntrItem* pItem; POSITION pos=pDoc-GetStartPosition(); while(pos!=NULL) pItem=(CMy222CntrItem *)pDoc-GetNextItem(pos); if(

13、pItem-m_rect.PtInRect(point) pHitItem=pItem; return pHitItem;55OLE容器(7)选择函数void CMy222View:SetSelection(CMy222CntrItem* pItem) if(pItem=NULL|m_pSelection!=pItem) COleClientItem* pActiveItem=GetDocument()- GetInPlaceActiveItem(this); if(pActiveItem!=NULL&pActiveItem!=pItem) pActiveItem-Close(); Inval

14、idate(); m_pSelection=pItem;56OLE容器(8)鼠标单击选中OLE项-OnLButtonDown()CMy222CntrItem* pHitItem=HitTestItems(point);SetSelection(pHitItem);if(pHitItem!=NULL) CRectTracker tracker; SetTracker(pHitItem,&tracker); UpdateWindow(); if(tracker.Track(this,point) Invalidate(); pHitItem-m_rect=tracker.m_rect; GetDo

15、cument()-SetModifiedFlag(); 57OLE容器(9)设置跟踪函数void CMy222View:SetTracker(CMy222CntrItem *pItem, CRectTracker *pTracker) pTracker-m_rect=pItem-m_rect; if(pItem=m_pSelection) pTracker-m_nStyle|=CRectTracker:resizeInside; if(pItem-GetType()=OT_LINK) pTracker-m_nStyle|=CRectTracker:dottedLine; else pTrack

16、er-m_nStyle|=CRectTracker:solidLine; if(pItem-GetItemState()=COleClientItem: openState|pItem-GetItemState()=COleClientItem: activeUIState) pTracker-m_nStyle|=CRectTracker:hatchInside; 58OLE容器(10)鼠标双击打开OLE项-OnLButtonDblClk()改变鼠标形状-OnSetCursor()if(m_pSelection!=NULL) m_pSelection-DoVerb(GetKeyState(VK

17、_CONTROL) GetStartPosition();CMy222CntrItem * pItem;while (pos!=NULL) pItem=(CMy222CntrItem *)pDoc-GetNextItem(pos); pItem-Draw(pDC,pItem-m_rect); CRectTracker tracker; SetTracker(pItem,&tracker); tracker.Draw(pDC);60OLE容器(12)添加删除功能-ID_EDIT_DELvoid CMy222View:OnEditDel() if(m_pSelection!=NULL) m_pSe

18、lection-Delete(); m_pSelection=NULL; GetDocument()-UpdateAllViews(NULL); void CMy222View:OnUpdateEditDel(CCmdUI* pCmdUI) pCmdUI-Enable(m_pSelection!=NULL);61OLE容器(13)OLE容器的例子62OLE服务器(1)小型服务器(mini-server):不能独立运行,只能通过容器启动全服务器(full-server):既可以作为独立的程序运行,又可以由容器启动,可以同时支持多个容器自动化服务器(automation-server):使程序可以

19、操纵另一个程序创建的对象63OLE服务器(2)全服务器的例子CFullApp类:生成用于注册的OLE标识符,初始化OLE库与打开模板,检查是否作为服务启动CFullDoc类:当容器启动服务器、创建链接项时,构造复合文档并返回CFullSrvItemCInPlaceFrame类:服务器的边框窗口CFullView类:服务器的视图CFullSrvItem类:服务器的OLE接口64OLE服务器(3)65自动化服务器(1)通过AppWizard生成程序,第3步选中None与AutomationAfxOleInit初始化OLE库COleTemplateServer:ConnectTemplate关联模板

20、与COleTemplateServerCOleTemplateServer:RegisterAll对象描述文件AutoServer.odl,包含自动化对象、属性与方法66自动化服务器(2)在CAutoServerDoc中增加变量在CAutoServerDoc构造函数中在CAutoServerDoc:Serialize()中if(ar.IsStoring() arm_pointm_pointm_string; CString m_string; CPoint m_point;m_point=CPoint(50,50);m_string=_T(自动化);67自动化服务器(3)在CAutoServe

21、rView:OnDraw()中在CAutoServerDoc中添加Refresh()中pDC-TextOut(pDoc-m_point.x,pDoc- m_point.y,pDoc-m_string);UpdateAllViews(NULL);SetModifiedFlag();68自动化服务器(4)添加自动化属性:直接与间接方式使用Get/Set方法间接添加m_pointGetX():return (short)m_point.x;SetX():m_point.x=nNewValue; Refresh();直接添加m_stringExternal Name:textOnTextChanged

22、():Refresh();手工去除重复m_string69自动化服务器(5)添加自动化方法RefreshWindow:与Refresh相同,根据m_point与m_string的值更新视图SetProps:设置m_point与m_string,并更新视图ShowWindow:显示自动化服务器边框窗口,自动化服务器被自动化客户激活,默认不显示边框窗口70自动化服务器(6)SetProps方法void CAutoServerDoc:SetProps(short x, short y, LPCTSTR text) m_point.x=x; m_point.y=y; m_string=text; Re

23、fresh();71自动化服务器(7)ShowWindows方法void CAutoServerDoc:ShowWindows() POSITION pos=GetFirstViewPosition(); CView* pView=GetNextView(pos); if(pView!=NULL) CFrameWnd* pWnd=pView-GetParentFrame(); pWnd-ActivateFrame(SW_SHOW); pWnd=pWnd-GetParentFrame(); if(pWnd!=NULL) pWnd-ActivateFrame(SW_SHOW); 72自动化服务器(8)自动化服务器的例子73自动化客户(1)创建自动化客户的过程创建一个自动化客户(Automation)创建COleDispatchDriver派生类添加自动化对象变量(IAutoServer m_autoServer)修改对话框模板为对话框中的控件定义

温馨提示

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

评论

0/150

提交评论