使用ATL开发ActiveX控件(添加事件,自己整理)

1、添加事件

在类视图中的XXXlib下面的_ICaleEvents中添加方法,带有钥匙标记的那个项(xxx为项目名,不要在类视图的根目录下找),根据需要选择有无参数、有无返回值,其中的参数是返回值,参数类型都是指针

在添加的控件类中,右击选择 添加连接点 ,注意选项,添加 _ICaleEvents后确定

控件的单击事件。首先添加windows消息处理函数,选择控件->属性 OnLButtonDown,点击。

在此函数中调用先前添加的方法即可。

//实现异步计算方式,并非真的异步。真异步需要采用多线程编程
STDMETHODIMP CCale::AddAsync(DOUBLE a, DOUBLE b)
{
	    double result;
            result = a + b;
            Fire_AddCompleted(&result);//调用添加的事件。
	return S_OK;
}

LRESULT CCale::OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
	Fire_mclick();//自定义的事件。当单击时,会触发此事件,在js中可监听此事件,然后进行编码
	return 0;
}


2、测试

在js中测试

<script type="text/javascript">
    function addAsync() {        
        //调用有返回值的事件,增加事件监听的方式。这个事件是在AddAsync()方法中触发的事件。
        Cale.attachEvent("AddCompleted", OnAddCompleted);
        Cale.AddAsync(33, 4);
    }

    function OnAddCompleted(result) {
        alert(result);
    }

    function call(a, b) {
        alert(a + b);
    }  
   
</script>
<!--调用无返回值的事件,单击控件时触发-->
 <SCRIPT type="text/javascript" FOR="Cale" EVENT="mclick()" > 
    call(1,2)
</SCRIPT> 

==========================================================

js调用ActiveX中的方法,然后再ActiveX的被调用的方法中调用js中的方法

STDMETHODIMP CAJCom::CallWebJs(VARIANT scriptCallback)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	// TODO: 在此添加实现代码

	CComPtr<IDispatch> spCallback;
	if (scriptCallback.vt == VT_DISPATCH)
		spCallback = scriptCallback.pdispVal;

	CComVariant avarParams[1];

	avarParams[0] = "hhheeee"; //指定回调函数的参数

	DISPPARAMS params = { avarParams, NULL, 1, 0 };

	if(spCallback)

		spCallback->Invoke(0, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL);

	return S_OK;
}

js测试

<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
<TITLE>对象 AJCom 的 ATL 8.0 测试页</TITLE>
</HEAD>
<BODY>


<OBJECT ID="AJCom" CLASSID="CLSID:C81FBB52-8890-4E99-9F54-F64BA14C015B"></OBJECT>
<INPUT TYPE="Button" NAME="btnAddMode3" VALUE="开启捕捉3" οnclick="test()">
	 
	<script type="text/javascript"  language="JavaScript">
	//------------------------------------------------
	    function test() {
		    var result = AJCom.CallWebJs(printMsg);
        }

        function printMsg(msg) {
            alert(msg);
        }
  	</script>

</BODY>
</HTML>

测试没问题

========================================

在多线程中ActiveX和JS交互请参照,是上述第二种方式的扩展

http://blog.csdn.net/chenscmail/article/details/8670985



发布了16 篇原创文章 · 获赞 5 · 访问量 32万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章