Exemplo n.º 1
0
// 脚本里注册某个控件的系统消息回调
// 脚本调用原型:
// BOOL ViRegSysMsgCallBack(VApiHandle hWnd, int nMsg, string Func);
// 参数2为控件接收到的外部系统消息.其实还有控件内部的消息,这里不能注册,但能被接受到
// Func 的C原型为typedef int (FN_QiCallVmMsg)(HANDLE hHandle, int nMsg, int nSubMsg, int x, int y, int Key, SQInteger nOtherInfo, SQChar* sOtherInfo);
SQInteger ViRegSysMsgCallBack(HSQUIRRELVM v)
{
	BOOL           bRet          = FALSE;
	VApiHandle     hWnd          = NULL;
	CControlUI*    pCtrl         = NULL;
	SQInteger      nargs         = sq_gettop(v);
	int            Msg           = NULL;
	const SQChar*  pFunc         = NULL;
	PVOID          pMsgVmCallArr = NULL;

	ASSERT(nargs == 3 + 1 && v);
	if (!v || 3 + 1 != nargs) {bRet = FALSE; goto _Exit_;}

	QiTestArgs(v, 2);
	QiTestArgs(v, 3);
	QiTestArgs(v, 4);
	if (OT_INTEGER != sq_gettype(v, 2) ||
		OT_INTEGER != sq_gettype(v, 3) ||
		OT_STRING  != sq_gettype(v, 4))
	{bRet = FALSE; goto _Exit_;}

	sq_getinteger(v, 2, &hWnd);
	pCtrl = QiHwHandleToCtrl(hWnd); // 这里没验证控件指针的有效性,以后有时间再补上
	ASSERT(pCtrl);
	if (!pCtrl) {bRet = FALSE; goto _Exit_;}

	sq_getinteger(v, 3, &Msg);
	sq_getstring(v, 4, &pFunc);
	if (!pFunc || QiScriptMsgNameMaxLen < wcslen(pFunc)) {bRet = FALSE; goto _Exit_;}

    pCtrl->RegSysMsgToScript(Msg, pFunc);
	 
	bRet = TRUE;
	
_Exit_:
	sq_pushbool(v, bRet); 
	return 1;
}