(1)首先下载lua的源码,创建一个DLL工程,将src目录复制到工程目录下,并将除lua.c、lua.h、luac.c、luac.h外的所有文件,分别添加到头文件和源文件中去。
(2)关闭预编译头
(3)预处理里添加:LUA_BUILD_AS_DLL
#include "lua.hpp" static int add(lua_State *L) { double op1 = lua_tonumber(L, -1);//从栈上获取数据 double op2 = lua_tonumber(L, -2); lua_pushnumber(L, op1 + op2);//结果入栈 return 1; } static const luaL_Reg work[] = { { "add", add }, { NULL, NULL } }; int GetLib(lua_State* L) {//创建模块 luaL_newlib(L, work); return 1; //return one value } int main() { lua_State *L = luaL_newstate(); luaL_openlibs(L); //注册模块 luaL_requiref(L, "Scale", GetLib, 1); luaL_dofile(L, "1.lua");//加载执行lua文件 lua_close(L); getchar(); return 0; }
1.lua文件内容如下:
require "Scale" print "调用C语言函数,计算两个数相加" a = Scale.add(1,2) print (a)
(4)lua调用C++函数,获取窗口控件内容
//定义全局的窗口指针变量,可在窗口构造函数中初始化 CLuadialogDlg * pDlg; static int msgbox(lua_State *L) { //从lua文件中获取字符串参数值 const char * p1 = lua_tostring(L, -1); const char * p2 = lua_tostring(L, -2); ::MessageBox(0, CString(p1), CString(p2), MB_OK + MB_ICONINFORMATION); return 1; } static int gettext(lua_State * L) { //从lua脚本中获取参数 double id = lua_tonumber(L, -1); CWnd * pWnd = pDlg->GetDlgItem(id); CString strTemp; pWnd->GetWindowText(strTemp); USES_CONVERSION; //将结果压栈,传给lua脚本 lua_pushstring(L, W2A(strTemp)); return 1; } static int settext(lua_State * L) { //从lua脚本中获取参数 double id = lua_tonumber(L, -1); const char * szText = lua_tostring(L, - 2); CWnd * pWnd = pDlg->GetDlgItem(id); USES_CONVERSION; pWnd->SetWindowText(A2W(szText)); return 1; } static const luaL_Reg work[] = {//模块映射表 { "msgbox", msgbox }, {"gettext",gettext}, {"settext",settext}, { NULL, NULL } }; int GetLib(lua_State* L) {//创建模块 luaL_newlib(L, work); return 1; //return one value } void CluadialogDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 lua_State *L = luaL_newstate(); luaL_openlibs(L); //注册模块 luaL_requiref(L, "Scale", GetLib, 1); luaL_dofile(L, "gettext.lua");//加载执行lua文件 lua_close(L); } void CluadialogDlg::OnBnClickedButton2() { lua_State *L = luaL_newstate(); luaL_openlibs(L); //注册模块 luaL_requiref(L, "Scale", GetLib, 1); luaL_dofile(L, "the.lua");//加载执行lua文件 lua_close(L); }
GetText.lua的文件内容如下:
require "Scale" --引入模块 strEdit= Scale.GetEditText(1001)--1001为控件的ID Scale.msgbox("提示",strEdit)--在lua显示出控件内容
(5)C++中操作lua中的表,实现多个数据传递
如获取控件的坐标,C++函数如下:
int CScale3DCLuaControl::getpos(lua_State *L) { if (!pWeightDlg)return 0; double id = lua_tonumber(L, -1); CWnd *pWnd = pWeightDlg->GetDlgItem(id); if (pWnd) { CRect rt; pWnd->GetWindowRect(rt); ScreenToClient(pWeightDlg->GetSafeHwnd(), &rt.TopLeft()); lua_getglobal(L, "point"); //获取表名 lua_pushstring(L, "x"); //键名 lua_pushnumber(L, rt.left); //值 lua_settable(L, -3); //设值成键值对,并出栈 lua_pushstring(L, "y"); //下一对键值组合 lua_pushnumber(L, rt.top); lua_settable(L, -3); //将这一对键值设成元素 } return 0; }
.lua文件的内容如下:
require "Scale" --引入称重模块 point={x=100,y=200}--声明表 Scale.getpos(15009)--获取坐标 --在lua显示出控件内容 Scale.msgbox("提示","你好,这是提示信息!"..point.x..","..point.y)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。