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



一个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()的处理,其它地方的流程不需要做任何修改,所以方便简单

希望对大家有些帮助!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值