tolua++初探(五)

tolua++初探(五),第1张

概述 <采用了单继承的类的导出>     这个……,tolua++支持采用了单继承的类的直接导出,在lua中可以像在C++中那样访问基类的方法。和其它简单类的导出没什么区别。     只是个简单的示例,我们定义一个控件基类,从它派生一个按钮类。然后在lua中分别访问基类和按钮类的方法。我们导出一个全局变量lbutton,同时也在lua中生成一个新button。     先看实际的头文件inherita  <采用了单继承的类的导出>     这个……,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函数中对参数进行类型转换,然后呼叫其特定方法。 总结

以上是内存溢出为你收集整理的tolua++初探(五)全部内容,希望文章能够帮你解决tolua++初探(五)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1268942.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存