MFC中ActiveX控件的使用

来源:互联网 发布:高校网络散布谣言 编辑:程序博客网 时间:2024/06/06 00:22

    Windows系的开发做的很少,也晕乎晕乎的。

    最近学习了下Arcgis的开发,话说C++开发相关的资料还真少。好不容易从网上找了篇资料,算是入了门(或者还在门外头,但是找到门了)。感谢这位同仁:

    http://blog.csdn.net/yiersl/article/details/16856479

    在MFC中添加上MapControl的控件之后。手动添加一个IMapControl2Ptr类型的变量,然后用手动添加的变量再去手动的与控件关联,才能进一步调用或者设置控件的方法和属性。我上一次使用MFC是什么时候来着?貌似很久远了。不过我依稀记得,为控件添加变量这种事情在MFC当中点点鼠标就能完成了啊,于是我就试了一下。过程虽然很艰辛,但最后终究是实现了。在这个过程中,发现了几个不理解认为很奇怪的地方:

    ① 通过类向导添加上的变量,在使用其方法时,跟手动添加的变量(指针类型)方法的原型不一样。

    ② 添加变量的过程中,还为控件创建了相应的源文件和头文件。

    上网搜了各种关键词,资料少之又少,但感觉还是有点明白了,不知道理解的对不对,但至少临时能解释的通,暂且先记下来。

    ① 不一样的原因在于,手动添加的变量跟类向导创建的变量本来就不是一个类型。手动添加的变量是Com(控件)中的一个接口(interface)的指针,而类向导添加的是控件对应的COM对象的变量。稍微了解下原理,控件就是一个标准的COM对象,而该对象包含了多个接口。手动添加时变量直接指向了对象中的某个接口(此处的接口是COM中的概念,其中会包含多个方法和属性)。而类向导添加的变量是COM对象,使用它其中的方法时调用的是控件(对象)中默认的接口中的方法,或者是对象对外提供的方法是其中接口的方法的又一层封装,因此,两种方式调用下原型会有差别。

    ② 添加新的源文件和头文件肯定是MFC的实现机制的原因,但为什么在为按钮等控件添加变量时不会出现这种情况呢?有可能是因为控件本身分为windows标准控件(如按钮文本框等只能用在MFC中)和ActiveX控件(可以用在Web等地方)两种。而标准控件已经在MFC中做了封装,不需要添加源文件也会知道他的类结构,而ActiveX控件是第三方提供的,为了能添加它的变量,就得需要了解他的类型结构,当然,这应该得需要在实现ActiveX控件的时候,还得能告诉使用者如果要声明变量的话,需要定义成什么样的类型。

    在MFC中,标准的使用方式应该是后者也就是使用类向导添加变量的方式,而手动添加的方式其实是使用COM的方式。为了能以COM的形式使用,MFC中使用下面的方法步骤:

    ① CWnd *pWnd = GetDlgItem(ID_XXXX); 使用控件ID获取控件窗口指针

    ② LPUNKNOWN pUnk = pWnd->GetControlUnknown();返回CWnd对象所代表的OLE控件的IUnknown接口的指针。如果这个对象不代表一个OLE控件,则返回值为NULL。(IUnknown是COM中的概念,实现COM必须实现的一项)。

    ③ pUnk->QueryInterface(IID_XXXXXXXXX, (LPVOID*)&XXXXXPtr); 将接口与对象指针(第二个参数)关联。注意第一个参数并不是控件在MFC中的ID,而是COM中接口的ID。

   

0 0