Thread OO-Button-Modul: für SDL (ab geht um OO) (37 answers)
Opened by master at 2006-03-31 19:08

Matze
 2006-04-13 15:03
#64285 #64285
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hast du schon probiert die Buttons zeichnen zu lassen, laso ohne Bilder ?

So würde ich es machen:
Code: (dl )
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
  my $self = shift;

 my $bg = shift;
 my $fg = shift;

 # Button Objekt, Fordergrund- und Hintergrundfarbe
 # werden übergeben.

 my $width = int($self->{FONT}->width($self->{TEXT}) + 16);
 my $height = int($self->{SIZE} + 20);

 # Die Höhe und Breite von $border (s.u.) bekommst du
 # durch den Font, den man benutzen möchte und eine
 # SIZE Option, welche der -size Option im Font gleicht.

 # Rechtecke zeichnen:

 my $border = SDL::Rect->new
 (-height => $height,
  -width => $width,
  -x => $self->{X},
  -y => $self->{Y});

 my $inline = SDL::Rect->new
 (-height => $height-4,
  -width => $width-4,
  -x => $self->{X}+2,
  -y => $self->{Y}+2);

 # $inline kleiner als $border, da man ja den Rand auch noch
 # sehen soll.

 # Rechtecke füllen:

 $self->{APP} -> fill($border,$bg);
 $self->{APP} -> fill($inline,$fg);

 # Text-Position berechnen:
 #  X bekommst du, indem du einfach die X-Position des
 #  Rechteckes + 8 nimmst.
 #  Y bekommst du, indem du die Höhe des Rechteckes / 2
 #  teilst, die Y-Position des Rechteckes addierst und die
 #  Höhe des Textes anhand des benutzten Fonts / 2 geteilt
 #  subtraierst.
 # Allerdings nur, wenn du möchtest, dass der Text in der
 # Mitte steht und nicht so dicht am Rand.

 my $nx  = $self->{X} + 8;
 my $ny  = int((($height / 2) + $self->{Y}) - $self->{FONT}->height($self->{TEXT}) / 2);

 # Text ausgeben:

 $self->{FONT} -> print ($self->{APP},$nx,$ny,$self->{TEXT});

 # Bereich 'neu laden' und
 # APP flippen:

 $self->{APP} -> update($border);
 $self->{APP} -> flip ();


Zu dem Container würde ich sagen, dass es ausreicht wenn man eine add() Funktion zur Verfügung hat an die das jeweilige Widget übergeben werden kann.
Schließlich ist es dann(zumindest sieht es für mich so aus) dynamischer.

Jedes Widget bekommt eine check Funktionen und der Construcor behält immer den selben Namen(z.B.: new).

Und wie ptk schon sagt, kannst du ja, wenn du es unbedingt brauchst, den Container mit an new() übergeben.

MfG. Matze
Mit freundlichen Grüßen: Matze

View full thread OO-Button-Modul: für SDL (ab geht um OO)