<采用了单继承的类的导出> 这个……,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文件:
#ifndef _CLASS_INHERITANCE_H
#define
_CLASS_INHERITANCE_H
WIN32_LEAN_AND_MEAN
#include
<
windows.h
>
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(-), m_state(AUICSNormal), m_bVisible(true0.0f"") {} virtual~CAUIControl() tolua void SetID(int nID){ m_nID nID; } GetID(){ return m_nID; } SetText(char* szText){ m_strText szText; } const GetText() m_strText.c_str(); } SetPosition(POINT pt){ m_position pt; } POINT GetPosition() m_position; } SetSize(SIZE sz){ m_size sz; } SIZE GetSize() m_size; } SetVisible(bool bVisible){ m_bVisible bVisible; } IsVisible() m_bVisible; } SetEnabled( bEnable){ m_bEnablebEnable; } IsEnabled() m_bEnable; } SetAlpha(float fAlpha){ m_fAlphafAlpha; } GetAlpha() m_fAlpha; } Render() ; MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){false;}protected m_nID; AUIControlState m_state; m_bVisible; m_bEnable; POINT m_position; SIZE m_size; m_fAlpha; std::string m_strText; }
;
CAUIButton :
public
CAUIControl
: CAUIButton():m_pTexture(NULL) CAUIButton(): SetTexture( szFile) SetTextureRects( RECT & rcNormal, rcHover,0);">rcPushed,0);"> RECT rcDisabled) { m_fAlpha fAlpha; printf("CAUIButton::SetAlpha, extra process here! ); }: Render(){printf(CAUIButton::Render );} { printf(CAUIButton::MsgProc ); : LoadTexture( szTextureFile) NULL;} m_pTexture; RECT m_rects[]; }
extern
CAUIButton g_button;
#endif
$#include
"
inheritance.h
CAUIControl
nID); GetID(); szText); GetText(); SetPosition(POINT pt); POINT GetPosition(); SetSize(SIZE sz); SIZE GetSize(); bVisible); IsVisible(); bEnable); IsEnabled(); fAlpha); GetAlpha(); }
CAUIControl
: CAUIButton(); CAUIButton(); szFile); rcDisabled); fAlpha); }
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;
_tmain(
argc, _TCHAR
argv[])
{ lua_State L luaL_newstate(); luaopen_base(L); tolua_inherit_open(L); luaL_dofile(L,0);">../scripts/inheritance.lua); lua_close(L); ; }