<采用了單繼承的類的導出> 這個……,tolua++支持采用了單繼承的類的直接導出,在lua中可以像在C++中那樣訪問基類的方法。和其它簡單類的導出沒什么區(qū)別。 只是個簡單的示例,我們定義一個控件基類,從它派生一個按鈕類。然后在lua中分別訪問基類和按鈕類的方法。我們導出一個全局變量lbutton,同時也在lua中生成一個新button。 先看實際的頭文件inheritance.h,我把實現(xiàn)也寫在了頭文件里。
#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
:
//
shouldnotbecalledfromluascripts
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(POINTpt)
{m_position
=
pt;}
POINTGetPosition()
{
return
m_position;}
void
SetSize(SIZEsz)
{m_size
=
sz;}
SIZEGetSize()
{
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
:
//
shouldnotbecalledfromluascripts
virtual
void
Render()
=
0
;
virtual
bool
MsgProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)
{
return
false
;}
protected
:
int
m_nID;
AUIControlStatem_state;
bool
m_bVisible;
bool
m_bEnable;
POINTm_position;
SIZEm_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,extraprocesshere!
"
);}
public
:
void
Render()
{printf(
"
CAUIButton::Render
"
);}
bool
MsgProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)
{printf(
"
CAUIButton::MsgProc
"
);
return
false
;}
protected
:
void
*
LoadTexture(
char
*
szTextureFile)
{
return
NULL;}
void
*
m_pTexture;
RECTm_rects[
4
];
}
;
extern
CAUIButtong_button;
#endif
g_button的實例定義在main函數(shù)所在的文件中。 下面是inheritance.pkg文件:
$#include
"
inheritance.h
"
class
CAUIControl
{
public
:
//
tolua
void
SetID(
int
nID);
int
GetID();
void
SetText(
char
*
szText);
const
char
*
GetText();
void
SetPosition(POINTpt);
POINTGetPosition();
void
SetSize(SIZEsz);
SIZEGetSize();
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
CAUIButtong_button@lbutton;
對于基類CAUIControl,只導出部分方法,不導出構(gòu)造函數(shù),不允許在Lua中直接生成其實例。派生類CAUIButton可以在lua中生成實例。CAUIButton重寫了基類的SetAlpha函數(shù)也增加了一些新的函數(shù),如設置紋理函數(shù)SetTexture。 全局變量的導出很簡單,
extern
CAUIButtong_button@lbutton;一個語句就可以了。我們還可以為其加上tolua_readonly修飾符。我把它重名為lbutton。 好了,下面用tolua++.exe生成inherit.cpp文件:
tolua
++
.exe
-
ninherit
-
oinherit.cppinheritance.pkg
接下來是驅(qū)動文件inheritance.cpp:
#include
"
lua.hpp
"
#include
"
inheritance.h
"
int
tolua_inherit_open(lua_State
*
);
CAUIButtong_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(
"
nowininheritance.lua!
"
)
--
access
global
button
print(
"
globalbuttontest
"
)
lbutton:SetAlpha(
0.5
)
print(lbutton:GetAlpha())
lbutton:SetID(
100
)
lbutton:SetText(
"
globalbutton
"
)
print(lbutton:GetText())
--
alloc
new
button
newbutton
=
CAUIButton:
new
()
--
CAUIControl
'
smethods
newbutton:SetID(
101
)
print(newbutton:GetID())
newbutton:SetText(
"
newbutton
"
)
print(newbutton:GetText())
--
CAUIButton
'
sSetAlpha
newbutton:SetAlpha(
0.7
)
print(newbutton:GetAlpha())
大功告成了,幾乎沒有任何新意。不過還是驗證了一點東西,僅此而已。 接下來要演示如何呼叫l(wèi)ua腳本中的函數(shù),并向其傳遞參數(shù),在該lua函數(shù)中對參數(shù)進行類型轉(zhuǎn)換,然后呼叫其特定方法。







































































































































































更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
