A Lua nyelvben is lehetõségünk van grafikus interfésszel rendelkezõ alkalmazásokat fejleszteni, ehhez több könyvtár is a rendelkezésünkre áll. Ezek általában valami egyéb nyelven írott grafikus könyvtárhoz nyújtanak hozzáférést. Néhány ilyen könyvtár:
wxLua
LuaInterface
lqt
A LauInterface a Windows Forms eszköztárát teszi elérhetõvé Lua programjainkban. Közvetlenül a .NET keretrendszerbõl példányosítja õket, annak CLR (Common Language Runtime) szolgáltatásán keresztül. Elérhetõ benne a Windows Forms minden osztálya, eseménykezelése, és intézi, hogy kompatibilis legyen a Lua beépített típusaival.
load_assembly:
Betölti a megadott .NET assemblyt. Egy string paraméterben várja az assembly nevét, pl. „System.Windows.Forms”.
import_type:
Betölti a megadott .NET típust, és visszaadja. Egy string paraméterben várja a típus teljes nevét a namespace-el együtt. A visszaadott objektumot a típus objektumainak példányosítására lehet használni, függvényként kell meghívni, mindig megpróbálja ráilleszteni a kapott paramétereket egy létezõ konstruktor szignatúrájára.
get_constructor_bysig:
Ha az elõzõben említett automatikus konstruktor illesztés nem elég, akkor ezzel a metódussal egy konkrét konstruktort lehet példányosítani szignatúra alapján. Tetszõleges számú .NET típust vár paraméterként, az elsõ azt a típust adja meg, aminek a konstruktorát keressük, a többi pedig a kívánt paraméterek típusát.
get_method_bysig:
Az elõzõhöz hasonlóan itt is nem egyértelmû paraméterezés esetén lehet a konkrét szignatúra alapján megkeresni metódusokat. Paraméterként a metódust tartalmazó objektumot, a metódus nevét, és a paraméterek típusait várja, és visszaadja a konkrét metódust, amit ezután meg lehet hívni.
Az elõzõek segítségével példányosított .NET objektumok rendelkeznek a szokásos tagjaikkal és metódusaikkal. Használatuk ugyanúgy történik mint C#-ban vagy bármely egyéb .NET-es nyelvben.
Eseménykezelés:
Az eseménykezeléshez egyszerûen az adott objektum esemény tagján kell egy Add vagy Remove metódust meghívni, paraméterként pedig egy Lua függvényt kell megadni. Ez automatikusan kezeli a delegate-eket, stb.
Példa:
require 'luanet'
luanet.load_assembly("System.Windows.Forms")
Form = luanet.import_type("System.Windows.Forms.Form")
FlowLayoutPanel = luanet.import_type("System.Windows.Forms.FlowLayoutPanel")
TextBox = luanet.import_type("System.Windows.Forms.TextBox")
Button = luanet.import_type("System.Windows.Forms.Button")
MessageBox = luanet.import_type("System.Windows.Forms.MessageBox")
layout = FlowLayoutPanel()
textbox = TextBox()
button = Button()
button.Text = "OK"
function onClick(sender, args)
MessageBox.Show(textbox.Text)
end
button.MouseUp:Add(onClick)
layout.Controls:Add(textbox)
layout.Controls:Add(button)
window = Form()
window.Controls:Add(layout)
window.Text = "Example"
window:ShowDialog()