?<采用了单继承的类的导出> ??? 这个……,tolua++支持采用了单继承的类的直接导出,在lua中可以像在C++中那样访问基类的方法。和其它简单类的导出没什么区别。 ??? 只是个简单的示例,我们定义一个控件基类,从它派生一个按钮类。然后在lua中分别访问基类和按钮类的方法。我们导出一个全局变量lbutton,同时也在lua中生成一个新button。 ??? 先看实际的头文件inheritance.h,我把实现也写在了头文件里。
 #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
??? g_button的实例定义在main函数所在的文件中。 ??? 下面是inheritance.pkg文件:
$#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;
??? 对于基类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; 

?_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);  ????;  }

??? 相当简单,和前面几个几乎一样,唯一变化的是多了个全局变量。 ??? 最后是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:
() 

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函数中对参数进行类型转换,然后呼叫其特定方法。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|