• 15.COM组件技术应用之一:ActiveX控件


    一、ActiveX控件(COM组件技术的应用之一)

      flash.ocx  

      1. 概念

        1.1 ActiveX控件的概念

          基于COM组件技术,可以被任何支持COM标准的计算机程序的项目使用。

          可是采用拖拽的方式创建,使用向一般控件一样方便。文件的后缀是ocx,有时称ocx控件。

        1.2 COM组件的概念

          Component Object Model,组件对象模型。可以改善项目的架构,使得项目可维护性和可复用性更好。

          COM组件是一些小的可以执行的二进制文件,以接口的方式为其他的程序、系统和组件提供服务。

        1.3 COM接口的概念

          C语言 - 接口就是函数

          C++语言 - 接口就是公有的成员函数

          COM接口 - 一组纯虚函数的集合

          纯虚函数只有功能的描述,没有具体的实现过程。特点是稳定,不易变化。引入接口的目的是解耦。

          接口函数:public  void  Sort( int  arr[ ] );

          排序模块(小的dll程序):

            实现排序的组件:派生自接口的实现类。

          exe程序:

            另外一个模块调用排序模块实现了排序功能。

      2. 开发、注册、测试

        2.1 使用MFC向导开发ActiveX控件

          2.1.1 生成的类和接口的介绍

              第一个接口 - 添加方法和属性

              第二个接口 - 添加事件

              App类 - 应用程序类

              Ctrl类 - 控件类,完成控件外观的绘制以及控件功能的具体实现

              PropPage类 - 属性页类,添加控件的属性和设置

          2.1.2 在Ctrl::OnDraw函数中完成控件的外观

          2.1.3 通过第一个接口添加方法和属性

              在类视图窗口中,右击类名-->添加-->添加事件

              添加方法:SetNumbers

              添加属性:Direction       

          2.1.4 通过第二个接口添加事件

              在类视图窗口中,右击类名-->添加-->添加函数、添加变量

              事件分为库存事件和用户自定义事件

              库存事件:Click、DblClick等

              用户自定义事件:MyMessage

              库存事件自动通知的,只需添加事件即可。而用户自定义事件在添加事件后,需要在相应的位置调用。

        2.2 注册

          微软提供了一个注册工具regsvr32.exe完成控件注册,在运行框中输入命令

            注册控件:regsvr32   组件所在路径

            卸载控件:regsvr32  /u  组件所在路径

            

        2.3 测试

          在开发过程中以及开发完成之后都可以使用ActiveX Control Test Container工具测试控件,Edit-->Insert New Control

          

      3. 使用★★★

        3.1 在窗口程序中使用

          右击窗口对话框的空白处,选择Insert ActiveX Control菜单,弹出插入控件对话框,选择控件即可。

          打开类向导对话框,为控件绑定成员变量即可,像使用一般控件一样使用ActiveX控件。

          添加编辑框和按钮,完成相关功能

          先关代码:按钮中点击消息的处理   

    void CT45_UseMcdDlg::OnBnClickedCalculate()
    {
        UpdateData(TRUE);
        m_wndMcd.SetNumbers(m_nNum1, m_nNum2);
    }
    
    void CT45_UseMcdDlg::OnBnClickedDirection()
    {
        m_wndMcd.SetDirection(!m_wndMcd.GetDirection());
    }
    
    void CT45_UseMcdDlg::OnBnClickedAbout()
    {
        m_wndMcd.AboutBox();
    }

        运行结果:     

           

          

        3.2 在html页面中使用

         (1)ocx控件对应的是<object>标签

         (2)在标签中设置ocx空间的额clsid

         (3)在开发控件过程中,双击任何一个借口打开idl文件,在文件中找coclass,在关键字上面的描述块[]中,

               uuid就是控件id,即clsid

    二、COM的数据类型

      1. BSTR - 字符串类型

        1.1 使用基本函数

          #include  <altbase.h>

          使用前创建 - SysAllocString

          使用后释放 - SysFreeString

          基本函数的使用比较繁琐,为了简化操作,对BST类型的操作提出了封装类

        1.2 使用BSTR的封装类

          微软在ATL库中提供的封装类 - CComBSTR类

          标准C++提供的封装类 - _bstr_t类

          在封装类的构造函数包含了创建,在析构函数中包含了释放函数,还提供一些列操作字符串的函数。

      2. VARIANT - 可变类型

        本质上是一个结构体,包括类型和值两部分。

        typedef  struct  FARSTRUCT  tagVARIANT  VARIANT;

        typedef  struct  FARSTRUCT  tagVARIANT  VARIANTARG;

        typedef  struct  tagVARIANT

        {

          VARTYPE  vt;                          //表示类型

          unsigned  short  wReserved1;  //保留值

          unsigned  short  wReserved2;  //保留值

          unsigned  short  wReserved2;  //保留值

          union { ...... };                       //联合,表示各种不同类型的值

        };

        ATL库的封装类 - CComVariant

        标准C++的封装类 - _variant_t

      相关代码: 

    #include "stdafx.h"
    #include <atlbase.h>//微软atl库
    #include <comdef.h>//标准c++库
    
    
    //1 COM的字符串类型
    void TestBSTR()
    {
        //1 创建字符串
        BSTR bstrText = SysAllocString(L"Hello");
        //2 使用
        //......
        //3 释放字符串
        SysFreeString(bstrText);
    
        //4 封装类的使用
        CComBSTR bstrText2("Hello");
        printf("字符串长度:%d
    ", bstrText2.Length());
    
        _bstr_t bstrText3("Hello");
        printf("字符串长度:%d
    ", bstrText3.length());
    }
    
    //2 可变类型
    void Vaiant()
    {
        //1 使用可变类型表示整数100
        VARIANT varInt;
        varInt.vt = VT_I4;
        varInt.lVal = 100;
    
        //2 使用可变类型表示指向一个整数值的指针
        long nValue = 125;
        VARIANT varIntPtr;
        varIntPtr.vt = VT_BYREF | VT_I4;
        varIntPtr.plVal = &nValue;
    
        //3 封装类的使用
        CComVariant varInt2(100);
        _variant_t varInt3((long)100);
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        TestBSTR();
        Vaiant();
        return 0;
    }

       

  • 相关阅读:
    2251: [2010Beijing Wc]外星联络
    1500 后缀排序
    1492: [NOI2007]货币兑换Cash【CDQ分治】
    P3380 【模板】二逼平衡树(树套树)
    python opencv
    pycharm调试
    pycharm中选择python interpreter
    创建使用pycharm virtualenv
    reload函数
    python3编写发送四种http请求的脚本
  • 原文地址:https://www.cnblogs.com/csqtech/p/5745082.html
Copyright © 2020-2023  润新知