tolua++初探(五)

 <采用了单继承的类的导出>     这个……,tolua++支持采用了单继承的类的直接导出,在lua中可以像在C++中那样访问基类的方法。和其它简单类的导出没什么区别。     只是个简单的示例,我们定义一个控件基类,从它派生一个按钮类。然后在lua中分别访问基类和按钮类的方法。我们导出一个全局变量lbutton,同时也在lua中生成一个新button。     先看实际的头文件inheritance.h,我把实现也写在了头文件里。
#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
    g_button的实例定义在main函数所在的文件中。     下面是inheritance.pkg文件:
$#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;
    对于基类CAUIControl,只导出部分方法,不导出构造函数,不允许在Lua中直接生成其实例。派生类CAUIButton可以在lua中生成实例。CAUIButton重写了基类的SetAlpha函数也增加了一些新的函数,如设置纹理函数SetTexture。     全局变量的导出很简单, extern  CAUIButton g_button@lbutton;一个语句就可以了。我们还可以为其加上tolua_readonly修饰符。我把它重名为lbutton。     好了,下面用tolua++.exe生成inherit.cpp文件:
    tolua ++ .exe  - n inherit  - o inherit.cpp inheritance.pkg
    接下来是驱动文件inheritance.cpp:
#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; }
    相当简单,和前面几个几乎一样,唯一变化的是多了个全局变量。     最后是inheritance.lua文件:
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())
    大功告成了,几乎没有任何新意。不过还是验证了一点东西,仅此而已。     接下来要演示如何呼叫lua脚本中的函数,并向其传递参数,在该lua函数中对参数进行类型转换,然后呼叫其特定方法。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

foruok

你可以选择打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值