c++和MFC 交互通过lua脚本实例

来源:互联网 发布:淘宝哪家mcm高仿 编辑:程序博客网 时间:2024/06/10 12:01
width = 600height = 400local pathdlg =1000local contendlg = 1002--alert(getText(1000))function Load()   local path = getText(pathdlg);     --alert(txt);   local inp = io.open(path, "rb") //去读取文件 如 main.lua   local data = inp:read("*all")//读取整个文件的内容   setText(contendlg, data)end


// my_lua_mfcDlg.cpp : 实现文件//#include "stdafx.h"#include "my_lua_mfc.h"#include "my_lua_mfcDlg.h"#include "afxdialogex.h"#include <iostream>#include <stdio.h>using namespace std;extern "C"   //包含lua的库 头文件{#include <lua.h>#include <lauxlib.h>#include <lualib.h>};#ifdef _DEBUG#define new DEBUG_NEW#endiflua_State* lua;// Cmy_lua_mfcDlg 对话框Cmy_lua_mfcDlg::Cmy_lua_mfcDlg(CWnd* pParent /*=NULL*/): CDialogEx(Cmy_lua_mfcDlg::IDD, pParent){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void Cmy_lua_mfcDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(Cmy_lua_mfcDlg, CDialogEx)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, &Cmy_lua_mfcDlg::OnBnClickedButton1)ON_BN_CLICKED(IDCANCEL, &Cmy_lua_mfcDlg::OnBnClickedCancel)END_MESSAGE_MAP()#include <atlconv.h>static Cmy_lua_mfcDlg* dlg;int alert(lua_State* lua)  //打印{size_t len;const char* msg = lua_tostring(lua, 1, &len);USES_CONVERSION;MessageBox(0, A2W(msg), L"lua msg", 0);return 0;}// Cmy_lua_mfcDlg 消息处理程序int getText(lua_State* lua){int id = 0;id = lua_tonumber(lua, 1);CString path;dlg->GetDlgItem(id)->GetWindowTextW(path);USES_CONVERSION;char* p = T2A(path);lua_pushstring(lua, p);return 1;}int setText(lua_State* lua){int  id = lua_tonumber(lua, 1);const char* txt = lua_tostring(lua, 2);USES_CONVERSION;dlg->GetDlgItem(id)->SetWindowTextW(A2W(txt));return 0;}BOOL Cmy_lua_mfcDlg::OnInitDialog(){dlg = this;CDialogEx::OnInitDialog();// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);// 设置大图标SetIcon(m_hIcon, FALSE);// 设置小图标//开启lua lua = lua_open();luaopen_base(lua);luaopen_table(lua);luaopen_string(lua);luaL_openlibs(lua);lua_register(lua, "getText", getText);lua_register(lua, "alert", alert);lua_register(lua, "setText", setText);if (luaL_loadfile(lua, "mymfc.lua")){cout<<"loadfile failed"<<lua_tostring(lua, -1)<<endl;return TRUE;}if (lua_pcall(lua, 0, 0, 0)){cout<<"pcall failed"<<lua_tostring(lua, -1)<<endl;return TRUE;}//获取lua的配置lua_getglobal(lua, "width");  //获取lua配置的宽高int  w = lua_tonumber(lua, -1);lua_pop(lua, 1);lua_getglobal(lua, "height");int h = lua_tonumber(lua, -1);lua_pop(lua, 1);this->MoveWindow(0, 0, w, h);  //设置窗口的 宽高// TODO: 在此添加额外的初始化代码return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE}// 如果向对话框添加最小化按钮,则需要下面的代码//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,//  这将由框架自动完成。void Cmy_lua_mfcDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。HCURSOR Cmy_lua_mfcDlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}void Cmy_lua_mfcDlg::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码lua_getglobal(lua, "Load");lua_pcall(lua, 0, 0, 0);}void Cmy_lua_mfcDlg::OnBnClickedCancel(){// TODO: 在此添加控件通知处理程序代码CDialogEx::OnCancel();}

原创粉丝点击