// 脚本里注册某个控件的控件消息回调 // 脚本调用原型: // BOOL ViRegCtrlMsgCallBack(VApiHandle hWnd, string Msg, 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 ViRegCtrlMsgCallBack(HSQUIRRELVM v) { BOOL bRet = FALSE; VApiHandle hWnd = NULL; CControlUI* pCtrl = NULL; SQInteger nargs = sq_gettop(v); const SQChar* 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_STRING != 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_getstring(v, 3, &Msg); sq_getstring(v, 4, &pFunc); if (!pFunc || QiScriptMsgNameMaxLen < wcslen(pFunc)) {bRet = FALSE; goto _Exit_;} pCtrl->RegCtrlMsgToScript(Msg, pFunc); bRet = TRUE; _Exit_: sq_pushbool(v, bRet); return 1; }