web中接收不到自定义控件事件的简单解决方案(修改控件)

By | 12月11日
Advertisement



一个MFC写的视频控件,需要提供给客户进行客户端开发。

不同客户的需求有很大的不同,最显著的一个特点就是要适应不同的语言,比如VC++、C#、Delphi、WEB,等 等

其中使用起来最简单的是VC++,其它的或多或少总是有点点问题

比如:

C#,由于传递结构和指针很麻烦,所以只能把多个参数从结构体中分开一个一个放到接口/事件中

Delphi在把控件导入到IDE时,有时候不成功

WEB无法接收到控件的事件

问题不一而足

最近几天准备做个web的demo,使用javascript,接口调用一切正常,没有问题,但是有另外的问题,就是在javascript里无法接收到控件发出的事件。这有点奇怪,在vc++、C#、Delphi里都正常,为什么在web里无法接收?

度伯一把,终于发现了一些端倪,web似乎不能接收线程中触发的事件,后进行如下的验证:

在视频的一个接口A中进行事件的触发,在web里调用该接口A,结果事件触发了!

后再度伯度伯,也没啥收获,有一个csdn的同样的问题解决了,但楼主可怜的不敢把解决办法说出来,望贴幸叹,还有一篇,说要去ms站上下个文件进行修改,然后程序的所有事件触发都要修改,和我的代码对比了一下,根本就没有文章中说的那些代码,只好另寻其它的解决办法了

后来问了其他的同事,再搜索搜索,终于发送了一个简单的处理办法。

在原来触发事件的接口里,通过向控件窗体发送消息的办法就可以解决了,这样在窗口的消息循环里处理就是在主线程里处理了,web里就可以接收到消息了

修改前的流程:

// 由底层模块进行的状态调用,其调用控件的函数里进行事件触发
UINT32 CALLBACK prevEvent( UINT32 lUserData, MYMSG_INFO *pMsg )
{
    COcxCtrl *pCtrl = (COcxCtrl*)lUserData;
    return pCtrl->Process_Event( pMsg );
}

UINT32 COcxCtrl::Process_Event( MYMSG_INFO *pMsg )
{
    StateNotify( pMsg->datatype, pMsg->cmd );

    return 0;
}

void COcxCtrl::StateNotify(INT32 data_type, BSTR cmd_str)
{
    try
    {
        FireEvent(eventidStateNotify, EVENT_PARAM(VTS_I4 VTS_BSTR), data_type, cmd_str );
    }
    catch ( CException *e )
    {
    }
}

修改后的流程:

#define    UM_EVENT    (WM_USER+101)

// 由底层模块进行的状态调用,其调用控件的函数里进行事件触发
UINT32 CALLBACK prevEvent( UINT32 lUserData, MYMSG_INFO *pMsg )
{
    COcxCtrl *pCtrl = (COcxCtrl*)lUserData;
    return pCtrl->SendMessage( UM_EVENT, (WPARAM)pMsg );
}

UINT32 COcxCtrl::Process_Event( MYMSG_INFO *pMsg )
{
    StateNotify( pMsg->datatype, pMsg->cmd );

    return 0;
}

LRESULT COcxCtrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    // TODO: 在此添加专用代码和/或调用基类
    if ( message == UM_EVENT )
    {
        MYMSG_INFO *pMsg = (MYMSG_INFO*)wParam;
        return Process_Event( pMsg );
    }

    return COleControl::WindowProc(message, wParam, lParam);
}

void COcxCtrl::StateNotify(INT32 data_type, BSTR cmd_str)
{
    try
    {
        FireEvent(eventidStateNotify, EVENT_PARAM(VTS_I4 VTS_BSTR), data_type, cmd_str );
    }
    catch ( CException *e )
    {
    }
}

修改后,中间只是添加了一个WindowProc()的处理,其它地方的流程不需要做任何修改,所以方便简单

希望对大家有些帮助!



Similar Posts:

  • 使用自定义控件的方式实现一个分页控件

    一.概述 在web开发中,常常需要显示一些数据,而为了方便排版及浏览,我们只需要显示所有记录中的一部分.一般情况下,我们采用分页来实现这个需求.实现分页的方法多种多样,在本文中,我们采用了一个分页空间来记录记录总数.当前页.总页数及页面大小等.为了有一个直观上的印象,先展示该控件运行后的效果,效果如下图所示: 二.实现方案 为了实现该效果图,在asp.net中,可以使用Custom Controls and User Controls两种方式,User Controls的实现方式及其简单,而且使

  • C#跨线程修改控件——从MSIL和汇编看Invoke, 多线程, 事件与事件委托

    C#跨线程修改控件--从MSIL和汇编看Invoke, 多线程, 事件与事件委托 原创性声明 相信大家刚开始写winform的时候都遇到过这样的问题,当跨线程修改控件属性时会遇到如下的异常: 线程间操作无效: 从不是创建控件"progressBar1"的线程访问它. 这是相应的产生上述异常的代码: 1 #region Auto-Generated Properties 2 3 // DelegateDemo - Director.cs 4 // by Wings 5 // Last M

  • java笔记--使用事件分配线程更新Swing控件

    使用事件分配线程更新Swing控件: Swing并不是线程安全的,如果在多个线程中更新Swing控件,则很可能造成程序崩溃. 为了避免这种问题,可以使用时间分配线程来更新Swing控件. EventQueue 是一个与平台无关的类,它将来自于底层同位体类和受信任的应用程序类的事件列入队列. 它封装了异步事件指派机制,该机制从队列中提取事件,然后通过对EventQueue调用dispatchEvent(AWTEvent) 方法来指派这些事件(事件作为参数被指派).该机制的特殊行为是与实现有关的.为

  • 关于在ViewDidLoad中修改控件的位置大小无效的问题

    在ViewDidLoad中修改的控件的大小和位置,但是在显示时却并没有按照想法显示. 这是由于在StoryBoard的加载中,有时会在ViewDidLoad执行之后,将控件的位置大小进行重置,使其按照storyboard中的位置大小显示. 解决方法: 重写ViewDidLayoutSubviews方法或viewWillAppear方法,在其中加入改变空间位置大小的语句.

  • 关于web中javascript不能响应ActiveX事件

    rt,这个问题困扰了我很久,如果用应用程序去调用这个控件都是没问题的,并且触发事件的地方在web中也的确走到了,一开始以为是IE版本升级造成了安全限制,后来用IE6调试发现仍然同样存在问题,于是到处搜索资料,问人,大家都说可以响应,javascript也按照各种建议修改,最后还不无功而返. 于是沉静一下决定从头开始理顺,重新建一个工程,最简单的空间方法和事件,然后写一个最简单的web,最正常的javascript,发现居然没做任何修改就可以响应时间. 于是拿来出问题的那个工程,屏蔽掉复杂的操作,

  • 委托与事件的应用---翻页控件

    在用户自定义的翻页控件中,需要定义委托事件,然后在引用处来响应简单来说可分为二个部份:一.自定义控件 首先定义如下的定义委托事件 #region 定义委托事件 public delegate void PageChangeEvent(); public event PageChangeEvent pageChangeEvent; #endregion 然后在按钮事件中(如下一页按钮的Click事件)加上如下的声明代码 private void PageChange_Next_Click(obje

  • GridView中 对数据编辑打开一个新页面 & 动态添加控件并获取其值

    1. GridView对数据的绑定有非常强悍的功能 ,也非常好用,我们经常用它来绑定数据,我们对数据也需要维护,通常是在GridView中放一个模板列,模板列中放一个按钮,点击此按钮,在 GridView的RowCommand事件中通过Response.Redrict()进行跳转到另一个页面进行编辑.例如: <asp:TemplateField HeaderText="管理"> <ItemTemplate> <asp:ImageButton ID=&quo

  • Android自定义控件(一)自绘控件

    由于公司项目的需求,需要绘制一条竖直的间断线作为分割线.这个可坑了爹了,以前只搞过水平的间断线,只要通过shape也可以简单的画出来,但是千万记得把hardwareAccelerated给关了,不然水平的虚线还是会是实线,这个以前也是我趟过的一个坑.那咋办呢,找不到原生的解决方案,不就是一条简单的间断线嘛,还能难住我等程序猿?这个时候,首先联想到的就是自绘控件了. 自绘控件,顾名思义就是控件所展示的内容都是我们自己绘制上去的.所有的绘制操作就是在onDraw()方法里面进行的,当然我们的这个自定

  • android自定义控件-AutoScrollViewpager(无限滚动轮播控件)

    在实现该控件之前,先说一下该控件的难度, 一. 每个item中如果有RadioButton之类,可以focus焦点的,点击效果可能会失效 二.无限的滚动 下面是效果图: 实现上图的效果,一共自定义了两个 控件,viewpager+底部导航图标 下面我先来讲解一下,viewpager的实现: 1.初始化 <pre name="code" class="java">/** 点击按下的坐标 **/ PointF downP = new PointF(); /*

  • iOS开发中的错误整理,关于用绑定Tag取控件的注意事项,有时候不绑定也是个错!

    如图:红色框中是个自定义的导航工具条titlesView(没有绑定Tag),工具条中有五个按钮(按钮绑定了Tag)以及一个红色的指示器indicatorView(没有绑定Tag),下面的蓝色是可以滚动的scrollView,拖动scrollView,红色指示器会滚到对应按钮的下面,并且按钮呈红色显示. 在scrollView的代理方法scrollViewDidEndDecelerating:中通过 获得按钮首先注意的一点是,当指定的Tag为0时,会默认首先拿到的是调用这个方法的控件,也就是父控件

Tags: