Un raspuns complet la aceasta intrebare gasiti pe pagina principala a proiectului Gtk#. Pe scurt, este o interfata C# pentru celebra platforma de dezvoltare a interfetelor grafice GTK+. Cel mai bine ruleaza pe platforma Mono, insa poate rula pe orice platforma .NET.
Cum instalez Gtk#?
Pentru a nu complica lucrurile va sugerez sa instalati Mono. Pentru a instala Mono aveti mai multe optiuni:
Cunostinte necesare
Pentru a intelege exemplele prezentate in acest tutorial aveti nevoie doar de cunostinte de baza privind limbajul C#.
Aplicatii
Prima aplicatie Gtk#
Mai intai vom crea cea mai simpla aplicatie gtk# in care nu vom folosesi nici un element grafic. Scopul acestei aplicatii este de a testa integritatea mediului de dezvoltare si de a va familiariza cu comenzile pe care trebuie sa le executati pentru a compila un program folosind compilatorul oferit de platforma Mono.
Folosind editorul dumneavoastra preferat scrieti urmatorul program si salvati-l intr-un fisier cu numele "helloword.cs".
using System; using Gtk; public class GtkHelloWorld { public static void Main() { Console.WriteLine("HelloWorld"); } }
Programul de mai sus trebuie compilat cu urmatoarea comanda:
mcs -pkg:gtk-sharp-2.0 helloword.cs
Prin comanda de mai sus am instruit compilatorul de C# sa include pachetul "gtk-sharp-2.0". Acest pachet contine mai multe librarii, ceea ce ne scuteste de efortul de a specifica manual fiecare librarie necesara compilarii unei aplicatii gtk#.
Adaugarea interfetei grafice
In continuare ne propunem sa dezvoltam programul anterior adaugandu-i cateva elemente grafice.
using System; using Gtk; public class SalutareWindow { public static void Main() { Application.Init(); // cream fereastra Window myWin = new Window("Prima aplicatie GTK#! "); myWin.Resize(300, 200); // cream o eticheta care va contine un text Label myLabel = new Label(); myLabel.Text = "Salutare lume!!!!"; // adaugam eticheta la fereastra myWin.Add(myLabel); // afisam fereastra si elementele pe care aceasta le contine myWin.ShowAll(); Application.Run(); } }
Compilati programul asa cum am aratat mai sus, rulati-l si ar trebui sa obtineti ceva asemanator ceea ce vedeti in urmatoarea imagine:
Daca veniti dintr-un mediu de programare windows primul lucru pe care il veti observa este ca nu am specificat pozitia in cadrul ferestrei si dimensiunile pe care le va avea widgetul "myLabel". Aceasta deoarece gtk# foloseste un sistem de pozitionare si redimensionare foarte diferit de cel cu care sunteti obisnuit. Insa despre acest subiect vom discuta in alt tutorial.
Functia "Application.Init()" este prezenta in toate aplicatiile gtk# si are rolul de a initializa biblioteca gtk# si de a o pregati pentru utilizare. Functia "Application.Run()" este o alta functie pe care o veti intalni in toate aplicatiile gtk#. Cand executia programului ajunge la aceasta functie, programul intra in asa numita "bucla principala", si ramane in acesta bucla atat timp cat este deschisa o fereasta gtk#. In acest stadiu sunt captate si procesate evenimentele. Daca nu apelam aceasta functie programul isi termina executia imediat ce a rulat toate intructiunile.
Adaugarea evenimentelor
Toate platformele .NET implementeaza evenimentele cu ajutorul unor clase speciale numite "delegati". Principiul de implementare si utilizare este foarte asemanator cu sistemul de semnale si sloturi din Qt, insa spre deosebire de Qt nu este o extensie a limbajului, ci face parte din limbaj.
Deobicei un delegat are urmatorul prototip, insa poate sa difere in functie de eveniment:
void HandlerMetod(object obj, EventArgs args);
In continuare vom crea o fereastra care contine un singur buton. Cand apasam butonul este afisat un text in consola.
using System; using Gtk; public class SalutareWindow { public static void Main () { Application.Init(); // cream fereastra Window myWin = new Window("Prima aplicatie GTK#! "); myWin.SetDefaultSize (300, 200); // cream un buton care contine textul "Salutare lume!" Button myButton = new Button("Salutare lume!"); // atasam even. "Cicked" func. HelloButton_OnPress () myButton.Clicked += new EventHandler (OnButtonClicked); // adaugam butonul la fereastra myWin.Add (myButton); // atasam even. DeleteEvent func. Window_OnDelete () myWin.DeleteEvent += new DeleteEventHandler (OnWindowDelete); // afisam fereastra si widgeturile pe care le contine myWin.ShowAll (); Application.Run(); } static void OnButtonClicked (object sender, EventArgs a) { Console.WriteLine ("Ai apasat butonul!"); } static void OnWindowDelete (object sender, DeleteEventArgs a) { Console.WriteLine ("Aplicatia s-a terminat!"); Application.Quit (); } }
Compilati programul.
Observatie: Toate metodele sunt statice deoarece sunt apelate din interiorul metodei "Main()" care trebuie sa fie statica.
Asadar am creat un buton si am atasat evenimentului "Clicked" generat de acest buton metoda "OnButtonClicked()". Acest eveniment este generat de apasarea butonului stang al mouse-ului. Metoda "OnButtonClicked()" nu face altceva decat sa afiseze un mesaj in consola.
Deasemenea am atasat evenimentului "DeleteEvent" generat de fereastra principala metoda "OnWindowDelete()". Acest eveniment este trimis ferestrei de catre managerul de ferestre atunci cand utilizatorul vrea sa inchida fereastra (folosind butonul "Close" din bara de titlu, de ex.). Metoda "OnWindowDelete()" executa metoda "Application.Quit()" care are rolul de a termina executia buclei principale si, in consecinta, a programului.