使用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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章