您的位置:首页 > WinForm >

微软官方 C# ActiveX control (CSActiveX)

2015-02-06 11:34 来源:未知编辑:admin点击:

下面文章主要对微软官方写的C# ActiveX control (CSActiveX)例子的关键代码做一下解释,源码请到论坛下载。

下载地址:C# ActiveX control (CSActiveX)例子
1. A C# ActiveX control.
Program ID CSActiveX.CSActiveXCtrl
CLSID_CSActiveXCtrl 80B59B58-98EA-303C-BE83-D26E5D8D6794
DIID_AxCSActiveXCtrl D4B8539E-3839-3913-8B1A-C551A9930864
DIID_AxCSActiveXCtrlEvents 901EE2A0-C47C-43EC-B433-985C020051D5
LIBID_CSActiveX 361188E4-99EB-4E43-A72F-C89451E756DD
  
  name Describtion
UI CSActiveXCtrl 主要的界面
Properties bool Visible 控件的属性
bool Enabled
int ForeColor
int BackColor
float FloatProperty 自定义属性
Methods void Refresh() Typical control methods
string HelloWorld() Custom methods
Events void Click(); 事件
void FloatPropertyChanging(float NewValue, ref bool Cancel); FloatProperty属性触发的事件。
第一步建项目

A.创建项目

STEP1。创建一个Visual C # /类库项目命名为Visual Studio 2008 csactivex。删除默认的Class1.cs文件

STEP2。为了使组件COM可见

首先,打开项目的属性。请在申请页面组件信息按钮,并选择“使组件COM可见”。这相当于在AssemblyInfo.cs装配属性对。

代码

assembly.cs文件做下面的修改

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(true)]


// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("361188e4-99eb-4e43-a72f-c89451e756dd")] guid通过工具生成



 

B.添加activexctrlhelper

activexctrlhelper提供辅助功能注册/取消注册ActiveX控件并有助于处理的重点和标志容器和控件

C.添加用户控件并将其作为一个ActiveX控件

STEP1。右键单击该项目并选择上下文菜单中添加用户控件。名称控制csactivexctrl。下一步,双击控件来打开其设计视图和设计用户界面

STEP2。在csactivexctrl.cs查看代码,添加一个公共接口命名axcsactivexctrl描述coclass csactivexctrl的COM接口。里面的界面,定义由ActiveX控件暴露的属性和方法。附上guidattribute的接口。GUID值可以使用工具/创建GUID生成并作为接口ID。

 [Guid("D4B8539E-3839-3913-8B1A-C551A9930864")]
    public interface AxCSActiveXCtrl
    {
        #region Properties


        bool Visible { get; set; }          // Typical control property
        bool Enabled { get; set; }          // Typical control property
        int ForeColor { get; set; }         // Typical control property
        int BackColor { get; set; }         // Typical control property
        float FloatProperty { get; set; }   // Custom property


        #endregion


        #region Methods


        void Refresh();                     // Typical control method
        string HelloWorld();                // Custom method
       
        #endregion
    }

这个接口主要是要现实的功能,主控件要实现在这接口

添加属性和方法都记录在下面的详细步骤。
STEP3。csactivexctrl.cs中,添加一个公共接口,axcsactivexctrlevents,描述控件的事件。里面的界面,定义事件的原型和分配dispid每。例如,
添加事件记录下面的详细步骤。
请注意dispid必须明确定义的每个事件,否则,回调地址不能找到激发该事件时。
下一步,指定一个GUID接口,事件ID,并定义接口类型为interfaceisidispatch。


   [Guid("901EE2A0-C47C-43ec-B433-985C020051D5")]
   [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
   // The public interface describing the events of the control
   public interface AxCSActiveXCtrlEvents
   {
       #region Events


       // Must explicitly define DISPID for each event, otherwise, the
       // callback address cannot be found when the event is fired.
       [DispId(1)]
       void Click();
       [DispId(2)]
       void FloatPropertyChanging(float NewValue, ref bool Cancel);


       #endregion
   }

这个是实现事件的接口,在下面会写在主类的哪个地方用到



下面是主类的部分代码主要写一下核心的要注意的

1.类的开头


    [ClassInterface(ClassInterfaceType.None)]  //必须的直接写上就行了
    [ComSourceInterfaces(typeof(AxCSActiveXCtrlEvents))]   //实现的事件,上面说的到事件接口,如果不提供事件可以省
    [Guid("80B59B58-98EA-303C-BE83-D26E5D8D6794")]   //classid  控件的idhtml里调用需要
    public partial class CSActiveXCtrl : UserControl, AxCSActiveXCtrl  //控件提供的属性和方法AxCSActiveXCtrl  必须定义在接口里的才能显示
    {



 

  #region ActiveX Control Registration  控件注册和反注册类,代码在下载里提供 必须的,不能少,直接复制就行

        // These routines perform the additional COM registration needed by
        // ActiveX controls

        [EditorBrowsable(EditorBrowsableState.Never)]
        [ComRegisterFunction()]
        public static void Register(Type t)
        {
            try
            {
                ActiveXCtrlHelper.RegasmRegisterControl(t);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message); // Log the error
                throw;  // Re-throw the exception
            }
        }

        [EditorBrowsable(EditorBrowsableState.Never)]
        [ComUnregisterFunction()]
        public static void Unregister(Type t)
        {
            try
            {
                ActiveXCtrlHelper.RegasmUnregisterControl(t);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message); // Log the error
                throw; // Re-throw the exception
            }
        }

        #endregion