基于MFC的ActiveX控件开发_第1页
基于MFC的ActiveX控件开发_第2页
基于MFC的ActiveX控件开发_第3页
基于MFC的ActiveX控件开发_第4页
基于MFC的ActiveX控件开发_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

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

文档简介

1、PAGE PAGE 83 HYPERLINK /yanjie2500/archive/2011/04/14/144220.html 基于MFC的ActiveX控件开发ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件,广泛应用于桌面及Web应用中。在VC下ActiveX控件的开发可以分为三种,一种是直接用COM的API来开发,这样做显然非常的麻烦,对程序员要求也非常高,因此一般是不予考虑的;一种是基于传统的MFC,采用面向对象的方式将COM的基本功能封装在若干MFC的C+类中,开发者通过继承这些类得到COM支持功能。MFC为广大VC程序员所熟悉,易于上手学习,但缺点是MFC封

2、装的东西比较多,因此用MFC开发出来的控件相对会比较大,因此比较适于开发桌面ActivexX控件,尤其是有GUI界面的控件。第三种就是基于ATL的,ATL可以说是专门面向COM开发的一套框架,使用了C+的模板技术,在运行时不需要依赖于类似MFC程序所需要的庞大的代码模块,更适合于Web应用开发。本文介绍的是采用第二种方式,即应用MFC进行桌面可视控件开发的方法步骤,开发环境则是基于VC2005。1.创建控件项目 打开VC2005后,我们要先创建一个项目,在新建项目页的左侧选择Visual C+-MFC,在右侧选择MFC ActiveX控件,填上解决方案和项目名称,比如在这里我的项目名称是act

3、ivexdemo1,解决方案名称是activexdemo。然后进入控件向导页,在向导的第二页有个运行时许可证,选中这个的话会在生成控件的同时生成一个许可证文件,其他用户在使用这个控件的时候必须同时附有这个许可证,在此我们保持默认状态,不选。下一页是关于项目中各部分的命名问题,可以根据需要自定义,这里就按默认的情况不做修改了。下一页是选择控件基于哪种控件的扩展以及控件的一些基本特性。如果新建的控件是基于某种特定控件的话,就在创建的控件基于下选择所要继承的控件名,否则就保持none。下方的附加功能根据实际需要进行选择,并且可以将鼠标放置于选项上方,功能的说明会自动显示在动态出现的小提示信息窗口中。

4、选择完毕点击完成,向导就根据你的选择生成新项目。进入开发环境,我们可以先看一下类视图。其中的Cactivexdemo1App是我们这个控件的主程序模块,定义了控件的注册(DllRegisterServer)、删除(DllUnregisterServer)等功能,一般不用动,如有需要我们可以在其中的InitInstance和ExitInstance中定义我们自己的初始化和终止操作代码,一般也就是一些资源的初始化和销毁工作。Caxtivexdemo1Ctrl是控件类,我们要做的控件功能基本上就是要在这个类中实现。需要提一下的是在这个类中重写了父类的OnDraw函数,有如下两句代码:pdc-Fill

5、Rect(rcBounds, CBrush:FromHandle(HBRUSH)GetStockObject(WHITE_BRUSH);pdc-Ellipse(rcBounds);也就是在控件上画了一个椭圆,实际控件开发中可以根据功能需要修改重写这个函数来绘制控件界面。Caxtivexdemo1PropPage是属性页类,这个类实现了一个在开发时设定控件属性的对话框。activexdemo1Lib是为客户程序提供本控件的属性、方法以及可能响应的事件的接口的库节点,在添加控件的这些功能的时候会用得到。其中的Cactivexdemo1App是我们这个控件的主程序模块,定义了控件的注册(DllReg

6、isterServer)、删除(DllUnregisterServer)等功能,一般不用动,如有需要我们可以在其中的InitInstance和ExitInstance中定义我们自己的初始化和终止操作代码,一般也就是一些资源的初始化和销毁工作。Caxtivexdemo1Ctrl是控件类,我们要做的控件功能基本上就是要在这个类中实现。需要提一下的是在这个类中重写了父类的OnDraw函数,有如下两句代码:pdc-FillRect(rcBounds, CBrush:FromHandle(HBRUSH)GetStockObject(WHITE_BRUSH);pdc-Ellipse(rcBounds);也

7、就是在控件上画了一个椭圆,实际控件开发中可以根据功能需要修改重写这个函数来绘制控件界面。Caxtivexdemo1PropPage是属性页类,这个类实现了一个在开发时设定控件属性的对话框。activexdemo1Lib是为客户程序提供本控件的属性、方法以及可能响应的事件的接口的库节点,在添加控件的这些功能的时候会用得到。2.生成并测试控件 好,现在我们就可以先来生成一下这个项目,当然到目前我们只是用系统自动生成的一个控件项目,什么功能都没有,只是一个空框架。几秒钟后,项目应该是顺利生成。控件也被自动注册到系统中去。那怎么才能测试一下这个控件呢?当然你可以再建个新项目,比如一个对话框程序,在对话

8、框资源编辑窗口中右边的工具箱里鼠标右键菜单里点选择项。从弹出窗口中的COM组件下找到我们刚刚生成的这个控件,打勾选中。然后在工具箱里就会出现这个控件。然后用鼠标拖到对话框里就能用这个控件了。除了这种方法,VS还提供了一种简便的控件测试工具。在VisualStudio中菜单的工具下有个ActiveX控件测试容器。在工具栏里点新控件按钮。在插入控件对话框中找到并选择我们的这个控件。然后就能在这个容器中测试控件的各种功能了。3.事件 ActiveX 控件使用事件通知容器控件上发生了某些事情。事件的常见示例包括单击控件、使用键盘输入数据和控件状态更改。当发生这些操作时,控件将引发事件以提醒容器。MFC

9、 支持两种事件:常用和自定义。常用事件是 COleControl 类自动处理的事件。自定义事件使控件得以在该控件特定的操作发生时通知容器。控件内部状态发生更改或收到某个窗口消息即属于此类事件。常用事件 常用事件由 COleControl 类自动引发。COleControl 包含预定义成员函数,它们引发常见操作所导致的事件。一些由 COleControl 实现的常见操作包括单击和双击控件、键盘事件和鼠标按钮状态发生更改。添加常用事件的操作是在类视图中右击ActiveX 控件类,比如在此例中就是Caxtivexdemo1Ctrl。在菜单中选择添加事件,打开添加事件向导。在添加事件向导中的事件名称中

10、选择Click,也就是鼠标点击事件,添加到控件中。然后再选中类视图中库节点下的第三个节点,也就是Dactivexdemo1Events。在下面就能看到我们刚刚添加的这个事件。然后生成新的控件程序,我们来看看测试一下这个新事件。打开上面提到的ActiveX控件测试容器,把这个控件添加进来,用鼠标点击控件,就会在程序下方的消息栏中看到activexdemo1 Control: Click这样的消息,这就是我们添加进去的鼠标相应事件。那在开发环境中使用控件的时候是什么样子的呢?好,像上面提到过的那样新建一个对话框项目,把控件放到对话框上。选中这个控件,在属性窗口中的控件事件中就有这个Click事件了

11、,如果在使用控件中需要相应鼠标点击事件,就点添加ClickActivexdemo1ctrl1,事件响应函数中添加你需要的功能了。比如像这样:void CtestMFCDlg:ClickActivexdemo1ctrl1()/ TODO: 在此处添加消息处理程序代码MessageBox(_T(“Hi.”);编译运行这个测试程序,点击控件位置就会弹出带有Hi.字样的MessageBox。自定义事件 自定义事件与常用事件的区别在于,自定义事件不由 COleControl 类自动引发。自定义事件将控件开发人员确定的某一操作识别为事件。添加常用事件的操作是在类视图中右击ActiveX 控件类,比如在此例

12、中就是Caxtivexdemo1Ctrl。在菜单中选择添加事件,打开添加事件向导。定义一个叫做MyEvent的事件,事件可以带参数,比如我们加个BSTR的参数msg。然后,回到类视图,这次选中库节点下的第三个节点,也就是_Dactivexdemo1Events,在下面就会看到新添加的这个事件。再选中类视图中的控件类,即Cactivexdemo1Ctrl,下面也会出现一个MyEvent函数。双击这个MyEvent可以看到定义代码如下:void MyEvent(BSTR msg)FireEvent(eventidMyEvent, EVENT_PARAM(VTS_PI1), msg);这里的这个My

13、Event(BSTR msg)函数就是用于触发MyEvent事件用的,什么意思呢,就是说当在控件中需要出发自定义的这个MyEvent的时候调用这个MyEvent(BSTR msg)就可以了。下面结合例子看看是怎么回事。比如说我们希望用户鼠标双击左键的时候触发这个事件,就这么来作。选中类视图中的控件类,即Cactivexdemo1Ctrl,然后在消息窗口中找到WM_LBUTTONDBCLK,添加这个消息的处理函数。在消息处理函数中如下修改:void Cactivexdemo1Ctrl:OnLButtonDblClk(UINT nFlags, CPoint point)/ TODO: 在此添加消息

14、处理程序代码和/或调用默认值MyEvent(_T(“HI, MyEvent.”);COleControl:OnLButtonDblClk(nFlags, point);这样每次用户在双击控件的时候就会触发我们自定义的MyEvent事件了。然后看一下测试效果。打开ActiveX控件测试容器,添加这个控件,然后双击控件,看消息框里出现什么了?由于双击自然也就是两次单击,所以会同时出现两种事件。activexdemo1 Control: MyEvent msg=72activexdemo1 Control: Click打开测试项目,控件的控件事件里就多了一个MyEvent事件。添加一个针对此事件的处

15、理函数MyEventActivexdemo1ctrl1 (LPCTSTR msg),msg就是我们定义事件时的那个msg参数,在上面的定义中我们是传递了一个”HI, MyEvent.”字符串消息。现在看看是不是这个样子。在MyEventActivexdemo1ctrl1函数中我们显示一个MessageBox,把msg参数打印出来。void CtestMFCDlg:MyEventActivexdemo1ctrl1(LPCTSTR msg)/ TODO: 在此处添加消息处理程序代码MessageBox(msg);同时注意要把上面常用事件中定义的Click事件的处理函数ClickActivexdem

16、o1ctrl1注释掉,然后编译运行程序后双击控件就会弹出HI, MyEvent.对话框。也就是说,由于双击操作触发了我们定义的MyEvent事件,进而调用MyEvent的处理函数。4.方法 方法就是控件开放给用户使用的一些功能函数,类似于C+的类函数。控件方法分两类,一类是常用方法,其实现由父类COleControl 提供。自定义方法由开发人员定义,由此向用户提供自定义的功能实现。常用方法 COleControl 支持两个常用方法:DoClick 和 Refresh。Refresh 由控件的用户调用,用以立即更新控件的外观;而调用 DoClick 是用于引发控件的 Click 事件。添加常用方

17、法的操作是在类视图中打开库节点,在本例中就是activexdemo1Lib节点。选中第二个节点,也就是本例中的_Dactivexdemo1,在右键菜单中选择添加方法,打开添加方法向导。在方法名中选择需要添加的常用方法。比如DoClick。然后在类视图中选中_Dactivexdemo1,就会在下面看到我们刚才添加的那个常用方法。同时,你也可以在这里看到有一个AboutBox方法,这是系统自动给我们添加进去的,功能是显示一个About窗口,这个窗口可以在项目的资源视图中的Dialog下找到并编辑。同样也要验证一下这个新添加的方法。还是打开ActiveX控件测试容器,添加此控件,然后点击工具栏上的这

18、个红色方框,也就是调用方法。在调用方法对窗口的方法名中选中我们刚添加的这个DoClick方法,然后点击调用。还记得这个DoClick是干什么的来着吗?,对了,它是要引发Click事件的,上面介绍事件的时候我们已经添加了Click这个常用事件了,那么现在调用DoClick也就是要引发我们在上面添加的这个Click事件了,于是在测试容器主窗口的消息框中出现了activexdemo1 Control: Click。那么在开发环境中是什么效果呢?好,再回到刚才那个测试项目里。我们先在窗体上添加一个按钮,就叫DoClick,等会用点击它的方式来调用DoClick方法。然后为了方便操作,我们先给刚才添加到

19、对话框中的那个控件添加一个绑定的对象变量。鼠标右击控件选择添加变量。在添加成员变量向导中添加与此控件绑定的控件变量,比如叫做m_activexdemo。然后,双击刚才新加到窗体上的那个按钮,即添加这个按钮的鼠标点击事件函数中,如下添加一行代码,即调用控件的DoClick方法。void CtestMFCDlg:OnBnClickedButton1()/ TODO: 在此添加控件通知处理程序代码m_activexdemo.DoClick();最后,编译运行测试程序,点击DoClick按钮,结果弹出Hi.对话框。这就是说,我们通过执行控件对象的DoClick方法引发了控件的鼠标点击事件,因此上文常用

20、事件一节中我们添加的事件处理函数ClickActivexdemo1ctrl1被执行了。自定义方法自定义方法与常用方法的区别在于,自定义方法未由 COleControl 实现。必须为添加到控件的每个自定义方法提供实现。添加自定义方法的操作是在类视图中打开库节点,在本例中就是activexdemo1Lib节点。选中第二个节点,也就是本例中的_Dactivexdemo1,在右键菜单中选择添加方法,打开添加方法向导。在添加方法向导里添加需要自定义的方法的名称、返回值和参数。注意这里有个内部名称,默认情况是与上面的方法名一样,但是也可以修改为其他名,这个内部名称是方法在控件类内的函数名称,比如这里我们的

21、方法名为MyThod,则选中类视图中的库接口下的第二个节点,下面会出现刚定义的MyMethod方法。而选中控件类Cactivexdemo1Ctrl,下面会看到在这个类中定义的方法名称就是我们上面指定内部名称MyMethodInner。而方法的具体功能也就是在这个内部函数中实现。比如我们如下定义MyMethodInner:void Cactivexdemo1Ctrl:MyMethodInner(LPCTSTR msg)AFX_MANAGE_STATE(AfxGetStaticModuleState();/ TODO: 在此添加调度处理程序代码MessageBox(msg);也就是说要弹出一个消息

22、对话框,消息内容就是参数中传递的字符串。然后来测试一下效果,首先还是ActiveX控件测试容器,打开调用方法窗口,在方法名中会看到我们定一个MyMethod,选择之,然悔会在参数区看到我们定义的msg参数,选中,然后在下面参数值中填入你想传递给参数的值,比如hello,然后点击设置值,最后点击调用,MyMethodInner就会被执行,也就是弹出hello消息窗口。然后再看一下使用控件开发的时候的效果。回到测试项目,还记得那个DoClick按钮吧,还是用这个,不过有点小问题,因为上面我们为这个控件绑定控件变量的时候还没有这个自定义方法,所以在绑定的时候生成的控件类定义中没有这个方法,就无法测试

23、了。为了省事,我们就干脆新建一个项目,像前文提到的那样添加控件,绑定控件变量,在DoClick的单击事件中写入如下代码:void Ct1Dlg:OnBnClickedButton1()/ TODO: 在此添加控件通知处理程序代码m_activexdemo.MyMethod(_T(“This is mymethod.”);编译执行,点击DoClick按钮,就会看到那个This is mymethod消息框了。5.属性 属性是 ActiveX 控件中向所有容器公开的数据成员。与事件和方法类似,也分为常用属性和自定义属性。常用属性 常用属性已由 COleControl 类实现。COleControl

24、 类包含支持控件的通用属性的预定义成员函数。某些通用属性包括控件的标题以及前景色和背景色。添加常用属性的操作是在类视图中打开库节点,在本例中就是activexdemo1Lib节点。选中第二个节点,也就是本例中的_Dactivexdemo1,在右键菜单中选择添加属性,打开添加属性向导。选中实现类型下的常用,在属性名下选择要添加的属性,比如在此我们选择的是Caption。然后在类视图中就能看到新添加的这个属性。这个Caption也就是我们在使用控件进行开发的时候,控件属性窗口中的那个Caption属性。在开发环境中我们可以用控件变量的GetCaption和SetCaption来获取和设定控件的这个

25、属性。比如在测试项目中的DoClick按钮的点击事件函数中如下修改:void Ct1Dlg:OnBnClickedButton1()/ TODO: 在此添加控件通知处理程序代码MessageBox(m_activexdemo.GetCaption();m_activexdemo.SetCaption(_T(“change”);MessageBox(m_activexdemo.GetCaption();这样在点击DoClick按钮的时候会显示控件的Caption名称对话框,然后修改名称,再把修改后的名称显示在弹出的对话框中。如果是在ActiveX控件测试容器中的话,我们还是打开调用方法窗口,在方

26、法名中会看到Caption(ProPut)和Caption(ProGet)的方法,也就是对应上面的SetCaption 和GetCaption,同样在这里也可以试着给Caption修改内容并获取修改后的值。自定义属性 自定义属性与常用属性的区别在于,自定义属性未由 COleControl 类实现。自定义属性用于将 ActiveX 控件的某个状态或外观向使用该控件的程序员公开。添加自定义属性的操作是在类视图中打开库节点,在本例中就是activexdemo1Lib节点。选中第二个节点,也就是本例中的_Dactivexdemo1,在右键菜单中选择添加属性,打开添加属性向导。这里自定义属性有成员变量和

27、Get/Set方法两种。成员变量属性我们先看一下成员变量这种属性。根据需要选择属性的类型,并填入属性名,同时变量名和通知函数会被自动填入,如不满意默认的名称也可以手动修改这两个名称。其中这个变量名是作为控件类的一个成员变量来存储控件属性的,比如选中类视图中的的控件类,也就是Cactivexdemo1Ctrl,就会在下面看到这个m_MyProp1成员变量。这种自定义属性的使用与常用属性类似,在ActiveX控件测试容器中也是有着MyProp1(ProPut)和MyProp1 (ProGet)这样的方法以供测试时调用,在开发时也会有属性出现在控件的属性窗口中,在程序中也是可以通过GetMyProp

28、1和SetMyProp1来获取和设置属性值。而通知函数是当这个属性被修改是所触发的一个函数。被定义为控件类中的一个成员函数。举个例子,假如我们在这个函数中写入如下代码:void Cactivexdemo1Ctrl:OnMyProp1Changed(void)AFX_MANAGE_STATE(AfxGetStaticModuleState();/ TODO: 在此添加属性处理程序代码MessageBox(_T(“MyProp1 Changed.”);SetModifiedFlag();然后在ActiveX控件测试容器中调用MyProp1(PropPut)来修改这个属性值,则会弹出这个对话框。同样

29、的,在开发时如果在属性窗口中修改此属性值或在代码里修改此属性值都会触发这个通知函数,进而弹出我们代码中的对话框。Get/Set方法型属性添加Get/Set方法型属性则是在添加属性向导窗口中的实现类型中选中Get/Set方法,指定属性类型和属性名,向导会自动填入Get和Set函数,同时可以指定自定义的参数。然后在控件类的定义中就会出现GetMyProp2(void)和SetMyProp2(LPCTSTR newVal)两个函数,分别用于获取和设置属性值。但要注意的是,如果看一下这两个函数的代码的话,这两个自动生成的函数实际上并没有真正起到获取和设置属性值的功能,这只是两个框架,基本上什么也没做,

30、如果放在ActiveX控件测试容器中调用这两个函数的话会看不到什么反应,于是就还需要我们来手动定义函数的具体功能。比如说我们可以为控件类添加一个成员变量用来存储我们的属性值,由于我们这个属性定义的是BSTR类型,我们可以把添加的这个成员变量声明为CString m_MyProp2,然后分别修改GetMyProp2(void)和SetMyProp2(LPCTSTR newVal)为如下:BSTR Cactivexdemo1Ctrl:GetMyProp2(void)AFX_MANAGE_STATE(AfxGetStaticModuleState();CString strResult(m_MyPr

31、op2);/ TODO: 在此添加调度处理程序代码return strResult.AllocSysString();void Cactivexdemo1Ctrl:SetMyProp2(LPCTSTR newVal)AFX_MANAGE_STATE(AfxGetStaticModuleState();/ TODO: 在此添加属性处理程序代码m_MyProp2=newVal;SetModifiedFlag();然后在ActiveX控件测试容器中先调用SetMyProp2给属性赋值,然后用GetMyProp2就能返回刚才新赋的属性值了。另外要注意的是,刚才定义这个属性的时候,参数列表是留空的,默认

32、得到的就是上面SetMyProp2和GetMyProp2两个函数,如果在参数列表里添加了其他参数的话,那么新加的参数就会被添加到这两个函数的参数列表中去。比如我们添加个BSTR型属性MyProp3,在参数列表里加上一个LONG arg参数,那么得到的两个函数将是GetMyProp3(LONG arg)和SetMyProp3(LONG arg, BSTR newVal)。6.属性页 属性页使 ActiveX 控件用户得以查看和更改 ActiveX 控件属性。可通过调用控件属性对话框访问这些属性。该对话框包含一个或多个属性页,这些属性页提供自定义的图形界面用于查看和编辑控件属性。使用默认属性页 创

33、建ActiveX控件项目后,系统就自动为我们添加了一个属性页类,这里就是Cactivexdemo1PropPage。同时在对话框资源里也会有一个属性页对话框资源,这里就是IDD_PROPPAGE_ACTIVEXDEMO1。在ActiveX控件测试容器中点击工具栏上的属性按钮,就会看到这个属性页对话框。比如就像下图这样。当然这个上面什么还没有。如果是在使用控件开发时,则在选中控件后,在属性窗口中点击属性页按钮可以打开这个属性页,开发人员可以在这个弹出的属性页窗口中设定控件的属性。如果要通过属性页修改控件属性,那么就要通过在属性页上放置一些控件给用户来修改属性值。比如我们上面添加了一个Captio

34、n属性,我们要在属性页上提供修改这个属性的功能一般就是要用一个文本输入框。这样我们在属性页的对话框上放置一个Edit控件,设id为IDC_EDIT_CAPTION。然后为这个Edit控件绑定一个变量。用右键点这个Edit控件,学则添加变量,打开在添加成员变量向导中添加一个新变量,设为m_caption,这里注意要把类型设为Value,由于属性是个字符串,所以这个地方变量类型也使用CString。然后我们来看一下属性页类中的一个DoDataExchange函数。这个函数是由系统自动调用的,用来将控件与成员变量进行数据交换。由于我们刚把Edit控件绑定了m_caption变量,在DoDataExc

35、hange已经给我们写入了这么一句DDX_Text(pDX, IDC_EDIT_CAPTION, m_caption);,就是这一句实现了m_caption与Edit控件之间的数据交换。但此时控件Caption属性还不能自动从Edit控件中填写的值获得,还需要一个操作,即DDP_Text(pDX, IDC_EDIT_CAPTION, m_caption, _T(“Caption”);,这样就把Caption属性与与属性页中的m_caption变量绑定,这样每当我们在修改了属性页窗口中的Edit控件内容后,就能修改控件的Caption。那么完整的DoDataExchange函数就应该像下面这样。

36、void Cactivexdemo1PropPage:DoDataExchange(CDataExchange* pDX)DDX_Text(pDX, IDC_EDIT_CAPTION, m_caption);DDP_Text(pDX, IDC_EDIT_CAPTION, m_caption, _T(“Caption”);DDP_PostProcessing(pDX);另外注意这个地方DDP_PostProcessing是系统自动生成的代码,这句话一定要放在DDX_Text和DDP_Text的后面,否则不能实现控件属性与属性页上控件的绑定。至此,我们就可以在设计时通过这个属性页来修改Captio

37、n属性,而不必通过程序代码来修改了。添加其他自定义属性页 默认情况下只有一个属性页,如果需要设置的属性太多就需要另外添加自定义属性页。新添加属性页的方法是这样的,打开VS的资源视图,添加一个新的Dialog资源。在这里我们选择IDD_OLE_PROPPAGE_SMALL,当然也可以选和Large。给这个新资源ID指定为IDD_OLE_PROPPAGE_SMALL。然后需要给这个资源新建一个关联类。这个关联类应当是MFC类,设类名为CPropPage1,基类应当是COlePropertyPage,对话框ID选择我们新添加的这个对话框资源ID。然后,打开控件类Cactivexdemo1Ctrl的c

38、pp文件,找到属性页的宏声明部分。BEGIN_PROPPAGEIDS(Cactivexdemo1Ctrl, 1)PROPPAGEID(Cactivexdemo1PropPage:guid)END_PROPPAGEIDS(Cactivexdemo1Ctrl)把我们新建的这个属性页添加进去,并将属性页计数加一。/ TODO: 按需要添加更多属性页。请记住增加计数!BEGIN_PROPPAGEIDS(Cactivexdemo1Ctrl, 2)PROPPAGEID(Cactivexdemo1PropPage:guid)PROPPAGEID(CPropPage1:guid)END_PROPPAGEIDS

39、(Cactivexdemo1Ctrl)这样就把新添加的这个属性页附加到控件中去了,再打开控件的属性页就会看到多了一个属性页了。常用属性页 除了可以根据需要自定义属性页外,系统还提供给开发人员一些预制的常用属性页,如颜色、字体等属性页。MFC 提供了三个与 ActiveX 控件一起使用的常用属性页:CLSID_CColorPropPage、CLSID_CFontPropPage 和 CLSID_CPicturePropPage。这些页分别显示常用颜色、字体和图片属性的用户界面。要将这些属性页合并到控件中,只需要请将它们的 ID 添加到初始化控件的属性页 ID 数组的代码。也就是在类控件Cacti

40、vexdemo1Ctrl的cpp文件中的PROPPAGEIDS声明处修改成如下形式。与自定义属性页中相同,也需要增加属性页计数。/ TODO: 按需要添加更多属性页。请记住增加计数!BEGIN_PROPPAGEIDS(Cactivexdemo1Ctrl, 3)PROPPAGEID(Cactivexdemo1PropPage:guid)PROPPAGEID(CPropPage1:guid)PROPPAGEID( CLSID_CColorPropPage )END_PROPPAGEIDS(Cactivexdemo1Ctrl)这样就在属性页里添加了一个颜色属性页,但要想使用这个属性页还需要添加几个常

41、用属性,比如说我们希望能通过这个属性页设定BackColor和ForeColor属性,就参照常用属性一节中的方法添加一个BackColor和一个ForeColor属性,编译生成控件后在ActiveX控件测试容器中点击工具栏中的属性。在弹出的属性窗口中就能看到有关这两个属性的设定了。若要使用颜色属性,则需要调用COleControl:TranslateColor成员函数。此函数的参数为颜色属性值和可选的调色板句柄。返回值为 COLORREF 值,可以将它传递给 GDI 函数,如 SetTextColor 和 CreateSolidBrush。下例说明如何在绘制控件时使用这两个颜色属性。CBrus

42、h bkBrush(TranslateColor(GetBackColor();COLORREF clrFore = TranslateColor(GetForeColor();pdc-FillRect( rcBounds, &bkbrush );pdc-SetTextColor( clrFore );pdc-DrawText( InternalGetText(), -1, rcBounds, DT_SINGLELINE | DT_CENTER | DT_VCENTER );全文完附录资料:WebGIS超详细版复习资料WebGIS复习资料第一章 绪论WebGIS的基本概念(熟悉GIS+WWW=

43、Web GISWeb GIS是指基于Internet平台进行信息发布、数据共享、交流协作Web GIS由多主机、多数据库、多终端,通过Internet/Intranet连接组成,具有C/S结构,服务器端向客户端提供信息和服务,客户端具有获得各种空间信息和应用的功能Web GIS的特点Web GIS的逻辑结构Web浏览器:获取网上各种地理信息Web GIS的信息代理:提供数据访问接口Web GIS服务器:提供地理信息服务传统GIS的问题文件服务器结构的处理能力完全依赖于客户端客户端的任何操作复杂,多版本,数据完整性难以控制成本高桌面系统操作复杂Web GIS的优点Web GIS是集成的全球化的客

44、户/服务器网络系统Web GIS是交互系统,用户可在Internet上操作GIS地图和数据,使用Web浏览器进行Zoom、Pan、Query、Label等,甚至空间查询Web GIS是分布式系统,GIS数据和分析工具是独立的组件和模块,可部署在不同的计算机Web GIS是动态系统,可随时更新Web GIS是跨平台系统,对任何计算机和操作系统都没有限制Web GIS能够访问异构地理数据Web GIS是图形化的超媒体信息系统,通过超媒体热链接(或地图上的热点)可以连接到不同的地图页面应用层面空间数据发布:能够以图形方式显示空间数据,较之单纯的FTP方式,WebGIS使用户更容易找到需要的数据;空间

45、查询检索:利用浏览器提供的交互能力,进行图形及属性数据库的查询检索;空间模型服务:在服务器端提供各种空间模型的实现方法,接受用户通过浏览器输入的模型参数后,将计算结果返回。Web资源的组织:在Web上存在着大量的信息,这些信息多数具有空间分布特征,如分销商数据往往有其所在位置属性,利用地图对这些信息进行组织和管理,并为用户提供基于空间的检索服务,无疑也可以通过WebGIS实现。几种商业化Web GIS平台(了解)MapInfo公司的MapXtremeESRI公司的ArcIMSAdobe公司的 MapGuide超图公司的SuperMap IS中地公司的 MAPGIS IMS计算机网络基本原理计算

46、机网络的发展(了解)第一阶段:以主机为中心的联机终端系统。第二阶段:以通信子网为中心的主机互联 通信子网和资源子网的分离第三阶段:开放化标准化网络 开放系统互联参考模型协议、TCP/IP协议第四阶段:宽带综合业务数字网 综合、高速、智能计算机网络的分类(熟悉)按地域大小局域网 广域网 城域网按通信媒体有线网 无线网 有线无线混合网按数据交换方式分线路交换方式 报文交换方式 分组交换网络按使用范围分公用网 专用网OSI开放系统参考模型(了解)几种基本网络设备中继器(转发器)(物理层)网桥(网能够络分段、局域网互联)(数据链路层)路由器(网络连接、路径选择)(网络层)网关(不相同的网络互联时的设备

47、)(高层)(协议网关、应用网关、安全网关)TCP/IP协议作为当前公认的工业标准,TCP/IP协议的特点开放性,独立于硬件,免费统一分配网络地址高层协议标准化IP地址原理IPV4IP地址=网络ID+主机IDIP地址分类A类 0开头 后24位为主机IDB类 10开头 后16位为主机IDC类 110开头 后8位为主机IDD类地址 1110开头 多重广播E类地址 11110开头 实验性地址 域名系统(Domain Name System,DNS) 是Internet上解决网上机器命名的一种系统。就像拜访朋友要先知道别人家怎么走一样,Internet上当一台主机要访问另外一台主机时,必须首先获知其地址

48、,TCP/IP中的IP地址是由四段以“.”分开的数字组成,记起来总是不如名字那么方便,所以,就采用了域名系统来管理名字和IP的对应关系。组织模式下的顶级域名表顶级域名网络属性顶级域名网络属性顶级域名网络属性com盈利商业实体mil军事机构或组织store商场edu教育机构或设施net网络资源或组织wb有关实体gov非军事政府或组织org非盈利组织机构arts文化娱乐int国际性机构firm商业或公司arc消遣性娱乐主机的IP地址和域名的关系两者是等价的相当于身份证号码和人名但域名具有排他性域名与IP地址被存储在DNS(域名服务器)中。地址和域名的解析域名解析器 客户端程序,负责查询域名服务器

49、主域名服务器 转发域名服务器关于Web的一些基本概念WWWWorld Wide WebWeb由一系列链接连接起来Tim Berners Lee WWW的主要特点(熟悉)用户在全世界范围内查询、浏览最新信息支持超文本和超媒体信息服务使用浏览器作为统一的用户接口由资源地址域名和Web站点构成可以将Web站点互相连接,以提高信息查找和漫游访问服务能使用户与信息发布者或其他用户交流信息WWW的工作模式(熟悉)Web浏览器/Web服务器在浏览器中输入Web地址,向某个服务发出HTTP请求Web服务器收到请求后,在HTML文档中找到特定的页面,将请求返回给用户浏览器执行收到的HTML文档并显示内容HTTP

50、协议(熟悉)HTTP协议:基于Cilent/Server的无状态和无连接协议简单灵活:get/post/head元信息:可以传输任何类型的资料无连接:建立在TCP协议之上,每次连接只处理一个请求无状态:双刃剑统一资源定位符 (掌握)URL“协议:”+“/”+“主机域名/IP地址”+“目录路径”协议:HTTP/FTP/GOPHER/NEW/TELNET/Wails/File/TUNDER/Web应用开发技术介绍VBSCRIPTJAVASCRIPT动态网页技术CGIASPJSPDHTMLPHP第三章 Web GIS基本原理1.WebGIS概述1.1 Web GIS的发展 1993Xerox Map

51、 Server,第一个分布式地理信息系统应用原型系统 1993.11 挪威Tromso大学,第一个地图Web服务器 1994.1 虚拟旅行者 1994 大发展 NSDI;UCSB; 1995 地图引擎的出现1996年 主要地理信息厂商介入1997年 DGI和Web GIS正式出现1998年 基于JAVA的WebGIS出现1999年 组件式WebGIS开始研究.2005年 瓦片式地图服务出现(GoogleMap)2006Bing/Baidu/MapABC/WPS/WMS1.2 Web GIS的信息内容构建信息内容涉及到信息组织、信息交互、信息表达、综合分析、数据安全和开放性信息组织:如何向客户端

52、浏览器用户以最佳方式提供需要的信息 (1)一次传输整个数据文件 (2)一次仅传输数据文件中需要的部分 (3)以图像方式传输空间数据信息交换:实现客户端与服务器的信息交流,使用一整套信息交换协议。协议一般分为请求/应答两个相互对应的部分。 功能包括:数据请求/信息查询/分析/制图/帮助/控制/元数据请求 主要方法:请求/响应模式信息表达: 操作界面的组织 空间信息的表达方式: 地图符号/专题图/统计制图结果/图例/文字信息描述等综合分析: WebGIS不能仅仅满足对空间数据的浏览和简单的数据查询,需要有完备的空间查询和空间分析能力,需要对数据库中的空间和属性数据进行复杂的处理数据安全: (1)数

53、据库访问控制 (2)用户注册与认证 (3)加密策略开放性 网络的可维护性 动态集成用户分析模型的能力 接受多种数据格式的能力 与其它系统集成的能力1.3 Web GIS的应用模式 (熟悉)Web GIS 应用模式 空间数据发布 空间查询检索 空间模型服务 Web资源组织原始数据下载不做任何处理,仅仅将空间数据通过FTP协议下载,这是最原始的WebGIS应用工作原理:服务器上的数据通过浏览器被下载到客户端,客户端的GIS软件即可使用这些数据缺点:无法在线浏览,GIS软件系统必须理解数据格式静态地图图像显示最简单Web的在线浏览方式服务器上使用GIS软件或者手工创建或生成地图图像,在HTML文档中

54、包含地图图像。Web浏览器即可在线浏览缺点:无法定制地图图像大小 无法进行要素查询元数据查询通过Web发布元数据,使用户及时了解自己所关注的空间数据情况,并通过适当的途径得到满足应用要求的空间数据。两种服务模式: 空间数据提供商自建元数据服务器发布; 空间数据交换中心发布两种查询方式: 通过元数据项值查询 通过图形界面查询动态地图浏览产生交互式地图浏览的一种方式图像不是静态图像,而是根据确切的参数(比例尺、位置、专题等)在使用过程中临时生成原理:Web浏览器发出URL请求给Web服务器,Web服务器根据URL请求及相应的参数,启动地图生成器,GIS接口程序,GIS软件或制图脚本,临时生成地图图

55、像,并将其传送给Web浏览器显示数据预处理不是简单将分布式地理信息数据简单下载给用户使用在数据传输之前,对原始数据进行预处理预处理:对数据格式变换、数据的投影变换以及坐标系统变换等经过预处理之后,用户便可以直接使用预处理后的数据数字区域空间信息管理与发布多比例尺、多源数据、分布式、多时态、多种数据格式基础地理信息实现Web GIS的基本方式 (熟悉)基于CGI方式 CGI是Web服务器调用外部应用程序的标准接口,用于在超文本文件和服务器主机应用程序间传递信息。 CGI程序语言可以是C、SHELL/VB/Fortran CGI程序是一个可执行程序。基于CGI方式的WebGIS工作原理:CGI方式

56、的Web GIS特点优点: 瘦客户端:客户端不需要安装任何软件,有支持标准HTML的Web浏览器即可 CGI跨平台缺点: 网络传输负担大 服务器负担重 同步多请求 静态图像 用户界面功能受Web浏览器影响相似的原理有ProServer/ArcViewIMS/MapObject/YahooMap与CGI方式原理类似的有 Server API:不能跨平台,依赖于Web服务器;效率比CGI方式高; JAVA Servlet:采用JAVA开发,面向Web服务器的小应用程序。方式灵活,效率高,跨平台,主流技术基于Plug-in方式Plug-in原理: NetScape提出 标准,一种接入浏览器程序的动态

57、链接库,采用DLL方式,可以很好地解决与浏览器程序间的相互调用问题。 胖客户端,能够正确地浏览很多数据类型,在浏览器端完成矢量信息的显示 插件:能够与浏览器交换信息的软件Plug-in方式的WebGIS工作原理Plug-in方式特点: 优点 无缝支持与GIS数据的连接 GIS操作速度快 服务器和网络传输负担轻 缺点: 平台相关 数据类型相关 需要事先安装 更新困难 操作分析资源能力弱基于ActiveX方式ActiveX是微软公司为适应因特网而发展的标准,是建立在OLE标准上,为扩展微软的Web浏览器功能而提供的公共框架,关于完成具体任务和信息通讯的的软件模块。ActiveX能够被任何支持OLE

58、标准的语言或应用程序所使用。IE浏览器作为容器,任何符合ActiveX的控件都能被嵌入网页中。ActiveX具备能够访问客户端本地系统的能力,功能强大,但存在隐患。ActiveX第一次安装需经过下载和用户确认Object标记在网页中用于定位ActiveX基于ActiveX的Web GIS功能工作原理基于ActiveX的Web GIS的特点优势:具备GIS Plug-in的所有优点,比plug-in模式更灵活,使用更方便缺点: 需要下载 与平台相关 与浏览器相关 使用已有的GIS操作分析资源的能力弱,处理大型的GIS分析能力有限 存在信息安全隐患基于JAVA Applet方式JAVA Apple

59、t原理 Applet是小型的JAVA应用程序,专门为建立动态的Web网页而设计 每次随网页一起被加载到客户端,然后再客户端调用JAVA虚拟机执行 通过标签来调用 Applet仅仅被加载到客户端内存中,退出时会被回收,故不占磁盘 Applet不能访问本地文件系统,安全性较好基于JAVA APPLET方式的WebGIS工作原理基于JAVA Applet方式的WebGIS特点优点: 体系结构中立,与平台与操作系统无关 动态运行,无需预先安装 GIS操作速度快 服务器和网络传输负担轻缺点: 使用已有的GIS操作分析资源能力弱,处理大型的GIS分析能力有限 GIS数据的保存,分析结果的存储和网络资源的使

60、用能力有限几种方式的比较性能指标CGIPlug-inJAVA AppletActiveX执行能力客户端很好好好好服务端差到好好很好很好网络差好好好总体一般好好到很好好到很好相互作用相互作用差好很好很好功能支持一般 好很好很好本地数据支持否是否是可移动性很好差好一般安全很好一般好一般3.3 Web GIS空间数据组织WebGIS空间数据特点:分布式、多源、异构、特定的用户显示界面。1、地理信息本身的分布式特征 平面的分布 垂直的分布 分布的数据可能由不同的地域、不同的部门予以维护,其数据库服务器呈现分布式,具备不同网络地址2、地理信息存储方式不同,呈现出异质的特点 不同种类的数据可能采取不同的存

温馨提示

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

评论

0/150

提交评论