Thread toplevel in bildschirmmitte positionieren (9 answers)
Opened by helmut at 2003-10-05 01:24

skontox
 2003-10-05 09:04
#44521 #44521
User since
2003-08-06
193 Artikel
BenutzerIn
[default_avatar]
Guten Morgen!
Unter Linux funtzt das bei mir leider auch nicht ganz. Ich habe mir zwar ne kleine Sub geschrieben, die unter Windows eigentlich sehr gut funtzt, aber unter Linux hatte ich letztens meine GUI mal laufen lassen und da hat er mir die Fenster auch nicht so gesetzt wie ich gerne wollte, allerdings hab ich da auch nicht weiter nachgeschaut, vielleicht muß man da nicht viel ändern, dann läuft es auch unter Linux.
Mußt mal schauen, was man da ändern kann, damit es auch unter Linux gut läuft. Noch ne Anmerkung, wenn ich meinem GUI ein eigenes Icon verpasse, klappt das auch unter Windows nicht. Da bin ich leider auch überfragt woran das liegt.
Der Code ist wahrscheinlich auch nicht der beste. Aber vielleicht hilft Dir das ein wenig weiter.


Ich poste Dir hier mal den CODE:
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
### hier der Aufruf: ###
&zentriere_fenster($mw); # Parameter 1: Übergibt die Fenstervariable; Parameter 2: Verschiebung der X-Achse; Parameter 3: Verschiebung der Y-Achse

### hier ein Beispiel-Aufruf mit Parameter-Werten: ###
&zentriere_fenster($mw,0,-20);

#### hier die SUB: ####
#### Diese Subroutine Berechnet die zentrierte Darstellung auf dem Bildschirm ####

sub zentriere_fenster {
   my $widget = shift; # Fenster als Übergabeparameter
   my $x_ver  = shift; # Verschiebung auf der X-Achse vom Zentrum (bei positiven Wert Verschiebung nach rechts. Negativ für links)
   my $y_ver  = shift; # Verschiebung auf der X-Achse vom Zentrum (bei positiven Wert Verschiebung nach unten. Negativ für oben)

   #### Platzierung des Infofensters auf dem Bildschirm ermitteln und mittig anordnen ####
   $widget->update; # Werte werden geupdatet, damit die tatsächliche Breite und Höhe ermittelt werden kann

   my $tats_breite = $widget->width(); # Tatsächliche Breite wird ermittelt
   my $tats_hoehe = $widget->height(); # Tatsächliche Höhe wird ermittelt

   my @aktuelle_b_aufloesung = ($breite=$mw->screenwidth, $hoehe=$mw->screenheight); # aktuelle Bildschirmauflösung wird in array geschrieben

   my @widget_platzierung = (($aktuelle_b_aufloesung[0]/2)-($tats_breite/2)+$x_ver, ($aktuelle_b_aufloesung[1]/2)-($tats_hoehe/2)+$y_ver); # Berechnung für die Mittlere Platzierung auf den Bildschirm

   for (@widget_platzierung)  # Runden, denn sonst kann es zu Fehlern bei der Methode geometry kommen, denn es können nur ganzzahlige Zahlen benutzt werden
   {
        $_= sprintf("%.0f",$_);
   }

   $widget->geometry("+$widget_platzierung[0]+$widget_platzierung[1]"); # Nun wird die Position des Fensters aus den errechneten Werten festgelegt
}

####### hier die SUB nochmal ohne Inline DOKU ########
sub zentriere_fenster {
   my $widget = shift;
   my $x_ver  = shift;
   my $y_ver  = shift;

   $widget->update;

   my $tats_breite = $widget->width();
   my $tats_hoehe = $widget->height();

   my @aktuelle_b_aufloesung = ($breite=$mw->screenwidth, $hoehe=$mw->screenheight);

   my @widget_platzierung = (($aktuelle_b_aufloesung[0]/2)-($tats_breite/2)+$x_ver, ($aktuelle_b_aufloesung[1]/2)-($tats_hoehe/2)+$y_ver);

   for (@widget_platzierung)
   {
        $_= sprintf("%.0f",$_);
   }

   $widget->geometry("+$widget_platzierung[0]+$widget_platzierung[1]");
}


Wie Du siehst sind da einige Methode zu erkennen, wie man an die relevanten Daten kommt. Ich hoffe ich konnte Dir etwas weiter helfen, ich würde mich auch freuen, wenn Du bessere Vorschläge und Lösungen, die eventuell auch unter Linux laufen hier postest. Sobald ich mehr Zeit habe, probiere ich die Sub mal zu optimieren, so dass sie auch unter Linux gute Ergebnisse erzielt.

Ich hoffe, ich konnte Dir wenigstens etwas weiter helfen.

Gruß skontox\n\n

<!--EDIT|skontox|1065330397-->

View full thread toplevel in bildschirmmitte positionieren