<采用了单继承的类的导出> 这个……,tolua++支持采用了单继承的类的直接导出,在lua中可以像在C++中那样访问基类的方法。和其它简单类的导出没什么区别。 只是个简单的示例,我们定义一个控件基类,从它派生一个按钮类。然后在lua中分别访问基类和按钮类的方法。我们导出一个全局变量lbutton,同时也在lua中生成一个新button。 先看实际的头文件inheritance.h,我把实现也写在了头文件里。
g_button的实例定义在main函数所在的文件中。 下面是inheritance.pkg文件:
对于基类CAUIControl,只导出部分方法,不导出构造函数,不允许在Lua中直接生成其实例。派生类CAUIButton可以在lua中生成实例。CAUIButton重写了基类的SetAlpha函数也增加了一些新的函数,如设置纹理函数SetTexture。 全局变量的导出很简单,
extern
CAUIButton g_button@lbutton;一个语句就可以了。我们还可以为其加上tolua_readonly修饰符。我把它重名为lbutton。 好了,下面用tolua++.exe生成inherit.cpp文件:
接下来是驱动文件inheritance.cpp:
相当简单,和前面几个几乎一样,唯一变化的是多了个全局变量。 最后是inheritance.lua文件:
大功告成了,几乎没有任何新意。不过还是验证了一点东西,仅此而已。 接下来要演示如何呼叫lua脚本中的函数,并向其传递参数,在该lua函数中对参数进行类型转换,然后呼叫其特定方法。
#ifndef _CLASS_INHERITANCE_H
#define
_CLASS_INHERITANCE_H
#define
WIN32_LEAN_AND_MEAN
#include
<
windows.h
>
#include
<
string
>
typedef
enum
{ AUICSNormal = 0, AUICSHover = 1, AUICSPushed = 2, AUICSDisabled = 3, AUICSHide = 4, AUICSFORCEDOWRD = 0xFFFFFFFF }
AUIControlState;
class
CAUIControl
{ public: //should not be called from lua scripts CAUIControl():m_nID(-1), m_state(AUICSNormal), m_bVisible(true), m_bEnable(true), m_fAlpha(0.0f),m_strText("") {} virtual ~CAUIControl(){} public: //tolua void SetID(int nID){ m_nID = nID; } int GetID(){ return m_nID; } void SetText(char * szText){ m_strText = szText; } const char * GetText(){ return m_strText.c_str(); } void SetPosition(POINT pt){ m_position = pt; } POINT GetPosition(){ return m_position; } void SetSize(SIZE sz){ m_size = sz; } SIZE GetSize(){ return m_size; } void SetVisible(bool bVisible){ m_bVisible = bVisible; } bool IsVisible(){ return m_bVisible; } void SetEnabled(bool bEnable){ m_bEnable=bEnable; } bool IsEnabled(){ return m_bEnable; } void SetAlpha(float fAlpha){ m_fAlpha=fAlpha; } float GetAlpha(){ return m_fAlpha; } public: //should not be called from lua scripts virtual void Render() = 0; virtual bool MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){return false;} protected: int m_nID; AUIControlState m_state; bool m_bVisible; bool m_bEnable; POINT m_position; SIZE m_size; float m_fAlpha; std::string m_strText; }
;
class
CAUIButton :
public
CAUIControl
{ public: CAUIButton():m_pTexture(NULL) {} virtual ~CAUIButton(){} public: void SetTexture(char * szFile){} void SetTextureRects(const RECT & rcNormal, const RECT &rcHover, const RECT &rcPushed, const RECT& rcDisabled){} void SetAlpha(float fAlpha){ m_fAlpha = fAlpha; printf("CAUIButton::SetAlpha, extra process here! "); } public: void Render(){printf("CAUIButton::Render ");} bool MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ printf("CAUIButton::MsgProc "); return false;} protected: void * LoadTexture(char * szTextureFile){return NULL;} void * m_pTexture; RECT m_rects[4]; }
;
extern
CAUIButton g_button;
#endif
$#include
"
inheritance.h
"
class
CAUIControl
{ public: //tolua void SetID(int nID); int GetID(); void SetText(char * szText); const char * GetText(); void SetPosition(POINT pt); POINT GetPosition(); void SetSize(SIZE sz); SIZE GetSize(); void SetVisible(bool bVisible); bool IsVisible(); void SetEnabled(bool bEnable); bool IsEnabled(); void SetAlpha(float fAlpha); float GetAlpha(); }
;
class
CAUIButton :
public
CAUIControl
{ public: CAUIButton(); virtual ~CAUIButton(); public: void SetTexture(char * szFile); void SetTextureRects(const RECT & rcNormal, const RECT &rcHover, const RECT &rcPushed, const RECT& rcDisabled); void SetAlpha(float fAlpha); }
;
extern
CAUIButton g_button@lbutton;
tolua
++
.exe
-
n inherit
-
o inherit.cpp inheritance.pkg
#include
"
lua.hpp
"
#include
"
inheritance.h
"
int
tolua_inherit_open(lua_State
*
); CAUIButton g_button;
int
_tmain(
int
argc, _TCHAR
*
argv[])
{ lua_State * L = luaL_newstate(); luaopen_base(L); tolua_inherit_open(L); luaL_dofile(L, "../scripts/inheritance.lua"); lua_close(L); return 0; }
print(
"
now in inheritance.lua!
"
)
--
access
global
button print(
"
global button test
"
) lbutton:SetAlpha(
0.5
) print(lbutton:GetAlpha()) lbutton:SetID(
100
) lbutton:SetText(
"
global button
"
) print(lbutton:GetText())
--
alloc
new
button newbutton
=
CAUIButton:
new
()
--
CAUIControl
'
s methods
newbutton:SetID(
101
) print(newbutton:GetID()) newbutton:SetText(
"
new button
"
) print(newbutton:GetText())
--
CAUIButton
'
s SetAlpha
newbutton:SetAlpha(
0.7
) print(newbutton:GetAlpha())