温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

在VS2015中使用lua语言

发布时间:2020-07-15 17:37:31 来源:网络 阅读:1287 作者:Chinayu2014 栏目:编程语言

(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)


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI