《可视化编程课件_06.ppt》由会员分享,可在线阅读,更多相关《可视化编程课件_06.ppt(81页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第6章 ActiveX与OLEn部件库的基本概念nActiveX的概念nActiveX控件的使用nOLE的基本概念nOLE容器与OLE服务器1部件库的内容nVC+提供部件:弥补AppWizard中没有或不便提供的功能例如,对话框条、状态条、属性页、密码nActiveX控件:现成的ActiveX控件n用户自定义部件:以类为单位保存的部件,供其它的程序重用2对话框条的使用nDialogBar将对话框作成工具条形式nProject-Add To Project-Visual C+Component,从列表中选择DialogBarn从Resource View中修改DialogBar3状态条的使用nS
2、tatus bar是窗口底端的说明部分,如果要显示日期和时间,可使用部件库中的状态条nProject-Add To Project-Visual C+Component,从列表中选择Status bar,并选定日期和时间n从Resource View中修改Status bar4属性页与Wizard(1)n属性页是几个对话框的集合,用户可以显示任意对话框,并进行相应的操作nWizard是几个对话框的集合,但不是同时显示这些对话框,而是按顺序逐个显示5属性页与Wizard(2)nProject-Add To Project-Visual C+Component,从列表中选择Property She
3、etn建立菜单项ID_PAGE_PROPERTYn在菜单ID_PAGE_PROPERTY上添加函数CMyPropertySheetCMyPropertySheet Sheet;Sheet;Sheet.DoModalSheet.DoModal();();6属性页与Wizard(3)nProject-Add To Project-Visual C+Component,从列表中选择Property Sheetn建立菜单项ID_PAGE_WIZARDn在菜单ID_PAGE_WIZARD上添加函数7属性页与Wizard(4)8ActiveX的概念(1)nActiveX:对象链接与嵌入(OLE)的扩展nA
4、ctiveX文档ActiveX文档是OLE文档扩展,包括4种COM接口:IOleDocument、IOleDocumentView、IOleCommandTarget与IPrintActiveX文档可以包含多个页ActiveX文档显示在浏览器(例如IE)或其它容器(Binder)9ActiveX的概念(2)nActiveX控件ActiveX控件是OLE控件的扩展,不仅可以嵌入网页,还可用于非网络应用程序nDCOMDCOM是COM在网络中的扩展,以在网络中使用与交换对象nInternet MonikersInternet Monikers是一种资源对象,例如URL Monikers与异步Moni
5、kers10ActiveX的概念(3)nActiveX超链接在HTML文件中激活非HTML文件,例如Word、Excel与PowerPoint等nActiveX服务器扩展实际上是ISAPI,增强服务器功能。ISAPI只能通过CGI实现,它可以通过DLL实现nActiveX脚本将OLE自动化引入Internet,可使用的脚本包括:VBScript与JavaScript11ActiveX控件(1)nActiveX控件是程序封装的、可重用的控件nActiveX容器使用接口与ActiveX控件交流nActiveX控件使用标准接口,不局限于某种特定的程序语言,很多开发工具都可以使用12ActiveX控件
6、(2)nActiveX控件与它的容器通信,控件容器使用ActiveX接口13ActiveX控件(3)nActiveX事件(event):控件发送给包含控件的应用程序的消息nActiveX属性(property):与控件相关的一些属性,例如颜色或按钮高度nActiveX方法(method):由控件提供的、控件容器调用的函数14添加ActiveX控件(1)nProject-Add to Project-Components and Controls-Registered ActiveX Controlsn用户可像使用其它控件一样,开始使用新添加的ActiveX控件15添加ActiveX控件(2)1
7、6ActiveX控件的建立过程n建立ActiveX控件n增加控件属性与属性页n增加控件事件n增加控件方法n注册ActiveX控件n使用ActiveX控件17ActiveX控件的建立(1)n建立ActiveX控件工程ActiveX控件是以.OCX为后缀用户创建控件与系统提供控件一样通过AppWizard工具,用户可以建立项目文件,自动生成ActiveX控件代码框架,在此基础上实现ActiveX控件18ActiveX控件的建立(2)19ActiveX控件的建立(3)n_DClock与_DClockEvents是控件的接口nCClockApp是COleControlModule的派生类20Activ
8、eX控件的建立(4)nCClockCtrl是COleControl派生类nCClockPropPage是COlePropertyPage派生类21ActiveX控件的测试(1)nActiveX Control Test ContainernWeb Browser22ActiveX控件的测试(2)n在容器中添加ActiveX控件23ActiveX控件的测试(3)n在CClockCtrl:OnDraw()中n在CClockCtrl:OnCreate()中SetTimer(1,1000,NULL);SetTimer(1,1000,NULL);n在CClockCtrl:OnTimer()中Invali
9、date();Invalidate();CTimeCTime time=time=CTime:GetCurrentTimeCTime:GetCurrentTime();();CStringCString strstr=time.Format(time.Format(%H:%M:%S%H:%M:%S););pDCpDC-TextOut(0,0,str);-TextOut(0,0,str);24ActiveX控件的测试(4)25ActiveX控件属性(1)n在ClassWizard中选择Automation26ActiveX控件属性(2)n增加BackColor和ForeColor标准属性n在CC
10、lockCtrl:OnDraw()中CBrushCBrush bkBrush(TranslateColorbkBrush(TranslateColor (GetBackColorGetBackColor();();pdcpdc-FillRect(rcBounds,&bkBrushFillRect(rcBounds,&bkBrush););pdcpdc-SetBkMode(TRANSPARENTSetBkMode(TRANSPARENT););pdcpdc-SetTextColor(TranslateColorSetTextColor(TranslateColor (GetForeColorGe
11、tForeColor();();27ActiveX控件属性(3)nAppWizard生成ActiveX程序时,自动生成属性页(General与Extended)n通过增加属性页ID增加页面,系统提供一些标准页面,例如调色板(CLSID_CColorPropPage)BEGIN_PROPPAGEIDS(CClockCtrl,1)BEGIN_PROPPAGEIDS(CClockCtrl,1)PROPPAGEID(CClockPropPage:guidPROPPAGEID(CClockPropPage:guid)END_PROPPAGEIDS(CClockCtrlEND_PROPPAGEIDS(CC
12、lockCtrl)28ActiveX控件属性(4)n增加标准属性页BEGIN_PROPPAGEIDS(CClockCtrl,2)BEGIN_PROPPAGEIDS(CClockCtrl,2)PROPPAGEID(CClockPropPage:guidPROPPAGEID(CClockPropPage:guid)PROPPAGEID(CLSID_CColorPropPagePROPPAGEID(CLSID_CColorPropPage)END_PROPPAGEIDS(CClockCtrlEND_PROPPAGEIDS(CClockCtrl)29ActiveX控件属性(5)n增加定制属性在Clas
13、sWizard中选择Automation选择Add Property按钮选择Member Variable填写属性的名称、类型、变量和通知函数30ActiveX控件属性(6)n增加Interval定制属性,每隔m_Interval更新n在CClockCtrl:OnCreate()中 SetTimer(1,m_interval,NULL);SetTimer(1,m_interval,NULL);n在CClockCtrl:OnIntervalChanged()中if(m_intervalif(m_interval0)()-UpdateAllViews(NULLUpdateAllViews(NULL
14、););m_rectm_rect=rectPosrectPos;GetDocumentGetDocument()-()-SetModifiedFlagSetModifiedFlag();();if(ar.IsStoringif(ar.IsStoring()()ararm_rectm_rect;54OLE容器(6)n命中测试函数CMy222CntrItem*CMy222View:HitTestItems(CPoint point)CMy222CntrItem*CMy222View:HitTestItems(CPoint point)CMy222Doc*CMy222Doc*pDocpDoc=Get
15、DocumentGetDocument();();CMy222CntrItem*CMy222CntrItem*pHitItempHitItem=NULL;=NULL;CMy222CntrItem*CMy222CntrItem*pItempItem;POSITION pos=POSITION pos=pDocpDoc-GetStartPositionGetStartPosition();();while(poswhile(pos!=NULL)!=NULL)pItempItem=(CMy222CntrItem*)=(CMy222CntrItem*)pDocpDoc-GetNextItem(posG
16、etNextItem(pos););if(pItemif(pItem-m_rect.PtInRect(pointm_rect.PtInRect(point)pHitItempHitItem=pItempItem;return return pHitItempHitItem;55OLE容器(7)n选择函数void CMy222View:SetSelection(CMy222CntrItem*void CMy222View:SetSelection(CMy222CntrItem*pItempItem)if(pItemif(pItem=NULL|m_pSelectionNULL|m_pSelecti
17、on!=!=pItempItem)COleClientItemCOleClientItem*pActiveItempActiveItem=GetDocumentGetDocument()-()-GetInPlaceActiveItem(thisGetInPlaceActiveItem(this););if(pActiveItemif(pActiveItem!=!=NULL&pActiveItemNULL&pActiveItem!=!=pItempItem)pActiveItempActiveItem-Close();-Close();Invalidate();Invalidate();m_pS
18、electionm_pSelection=pItempItem;56OLE容器(8)n鼠标单击选中OLE项-OnLButtonDown()CMy222CntrItem*CMy222CntrItem*pHitItempHitItem=HitTestItems(pointHitTestItems(point););SetSelection(pHitItemSetSelection(pHitItem););if(pHitItemif(pHitItem!=NULL)!=NULL)CRectTrackerCRectTracker tracker;tracker;SetTracker(pHitItem,&
19、trackerSetTracker(pHitItem,&tracker););UpdateWindowUpdateWindow();();if(tracker.Track(this,pointif(tracker.Track(this,point)Invalidate();Invalidate();pHitItempHitItem-m_rectm_rect=tracker.m_recttracker.m_rect;GetDocumentGetDocument()-()-SetModifiedFlagSetModifiedFlag();();57OLE容器(9)n设置跟踪函数void CMy22
20、2View:SetTracker(CMy222CntrItem*void CMy222View:SetTracker(CMy222CntrItem*pItempItem,CRectTrackerCRectTracker*pTrackerpTracker)pTrackerpTracker-m_rectm_rect=pItempItem-m_rectm_rect;if(pItemif(pItem=m_pSelectionm_pSelection)pTrackerpTracker-m_nStylem_nStyle|=|=CRectTracker:resizeInsideCRectTracker:re
21、sizeInside;if(pItemif(pItem-GetTypeGetType()=OT_LINK)()=OT_LINK)pTrackerpTracker-m_nStylem_nStyle|=|=CRectTracker:dottedLineCRectTracker:dottedLine;else else pTrackerpTracker-m_nStylem_nStyle|=|=CRectTracker:solidLineCRectTracker:solidLine;if(pItemif(pItem-GetItemStateGetItemState()=()=COleClientIte
22、mCOleClientItem:openState|pItemopenState|pItem-GetItemStateGetItemState()=()=COleClientItemCOleClientItem:activeUIStateactiveUIState)pTrackerpTracker-m_nStylem_nStyle|=|=CRectTracker:hatchInsideCRectTracker:hatchInside;58OLE容器(10)n鼠标双击打开OLE项-OnLButtonDblClk()n改变鼠标形状-OnSetCursor()if(m_pSelectionif(m_
23、pSelection!=NULL)!=NULL)m_pSelectionm_pSelection-DoVerb(GetKeyState(VK_CONTROLDoVerb(GetKeyState(VK_CONTROL)0?OLEIVERB_OPEN:OLEIVERB_PRIMARY,this);-GetStartPositionGetStartPosition();();CMy222CntrItem*CMy222CntrItem*pItempItem;while(pos!=NULL)while(pos!=NULL)pItempItem=(CMy222CntrItem*)=(CMy222CntrI
24、tem*)pDocpDoc-GetNextItem(posGetNextItem(pos););pItempItem-Draw(pDC,pItemDraw(pDC,pItem-m_rectm_rect););CRectTrackerCRectTracker tracker;tracker;SetTracker(pItem,&trackerSetTracker(pItem,&tracker););tracker.Draw(pDCtracker.Draw(pDC););60OLE容器(12)n添加删除功能-ID_EDIT_DELvoid CMy222View:OnEditDel()void CMy
25、222View:OnEditDel()if(m_pSelectionif(m_pSelection!=NULL)!=NULL)m_pSelectionm_pSelection-Delete();-Delete();m_pSelectionm_pSelection=NULL;=NULL;GetDocumentGetDocument()-()-UpdateAllViews(NULLUpdateAllViews(NULL););void CMy222View:OnUpdateEditDel(CCmdUI*void CMy222View:OnUpdateEditDel(CCmdUI*pCmdUIpCm
26、dUI)pCmdUIpCmdUI-Enable(m_pSelectionEnable(m_pSelection!=NULL);!=NULL);61OLE容器(13)nOLE容器的例子62OLE服务器(1)n小型服务器(mini-server):不能独立运行,只能通过容器启动n全服务器(full-server):既可以作为独立的程序运行,又可以由容器启动,可以同时支持多个容器n自动化服务器(automation-server):使程序可以操纵另一个程序创建的对象63OLE服务器(2)n全服务器的例子CFullApp类:生成用于注册的OLE标识符,初始化OLE库与打开模板,检查是否作为服务启动CF
27、ullDoc类:当容器启动服务器、创建链接项时,构造复合文档并返回CFullSrvItemCInPlaceFrame类:服务器的边框窗口CFullView类:服务器的视图CFullSrvItem类:服务器的OLE接口64OLE服务器(3)65自动化服务器(1)n通过AppWizard生成程序,第3步选中None与AutomationAfxOleInit初始化OLE库COleTemplateServer:ConnectTemplate关联模板与COleTemplateServerCOleTemplateServer:RegisterAll对象描述文件AutoServer.odl,包含自动化对象、
28、属性与方法66自动化服务器(2)n在CAutoServerDoc中增加变量n在CAutoServerDoc构造函数中n在CAutoServerDoc:Serialize()中if(ar.IsStoringif(ar.IsStoring()()ararm_pointm_pointm_pointm_pointm_stringm_string;CStringCString m_stringm_string;CPointCPoint m_pointm_point;m_pointm_point=CPoint(50,50);=CPoint(50,50);m_stringm_string=_T(=_T(自动
29、化自动化););67自动化服务器(3)n在CAutoServerView:OnDraw()中n在CAutoServerDoc中添加Refresh()中pDCpDC-TextOut(pDocTextOut(pDoc-m_point.x,pDocm_point.x,pDoc-m_point.y,pDocm_point.y,pDoc-m_stringm_string););UpdateAllViews(NULLUpdateAllViews(NULL););SetModifiedFlagSetModifiedFlag();();68自动化服务器(4)n添加自动化属性:直接与间接方式n使用Get/Set
30、方法间接添加m_pointGetX():return(return(short)m_point.xshort)m_point.x;SetX():m_point.xm_point.x=nNewValuenNewValue;Refresh();Refresh();n直接添加m_stringExternal Name:textOnTextChanged():Refresh();Refresh();手工去除重复m_string69自动化服务器(5)n添加自动化方法RefreshWindow:与Refresh相同,根据m_point与m_string的值更新视图SetProps:设置m_point与m_
31、string,并更新视图ShowWindow:显示自动化服务器边框窗口,自动化服务器被自动化客户激活,默认不显示边框窗口70自动化服务器(6)nSetProps方法void void CAutoServerDoc:SetProps(shortCAutoServerDoc:SetProps(short x,x,short y,LPCTSTR text)short y,LPCTSTR text)m_point.xm_point.x=x;=x;m_point.ym_point.y=y;=y;m_stringm_string=text;=text;Refresh();Refresh();71自动化服务
32、器(7)nShowWindows方法void void CAutoServerDoc:ShowWindowsCAutoServerDoc:ShowWindows()()POSITION pos=POSITION pos=GetFirstViewPositionGetFirstViewPosition();();CViewCView*pViewpView=GetNextView(posGetNextView(pos););if(pViewif(pView!=NULL)!=NULL)CFrameWndCFrameWnd*pWndpWnd=pViewpView-GetParentFrameGetPa
33、rentFrame();();pWndpWnd-ActivateFrame(SW_SHOWActivateFrame(SW_SHOW););pWndpWnd=pWndpWnd-GetParentFrameGetParentFrame();();if(pWndif(pWnd!=NULL)!=NULL)pWndpWnd-ActivateFrame(SW_SHOWActivateFrame(SW_SHOW););72自动化服务器(8)n自动化服务器的例子73自动化客户(1)n创建自动化客户的过程创建一个自动化客户(Automation)创建COleDispatchDriver派生类添加自动化对象变量
34、(IAutoServer m_autoServer)修改对话框模板为对话框中的控件定义成员变量定义并实现消息处理函数74自动化客户(2)n创建COleDispatchDriver派生类75自动化客户(3)n设计对话框控件 控件控件 控件标识控件标识 说明说明 Edit Box IDC_X m_X(Short)Edit Box IDC_Y m_Y(Short)Edit Box IDC_TEXT m_Text(CString)Button IDC_SETX Set X Button IDC_SETY Set Y Button IDC_SETTEXT Set Text76自动化客户(4)n在CAut
35、oClientDlg:OnCreate()中if(!m_autoServer.CreateDispatch(_Tif(!m_autoServer.CreateDispatch(_T (Autoserver.DocumentAutoserver.Document)MessageBox(CannotMessageBox(Cannot Create Create AutoServerAutoServer!);!);return-1;return-1;m_autoServer.ShowWindowsm_autoServer.ShowWindows();();77自动化客户(5)n在CAutoClien
36、tDlg:OnSettext()中n在CAutoClientDlg:OnSetx()中n在CAutoClientDlg:OnSety()中GetDlgItemText(IDC_TEXT,m_TextGetDlgItemText(IDC_TEXT,m_Text););m_autoServer.SetText(m_Textm_autoServer.SetText(m_Text););m_Xm_X=(=(short)GetDlgItemInt(IDC_Xshort)GetDlgItemInt(IDC_X););m_autoServer.SetX(m_Xm_autoServer.SetX(m_X););m_Ym_Y=(=(short)GetDlgItemInt(IDC_Yshort)GetDlgItemInt(IDC_Y););m_autoServer.SetY(m_Ym_autoServer.SetY(m_Y););78自动化客户(6)79第6次作业n设计一个多媒体播放程序,要求至少具有以下功能:使用系统提供的WMPPlayer4控件播放avi与mpg格式的视频文件播放mp3与wav格式的音频文件实现打开、播放、暂停/继续与停止功能80谢谢大家81