c# 实现控件(ocx)中的事件详解

c#控件实现类似c++中ocx控件功能

c++中ocx控件

1、控件方法

2、控件事件

c#很容易实现c++中ocx中控件方法的功能,但是实现类似c++中ocx的控件事件,则需要一定的周折。

下面就用实例简单的介绍c#如何实现

c#中ActiveX(ocx)实现实例(vs2008环境下):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
namespace simOCX
{
//代理
  public delegate void RecvMsgHandler(string msg);
  public delegate void SimpleHandler();
  public delegate void ChangeHandler(int value);
  [GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967")]
  [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
  public interface ControlEvents
  {

    [DispIdAttribute(0x001)]
    void OnRecvMsg(string msg);
    [DispIdAttribute(0x002)]
    void OnRecordStopped();
    [DispIdAttribute(0x003)]
    void OnRecordVolumeChanged(int value);
  }
  //控件的uuid,这个uuid需要手动添加,添加方法为(vs2008):工具--->创建GUID,如果找不到,在外部对象中查找一下。
  [Guid("C170DCDB-43C5-4a90-A984-95D9719EDA11")]
  //指示应用该属性的对象对COM可见
  [ComVisible(true)]
  //将事件接收接口连接到托管类
  [ComSourceInterfacesAttribute(typeof(ControlEvents))]
  public partial class simOCX : UserControl
  {
//定义事件
    public event RecvMsgHandler OnRecvMsg;
    public event SimpleHandler OnRecordStopped;
    public event ChangeHandler OnRecordVolumeChanged;
    public simOCX()
    {
      InitializeComponent();
    }
    //方法
    public void setValue(string value)
    {
      //事件调用
      OnRecordStopped();
      OnRecvMsg(value);
      OnRecordVolumeChanged(20);
    }
  }
}

以上程序集编辑生成后,生成*.dll。下面是使用两种方式调用此dll:

一种,网页调用,此控件即为ActiveX控件:

htm中代码:

<html>
<head>
<title></title>
<object id="Notify" classid="clsid:C170DCDB-43C5-4a90-A984-95D9719EDA11"></object>
//以下是调用控件的事件
<script language="javascript" for="Notify" event="OnRecordVolumeChanged(value)">
 MyDiv.innerHTML= 'In javascript: Get Volume:'+value;
 </script>
<script language="javascript" for="Notify" event="OnRecvMsg()">
alert("started");
 MyDiv.innerHTML= 'In javascript: OnRecvMsg';
 </script>

 <script language="javascript" for="Notify" event="OnRecordStopped()">
 alert("stopped");
 MyDiv.innerHTML= 'In javascript: OnRecordStopped';
 </script>
</head>
<body>

<form>
 <script language="javascript" type="text/jscript">
      function Button1_onclick() {
        Notify.setValue("value");//调用控件方法
      }
</script>
 <div id="MyDiv">Nothing happened</div>
 <input id="Button1"type="button"value="Start"οnclick="Button1_onclick()"/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <input id="Button2"type="button"value="Stop"οnclick="Button2_onclick()"/></p>
</form>
</body>
</html>

再一种,c#winform程序调用,此控件即类似为ocx控件:

c#winform部分代码:

public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }
    private void btn_Click(object sender, EventArgs e)
    {
      if (!this.tbSendMsg.Text.Trim().Equals(""))
      {
        simOCX.setValue(this.tbSendMsg.Text.Trim());//调用控件方法
      }
    }
    private void simOCX_OnRecvMsg(string msg)//调用控件事件
    {
      MessageBox.Show(msg);
    }
    private void simOCX_OnRecordStopped()//调用控件事件
    {
      MessageBox.Show("testttt");
    }
  }

补充知识:c#如何绑定dll或者ocx组件中的事件

主要流程

1.注册(regsvr32)将要引用的组件(dll或者ocx)

2.引用将要调用的组件(dll或者ocx)

3.查看组件中事件的函数的声明原型(并在项目中定义响应的函数原型与之对应,便于后面进行事件绑定)

4.代码如下(分为两种方式,一种是通过tlbimp.exe工具导出成公共语言运行库程序集(可能我描述的不正确,见谅,如何导出请自行搜索方法),另一种不经过转换,使用原文件)

#define IS_TLBIMP
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
  public partial class Form1 : Form
  {
    public delegate void RecvDataEvent(short datalen, short Slaveaddress, ref float[] data);
    public void RecvData03Event(short datalen, short Slaveaddress, ref float[] data)
    {

      Console.WriteLine(datalen);
    }

    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {

#if IS_TLBIMP
      test_modbus_csharp.modbusClass modbus = new test_modbus_csharp.modbusClass();
      modbus.initmscom(12, "9600,n,8,1");
      modbus.RecData03debug += new test_modbus_csharp.__modbus_RecData03debugEventHandler(RecvData03Event);
      //modbus.RecData03debug += new test_modbus_csharp.__modbus_RecData03debugEventHandler(new RecvDataEvent(RecvData03Event));
      modbus.debug_info();
      modbus.ClosePort();
#else
      test_modbus.modbusClass modbus = new test_modbus.modbusClass();
      modbus.initmscom(12, "9600,n,8,1");
      modbus.RecData03debug += new test_modbus.__modbus_RecData03debugEventHandler(RecvData03Event);
      //modbus.RecData03debug += new test_modbus.__modbus_RecData03debugEventHandler(new RecvDataEvent(RecvData03Event));
      modbus.debug_info();
      modbus.ClosePort();
#endif
    }
  }
}

以上这篇c# 实现控件(ocx)中的事件详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • c#调用vc写的ocx控件示例

    在c#中怎样调用VC写的OCX控件,主要有两个关键环节 两个关键环节:导入ocx控件,创建实例. 1 注册ocx: 复制代码 代码如下: regsvr32.exe alasunsmscon.ocx 2 在CMD窗口中执行: 复制代码 代码如下: AxImp.exe alasunsmscon.ocx 生成两个文件:alasun.dll,Axalasun.dll 3 在项目中引用Axalasun.dll 4 调用 复制代码 代码如下: Axalasun.Axalasunsms sms = new A

  • C#编程读取文档Doc、Docx及Pdf内容的方法

    本文实例讲述了C#编程读取文档Doc.Docx及Pdf内容的方法.分享给大家供大家参考.具体分析如下: Doc文档:Microsoft Word 14.0 Object Library (GAC对象,调用前需要安装word.安装的word版本不同,COM的版本号也会不同) Docx文档:Microsoft Word 14.0 Object Library (GAC对象,调用前需要安装word.安装的word版本不同,COM的版本号也会不同) Pdf文档:PDFBox /* 作者:GhostBea

  • 基于C#调用OCX控件的常用方法(推荐)

    小伙伴们在使用ICP提供的各种能力进行集成开发时常常会遇到一些技术上的困扰,例如ICP中很多接口是通过OCX控件的方式提供的,如何调用这些接口,就成了一个不大不小的问题,毕竟开发指南上可没这些内容啊~别着急,今天我就给大家介绍一下C#中调用OCX接口的常用方法.^_^y 开发环境:win7企业版,vs2010 控件:以voice.ocx为例 一.Winform工程中调用OCX控件 1.使用regsvr32控制台命令注册控件: 1.1 打开控制台,进入控件存放路径 1.2 输入控制台命令:regs

  • c# 实现控件(ocx)中的事件详解

    c#控件实现类似c++中ocx控件功能 c++中ocx控件 1.控件方法 2.控件事件 c#很容易实现c++中ocx中控件方法的功能,但是实现类似c++中ocx的控件事件,则需要一定的周折. 下面就用实例简单的介绍c#如何实现 c#中ActiveX(ocx)实现实例(vs2008环境下): using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using

  • Android 控件自动贴边实现实例详解

    目录 正文 判断交互 隐藏与显示 示例 正文 最近接到个需求,需要在用户与App交互时,把SDK中之前实现过的悬浮控件贴边隐藏,结束交互后延迟一段时间再自动显示.本篇文章介绍一下实现的思路. 判断交互 用户与App交互.结束交互可以通过监听触摸事件来实现.建议使用的Activity的dispatchTouchEvent,Activity下的所有触摸事件分发时都会回调此方法,代码如下: class AutoEdgeHideActivity : BaseGestureDetectorActivity

  • Android 倒计时控件 CountDownView的实例代码详解

    一个精简可自定义的倒计时控件,使用 Canvas.drawArc() 绘制.实现了应用开屏页的圆环扫过的进度条效果. 代码见https://github.com/hanjx-dut/CountDownView 使用 allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { implementation 'com.github.hanjx-dut:CountDownView:1.1'

  • Android开发中使用WebView控件浏览网页的方法详解

    本文实例讲述了Android开发中使用WebView控件浏览网页的方法.分享给大家供大家参考,具体如下: 项目中遇到数学展示问题,常规的Textview显示处理不了数学公式,利用图片生成对服务器又产生较大压力,经过查询,可以通过webview加载JS实现.IOS同样的方法也可实现,但JS渲染效率远高于安卓.对Webview做下总结. 1.WebView 在使用WebView控件时,首先需要在xml布局文件中定义一个WebView控件,定义的方法如下: <WebView android:id=&quo

  • 分析10个ASP.NET控件最有用的属性详解

    1.ClientIDMode 渲染ASP.NET控件时会自动生成一个ID,当我们在客户端脚本中引用它们时,却会制造不少麻烦,虽然它是命名容器和ID的简单串联,但仍然无法预测生成的ID范围. ASP.NET 4.0使用ClientIDMode属性解决了这个问题,它允许你控制生成这些ID的方法,ClientIDMode有四个可选择的值:AutoID,Static,Predictable和Inherit.下面是这四个值的含义解释: AutoID – 和4.0以前的版本保持一致,自动生成ID. Stat

  • React Native学习教程之Modal控件自定义弹出View详解

    前言 最近在学习RN,好多知识都懒得写,趁今天有空,来一发吧,Modal控件的一个小demo:下面话不多说了,来一起看看详细的介绍吧. 参考文章地址:http://reactnative.cn/docs/0.27/modal.html#content Modal组件可以用来覆盖包含React Native根视图的原生视图(如UIViewController,Activity). 在嵌入React Native的混合应用中可以使用Modal.Modal可以使你应用中RN编写的那部分内容覆盖在原生视

  • Android控件之ListView用法实例详解

    本文实例讲述了Android控件之ListView用法.分享给大家供大家参考.具体如下: 示例一: 在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示. main.xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/LinearLayout01" androi

  • Android 控件(button)对齐方法实现详解

    1,android:orientation 布局方向.horizontal是让所有的子元素按水平方向从左到右排列, vertical是让所有的子元素按竖直方向从上到下排列. 2,android:gravity 与 android:layout_gravity的区别android:gravity是指定本元素的子元素相对它的对齐方式. android:layout_gravity是指定本元素相对它的父元素的对齐方式. 例如: 下面这里的linearlayout的android:gravity设为ri

  • JS控件bootstrap datepicker使用方法详解

    bootstrap-datepicker沙箱环境: bootstrap-datepicker沙箱环境: 1.requirejs配置 requirejs.config({ baseUrl: '../pages/modules', // urlArgs: "v=" + (new Date()).getTime(),//禁止缓存,生产环境去除 urlArgs:'v=2016110701', paths: { jquery: ["../../plugins/jquery/jquery

  • AngularJS 中的事件详解

    AngularJS 事件 AngularJS 有自己的 HTML 事件指令. ng-click 指令 ng-click 指令定义了 AngularJS 点击事件. AngularJS 实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.

随机推荐