1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
#!/usr/bin/env ruby
#Encoding: UTF-8
=begin
Ein Beispielprogramm, geschrieben von Quintus am
25.11.2009 mit der wxRuby-Version 2.0.1.
Getestet mit Ruby 1.9.1-p243.
Demonstriert wird der allgemeine Gebrauch von Frames und
die Anwendung von Events sowie das Anzeigen von Dialogen.
=end
#Hier definierte Methoden sind überall verfügbar.
module Kernel
#Der Codeblock dieser Methode wird in einer Umgebung ausgeführt,
#die keine Warnings hervorruft.
def without_warnings
raise(ArgumentError, "No block given!") unless block_given?
v, $VERBOSE = $VERBOSE, nil
yield
$VERBOSE = v
end
end
#Einbinden der wxRuby-Bibliothek
without_warnings{require "wx"} #Gibt unter 1.9 sonst sehr viele Warnings
#Ableiten einer eigenen Klasse von der Wx-Hauptklasse App
class MyGUI < Wx::App
include Wx #Einbinden des Wx-Moduls, sodass wir nicht immer Wx:: für Namespaceauflösungen schreiben müssen
#Die #on_init-Methode wird beim Start der Anwendung aufgerufen.
#Hier sollten alle Controls erstellt und angezeigt werden.
def on_init
#Erstelle das Hauptfenster. Es hat kein Elternfenster - nil - und eine Größe von 400x400 Pixel.
#Sein in der Titelleiste angezeigter Name ist »Testprogramm«.
@mainwindow = Frame.new(nil, size: Size.new(400, 400), title: "Testprogramm")
#Diese Zeile setzt den Hintergrund des Fensters auf die Standard-Hintergrundfarbe
#des Betriebssystems. Gelegentlich kommt es vor, dass der Hintergrund ohne diese Zeile
#ein sehr dunkles Grau annimmt.
@mainwindow.background_colour = NULL_COLOUR #Achte auf die Schreibweise! Colour, nicht Color!
#Erstelle ein Label im Hauptfenster (@mainwindow) an der Position (20|20).
#StaticText-Controls benötigen in der Regel keine Größenzuweisung, da sie sich
#automatisch an ihren Inhalt anpassen.
StaticText.new(@mainwindow, pos: Point.new(20, 20), label: "Drücke, um eine Dialogbox aufzurufen:")
#Erstelle einen Button mit der Aufschrift »Klick mich!« im Hauptfenster.
#Er bekommt eine fixe Breite von 100 Pixeln, aber die Höhe überlassen wir wxRuby.
@button = Button.new(@mainwindow, pos: Point.new(20, 50), size: Size.new(100, -1), label: "Klick mich!")
#Weise jeder erforderlichen Aktion seinen Handler zu.
#Methodendefinition siehe weiter unten.
setup_event_handlers
#Zeige das Hauptfenster (mit allen Controls) an.
@mainwindow.show
end
#Die folgenden Methoden sollten nicht von außerhalb aufgerufen werden können.
private
#Weise jeder erforderlichen Aktion seinen Handler zu.
def setup_event_handlers
#Fange das EVT_BUTTON-Event des Buttons @button auf
#und leite es an die Methode #on_button_click weiter.
evt_button(@button){|event| on_button_click(event)}
end
#Event-Handler unseres Buttons. Das mitgegebene Event
#enthält Informationen wie z.B. die Klickposition.
def on_button_click(event)
#Erstelle einen Nachrichten-Dialog mit einem OK-Button und
#einem Informationssymbol. Sein Elternfenster ist ebenfalls das
#Hauptfenster.
md = MessageDialog.new(@mainwindow, caption: "Begrüßung", message: "Hallo, Welt!", style: OK | ICON_INFORMATION)
#Zeige den Dialog modal an, d.h. verhindere für die Zeit seiner Anzeige
#alle Aktionen, die das Elternfenster (in unserem Fall @mainwindow) betreffen.
md.show_modal
end
end
#Starte die GUI - aber nur, wenn diese Datei als Hauptprogramm benutzt wird.
if __FILE__ == $0
#Erstellen des GUI-Objekts
x = MyGUI.new
#Aufrufen der Haupt-(Event-)-Schleife.
x.main_loop
end |