GTK#
´ r 9) Jazyk C# (seminaˇ ´ Pavel Prochazka KMI
19. listopadu 2014
´ Pavel Prochazka
´ r 9) Jazyk C# (seminaˇ
GTK#
Motivace – proˇc GTK#
I I
I
I I
Modern´ı pˇr´ıstup k psan´ı GUI ´ Zaklad (GTK+) je napsan´y v C, ale podporuje celou ˇradu jazyku˚ (Vala, Python, JavaScript, C#, ... ) ˇ sovat zmenˇsovat, um´ı Um´ı relativneˇ pozicovat objekty, zvetˇ ´ pruhledn eˇ nakladat s DPI ˚ GUI widgety lze reprezentovat XML souborem Nativneˇ ho podporuje MonoDevelop
I
´ K editaci widgetu, Glade nebo ˚ oken slouˇz´ı extern´ı nastroj ˇ y nastroj ´ vestaven´ do MonoDevelopu – preferovana´ varianta
I
http://www.mono-project.com/docs/gui/gtksharp/ Negativum spoˇc´ıva´ v tom, zˇ e GTK# je automatizovaneˇ generovane´ – API m´ısty ne zcela dokonale vyuˇz´ıva´ moˇznosti C# ´ eˇ naklikat neˇz ve VisualStudiu Negativum je to, zˇ e lze men
I
I
´ Pavel Prochazka
´ r 9) Jazyk C# (seminaˇ
GTK#
Designer pro GTK#
´ Pavel Prochazka
´ r 9) Jazyk C# (seminaˇ
GTK#
Principy GTK#
I I I
I
I I
I
I
GUI prvkum ˚ se ˇr´ıka´ widgety Nic se pevneˇ nepozicuje ˇ b´yt v nejak ˇ em ´ kontejneru, kter´y se Kaˇzd´y widget by mel ˇ suje a zmenˇsuje podle potˇreby (podle velikosti automaticky zvetˇ vnoˇren´ych widgetu) ˚ ´ ame ´ ´ ı a vertikaln´ ´ ı kontejnery (a dalˇs´ı Rozeznav horizontaln´ ´ ı) specialn´ Kontejnery jsou podobne´ div z HTML ˇ ´ Na nekter e´ prvky muˇ na pevnou nebo ˚ zeme m´ıt specificke´ naroky ´ ı velikost, to lze (pomoc´ı designeru – zaloˇ ´ zka vlastnosti) minimaln´ ´ ı uˇzivatelske´ grafiky lze pomoc´ı knihovny Cairo (nutne´ Vykreslovan´ dodat referenci) ´ ı je moˇzne´ pomoc´ı Gdk Pˇr´ıme´ vykreslovan´
´ Pavel Prochazka
´ r 9) Jazyk C# (seminaˇ
GTK#
Hello world
using System; using Gtk; class MainClass { public static void Main (string[] args) { Application.Init (); Window win = new Gtk.Window (0); win.Title = "Hello World"; win.Show (); Application.Run (); } }
´ Pavel Prochazka
´ r 9) Jazyk C# (seminaˇ
GTK#
´ Zakladn´ ı GUI widgety
I
Tˇr´ıdy pro okna dialogy Gtk.Window, MessageDialog, ...
I
Kontejnery HBox, VBox, ... Poloˇzkove´ seznamy NodeView, TreeView
I I
I I I
I
´ Zakladn´ ı widgety Button, ComboBox, RadioButton, ProgressBar ´ Vykreslovac´ı platno DrawingArea Menu Menu, MenuBar, MenuItem ˇ eˇ shrnuta´ tady https:// Cela´ hierarchie widgetu˚ je pekn developer.gnome.org/gtk-tutorial/2.90/x477.html ´ se seznamy typu NodeView je pekn ˇ eˇ shrnuta´ zde Prace http://www.mono-project.com/docs/gui/gtksharp/ widgets/nodeview-tutorial-examples/
´ Pavel Prochazka
´ r 9) Jazyk C# (seminaˇ
GTK#
Kreslen´ı vektorove´ grafiky pomoc´ı Cairo
I
Cairo je pokroˇcila´ knihovna pro kreslen´ı vektorove´ grafiky, je ´ akcelerovana´ (tud´ızˇ rychla)
I
Podporuje antialiasing (v´ychoz´ı) (pro objekty i pro text)
I I
V´ystup je kvalitn´ı a pˇresn´y (na rozd´ıl od GDI+) ˇ ´ ı souˇcast´ ´ ı C++ V budoucnosti bude Cairo pravdepodobn eˇ oficialn´ jako jeho standarn´ı knihovna
I
Knihovna s vnitˇrn´ım stavem – podobn´y koncept jako OpenGL
I
Lze si to pˇredstavit jako pastelku v ruce ´ ˇ Vyb´ırame si barvu, jestli chceme obtahovat nebo vyplnovat atd.
I I
I I
I
Potˇreba doplnit referenci na Mono.Cairo a vloˇzit namespace using Cairo; ˇ knihovna obsahuje celou rˇadu metod Opet ´ Popisovaˇc z´ıskame Cairo pomoc´ı Gdk.CairoHelper.Create, argumentem pˇreb´ıra´ GdkWindow – analogie k CreateGraphics(); ´ ı kaˇzdeho ´ ´ GdkWindow je souˇcast´ uˇzivatelsky kreslitelneho objektu
´ Pavel Prochazka
´ r 9) Jazyk C# (seminaˇ
GTK#
Jak se to nakresl´ı?
´ Pavel Prochazka
´ r 9) Jazyk C# (seminaˇ
GTK#
Cairo – jednoduch´y pˇr´ıklad
using (Cairo.Context cr = Gdk.CairoHelper.Create(area.GdkWindow)) { cr.LineWidth = 9; cr.SetSourceRGB (0.7, 0.2, 0.0); int mw = (width <= height ? width : height); cr.Translate (width / 2, height / 2); cr.Arc (0, 0, mw / 3 ,0, 2 * Math.PI); cr.StrokePreserve (); cr.SetSourceRGB (0.3, 0.4, 0.6); cr.Fill (); cr.SetSourceRGB (0.9, 0.9, 0.01); cr.Arc (-(width / 9), -(width / 9) , mw/14 , 0, 2 * Math.PI ); cr.StrokePreserve (); ...
´ Pavel Prochazka
´ r 9) Jazyk C# (seminaˇ
GTK#
Cairo – jednoduch´y pˇr´ıklad – cntd.
cr.SetSourceRGB (0.9, 0.1, 0); cr.Fill (); cr.SetSourceRGB (0.9, 0.9, 0.01); cr.Arc ((width / 9), -(width / 9) , mw/14, 0, 2 * Math.PI ); cr.StrokePreserve (); cr.SetSourceRGB (0.9, 0.1, 0); cr.Fill (); cr.SetSourceRGB (0.9, 0.9, 0.01); cr.Arc (0, 0 , mw/4 , 0, 1 * Math.PI ); cr.StrokePreserve (); cr.MoveTo (new PointD (0, mw / 12)); cr.LineTo (new PointD (0, -(mw / 12))); cr.StrokePreserve (); }
´ Pavel Prochazka
´ r 9) Jazyk C# (seminaˇ
GTK#
Kreslen´ı per pixel
I
´ Obrazek se reprezentuje pomoc´ı tˇr´ıdy Gdk.Image ˇ ˇ a´ pomoc´ı GetPixel Cten´ı pixelu se del
I
´ Zapis pixelu pomoc´ı PutPixel
I
I
´ ARGB, ktere´ jsou POZOR: Tyto metody pracuj´ı s pixely ve formatu ´ uloˇzeny v uint – na kaˇzd´y kanal 1 bajt ´ binarn´ ´ ı operace jako <<, &, | apod. (ty ale uˇz Je tedy nutne´ znat ´ z C) znate ´ skrze tˇr´ıdu Gdk.Color, ktera´ toto del ˇ a´ za nas ´ Lze si ulehˇcit praci
I
Kresl´ı se pomoc´ı tˇr´ıdy GdkWindows a jej´ı metody DrawImage
I
I
´ Pavel Prochazka
´ r 9) Jazyk C# (seminaˇ
GTK#
Gdk – pˇr´ımy pˇr´ıstup k pixelum ˚
Gdk.Image im = area.GdkWindow.GetImage (0, 0, width, height); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { im.PutPixel (x, y, im.GetPixel(x,y) & 0x00ff0000 ); } } Console.WriteLine (im.GetPixel (25, 25)); area.GdkWindow.DrawImage ( /* ziskani kontextu -- kam kreslit */ Style.ForegroundGC (StateType.Normal), im, 0, 0, 0, 0, width, height);
´ Pavel Prochazka
´ r 9) Jazyk C# (seminaˇ
GTK#
´ Pavel Prochazka
´ r 9) Jazyk C# (seminaˇ
GTK#
A ted’ vy
I
´ ˇ sovat a Vytvoˇrte nastroj pro zˇ elv´ı grafiku, kter´y se da´ zvetˇ ´ a´ tahy. Otoˇcen´ı zˇ elvy je po 45 stupn´ıch zmenˇsovat a zaznamenav
´ Pavel Prochazka
´ r 9) Jazyk C# (seminaˇ