Auto-Center für alle GUI-Elemente Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Auto-Center für alle GUI-Elemente

Post by Stroker-007 » 28 Jun 2022, 14:57

Guten Abend!

So soll die Standard-GUI aussehen:

Code: Select all

#SingleInstance Force

Gui, Font, s10 
Gui,  +AlwaysOnTop
Gui, Add, Text, x30 y15 Center, Das ist mein Text,`nder aus diesen überflüssigen Zeilen besteht,`naber bitte im Fenster zentriert, wenn´s denn keine Umstände macht.`nDanke!
Gui, Add, Button, x78  y100 w90 h25, Knopf 1
Gui, Add, Button, x188 y100 w90 h25, Knopf 2
Gui, Add, Button, x296 y100 w90 h25, Knopf 3
Gui, Add, Text, x102 y146 Center, Das war mein Text,`nder aus diesen überflüssigen Zeilen besteht,`ndie die Welt nicht braucht.
Gui, Show, w465 h220, GUI-Text-Button-Center-Test
Return

GuiClose:
ExitApp

ButtonKnopf1:
MsgBox Knopf 1
Return

ButtonKnopf2:
MsgBox Knopf 2
Return

ButtonKnopf3:
MsgBox Knopf 3
Return

Aber das so hinzutüfteln, ist ein arges Gefrickel und Rumgefeile mit den Pixeln und dem Augenmaß. Oder noch durchgeknallter: mit dem Taschenrechner.
Gut, daß ich mir dafür wenigstens einen Hotkey für Speichern + Reload gemacht habe, dann ist es etwas erträglicher.

Jetzt frage ich an, ob da etwas mehr Center-Automatik möglich ist - bis hin zu Auto-Resize bei Größenänderung der GUI ?
Ich hab das mal so eingetragen, wie ich mir das vorstellen könnte.
Das einzige was - wie schon oben - funktioniert, ist das "Center" INNERHALB eines Textblocks.
Der Rest ist Goggolores:

Code: Select all

#SingleInstance Force
CoordMode, Menu, Relative ;  ich dachte, das macht es, will aber nicht

Gui, Font, s10 
Gui, +AlwaysOnTop
Gui, Add, Text, Center y15 Center, Das ist mein Text,`nder aus diesen überflüssigen Zeilen besteht,`naber bitte im Fenster zentriert, wenn´s denn keine Umstände macht.`nDanke!
Gui, Add, Button, Center y100 w90 h25, Knopf 1
Gui, Add, Button, Center y100 w90 h25, Knopf 2
Gui, Add, Button, Center y100 w90 h25, Knopf 3
Gui, Add, Text, Center y146 Center, Das war mein Text,`nder aus diesen überflüssigen Zeilen besteht,`ndie die Welt nicht braucht.
Gui, Show, w465 h220, GUI-Text-Button-Center-Test
Return

GuiClose:
ExitApp

ButtonKnopf1:
MsgBox Knopf 1
Return

ButtonKnopf2:
MsgBox Knopf 2
Return

ButtonKnopf3:
MsgBox Knopf 3
Return

Es bräuchte dafür eine Art General-Befehl am Anfang der GUI-Definition:
"Richte in Bezug auf "Gui, Show, w... h..." innerhalb der GUI grundsätzlich ALLES mittig und automatisch aus, ausgenommen der Angaben und Größen , die explizit gemacht werden.

Also von vorne: Das funktioniert ja schon mal - ganz spartanisch:

Code: Select all

#SingleInstance Force

Gui, Font, s10 
Gui, +AlwaysOnTop
Gui, Add, Text, , Das ist mein Text,`nder aus diesen überflüssigen Zeilen besteht,`naber bitte im Fenster zentriert, wenn´s denn keine Umstände macht.`nDanke!
Gui, Add, Button, , Knopf 1
Gui, Add, Button, , Knopf 2
Gui, Add, Button, , Knopf 3
Gui, Add, Text, , Das war mein Text,`nder aus diesen überflüssigen Zeilen besteht,`ndie die Welt nicht braucht.
Gui, Show, w465 h240, GUI-Text-Button-Center-Test
Return

GuiClose:
ExitApp

ButtonKnopf1:
MsgBox Knopf 1
Return

ButtonKnopf2:
MsgBox Knopf 2
Return

ButtonKnopf3:
MsgBox Knopf 3
Return

Davon ausgehend nun die Frage, wieviel Center-Automatik (horizontal + vertikal) ist maximal machbar?
Und was muß dann noch wie manuell ergänzt werden, um auf ein gewünschtes Ergebnis, etwa wie eingangs (quasi als Tuning-Muster), zu kommen?

Wer kann bitte helfen?
Stroker-007
Last edited by Stroker-007 on 28 Jun 2022, 16:37, edited 1 time in total.

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Auto-Center für alle GUI-Elemente

Post by BoBo » 28 Jun 2022, 16:34

Dazu gibt es reichlich Infos in der AHK-Hilfe zur Positionierung von Controls in GUIs: https://ahkde.github.io/docs/commands/Gui.htm#PosSize
Und neben der Positionierung von Controls selbst, gibt es noch Optionen zur Positionierung von Inhalten innerhalb der Controls: https://ahkde.github.io/docs/misc/Styles.htm

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Re: Auto-Center für alle GUI-Elemente

Post by Stroker-007 » 28 Jun 2022, 16:45

Danke, aber diese Stelle habe ich bereits kreuz und quer gelesen, ohne davon einen Plan zu bekommen.
Etwas weiter unten wird dort ja auch die Option "center" beschrieben, die ich dann ja auch angewandt habe.
Aber das reicht ja noch nicht... bzw. funktioniert nicht umfassend oder überall so, wie ich es gerne hätte.

Deine 2. Zeile: alles schon gelesen.
"ES_CENTER 0x1 +/-Center. Zentriert den Text in einem mehrzeiligen Eingabefeld." ...hab ich ja schon, ist nicht mehr gefragt
"BS_CENTER 0x300 +/-Center. Zentriert den Text horizontal innerhalb der verfügbaren Breite des Steuerelements." Ist ja schon, automatisch als Standard. Nicht das Prob.

Aber du könntest ausnahmsweise mal so nett sein, genau die Stellen/Zeilen (als Suchtext) in diesen beiden Doku-Kapiteln zu nennen, die deiner Meinung nach tatsächlich - entsprechend meiner Anfrage - weiterhelfen. Meine Experimentierflut wäre dir sicher ;)

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Auto-Center für alle GUI-Elemente

Post by BoBo » 29 Jun 2022, 00:35

Das hängt zu sehr vom gestalterischen Einzelfall ab um da die generelle eierlegende Zentriersau aus dem Hut zu holen.
Grundsätzlich dürfte gelten, dass die Variabilität der Positionierung der Controls als auch von deren Inhalten mittels - Variablen - handhabbar ist.
Da ich gerne pixelgenau setze, benutze ich in der Regel den 'p' AKA 'previous'-Parameter. Wenn dabei das "Ausgangspositionscontrol" variabel gesetzt wird z.B. …,% "x" (Fensterbreite/2)-(Controlbreite/2) " y" (Fensterhöhe/2)-(Controlhöhe/2) richten sich anschließende Controls entsprechend aus

versatz:=23

…, x10 y10
…,% "xp yp+" versatz
…,% "xp yp+" versatz


Doch das dürfte dir nicht Neu sein. Ohne minimales GeMathematike geht's halt nicht.

Der Möglichkeiten gibt es viele, z.B. um sections zu definieren, wie sie zur Generierung von Rastern mittels Loop genutzt werden.
Nach meiner Erfahrung wird bei einigen "eingebauten" Auto-Positionierungen nicht sauber gearbeitet (oder mir verschließen sich dazu systembedingte Abhängigkeiten), so das ich selbst vermutlich anteilig Mehraufwand betreibe. Letztendlich zählt das Ergebnis, auch bzgl. anfallender maintenance.
Mir ist jetzt allerdings auch keine Expander-Application geläufig, welche ein, wie von dir beschriebenes, permanentes re-scaling erforderlich machen würde. Anyway.
Versuchs mit den Variablen, denn Versuch macht klug. Good luck :angel:

Rohwedder
Posts: 7549
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: Auto-Center für alle GUI-Elemente

Post by Rohwedder » 29 Jun 2022, 01:53

Hallo,
kann mich dem nur anschließen. Ohne Mathe wird's Kacke. Mein alter Casio ist immer griffbereit.
Ich habe spaßeshalber dein 1. Skript mit einem Vergrößerungsfaktor versehen.
(Um Selektionen in "" %% {} [] () einzuschließen, habe ich Hotkeys.)

Code: Select all

#SingleInstance Force
Loop, 10
{
	Gui, Font,% "s"10*F := .5 + A_Index/10
	Gui, +AlwaysOnTop
	Gui, Add, Text,% "x"30*F " y"15*F " Center", Das ist mein Text,`nder aus diesen überflüssigen Zeilen besteht,`naber bitte im Fenster zentriert, wenn´s denn keine Umstände macht.`nDanke!
	Gui, Add, Button,% "x"78*F " y"100*F " w"90*F " h"25*F, Knopf 1
	Gui, Add, Button,% "x"188*F " y"100*F " w"90*F " h"25*F, Knopf 2
	Gui, Add, Button,% "x"296*F " y"100*F " w"90*F " h"25*F, Knopf 3
	Gui, Add, Text,% "x"102*F " y"146*F " Center", Das war mein Text,`nder aus diesen überflüssigen Zeilen besteht,`ndie die Welt nicht braucht.
	Gui, Show,% "w"465*F " h"220*F, GUI-Text-Button-Center-Test
	Sleep, 1000
	Gui, Destroy
}
Return

GuiClose:
ExitApp

ButtonKnopf1:
MsgBox Knopf 1
Return

ButtonKnopf2:
MsgBox Knopf 2
Return

ButtonKnopf3:
MsgBox Knopf 3
Return

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Auto-Center für alle GUI-Elemente

Post by BoBo » 29 Jun 2022, 03:39

@Rohwedder -

Gui, Show,% "w"465*F " h"220*F, GUI-Text-Button-Center-Test Hier wandert der Text zu Beginn einmal über die Gui hinaus.

Gui, Show,, GUI-Text-Button-Center-Test Hier skaliert sich die Gui um den Text herum (allerdings klappt dann die Zentrierung der Buttons nur bedingt). :eh:

Rohwedder
Posts: 7549
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: Auto-Center für alle GUI-Elemente

Post by Rohwedder » 29 Jun 2022, 04:02

Ich habe alle Positionszahlenwerte von Stroker-007 ungeprüft übernommen.
Zum besseren Testen nun mit Zoom per Wheel. Bei mit sieht alles gut aus:

Code: Select all

#SingleInstance Force
Gosub,% ("Gui", F:=1)
^WheelUp::Gosub,% ("Gui", F/=.9)
^WheelDown::Gosub,% ("Gui", F*=.9)
Gui:
Gui, Destroy
Gui, Font,% "s"10*F
Gui, +AlwaysOnTop
Gui, Add, Text,% "x"30*F " y"15*F " Center", Das ist mein Text,`nder aus diesen überflüssigen Zeilen besteht,`naber bitte im Fenster zentriert, wenn´s denn keine Umstände macht.`nDanke!
Gui, Add, Button,% "x"78*F " y"100*F " w"90*F " h"25*F, Knopf 1
Gui, Add, Button,% "x"188*F " y"100*F " w"90*F " h"25*F, Knopf 2
Gui, Add, Button,% "x"296*F " y"100*F " w"90*F " h"25*F, Knopf 3
Gui, Add, Text,% "x"102*F " y"146*F " Center", Das war mein Text,`nder aus diesen überflüssigen Zeilen besteht,`ndie die Welt nicht braucht.
Gui, Show,% "w"465*F " h"220*F, GUI-Text-Button-Center-Test
Return
GuiClose:
ExitApp
ButtonKnopf1:
MsgBox Knopf 1
Return
ButtonKnopf2:
MsgBox Knopf 2
Return
ButtonKnopf3:
MsgBox Knopf 3
Return

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Re: Auto-Center für alle GUI-Elemente

Post by Stroker-007 » 29 Jun 2022, 17:30

Vielen Dank für die interessanten Überlegungen.

@Rohwedder, die Erste:
Diese Skalierungsgeschichte hatte ich angesprochen, jedoch damit eher an ein Anpassen per Maus-Fenster-Ziehen während der Skripterstellung gedacht, um für den User eine akzeptable Größe beurteilen zu können. Mit der Zentrierung selber hat das eher weniger zu tun, du verwendest dafür ja auch genau meine ausgetüftelten Positionen, zeigst aber eindrucksvoll, wie diese vorgegebenen mittigen Positionen bei verschiedenen Größen BEIBEHALTEN werden können. Alles in allem eine tolle Show, hat mich super unterhalten. Vielen Dank dafür.

Allgemein will ich Folgendes sagen:

Wikipedia schreibt zu AHK_

...ist eine Skriptsprache und ein zugehöriger Interpreter, mit denen man insbesondere die Windows-Benutzeroberfläche steuern und sich wiederholende Arbeitsaufgaben unter Windows automatisieren, aber auch viele andere Zwecke erfüllen kann. In den aktuellen Versionen kommt AutoHotkey einer voll ausgestatteten Programmiersprache nahe...
und weiter unten dann:
Fortgeschrittene können mit AutoHotkey grafische Benutzeroberflächen (GUI) erstellen, mit Regulären Ausdrücken arbeiten (PCRE) oder Funktionen in DLLs von Windows oder Anwendungsprogrammen aufrufen.

Mit den bisher 187 lebensverbessernden Skripten, die ich seit meinem AHK-Start vor ca. 18 Monaten bereits kreiert habe, habe ich in kurzer Zeit schon zufriedenstellend viel erreicht, mehr als ich erwartet hatte - dank der Genialität von AHK, der guten Doku, und dem lebendigen Forum hier. Auch einige sehr nützliche und auch hübsche GUI-Fassungen sind dabei. Lt. Wikipedia zähle ich damit wohl zu den bereits Fortgeschrittenen, was ich für mich aber anders definieren würde.

Die Aussage "...kommt AutoHotkey einer voll ausgestatteten Programmiersprache nahe..." bringt es insofern auf den Punkt, daß ich als klare Ansage (für mich) in diese Regionen nicht vorzudringen wünsche. Dafür teile ich AHK für mein Leben und die dafür aufzubringende Zeit nicht die erforderliche Prioriät zu. Symbolisch gesprochen: Ich habe Freude und Interesse, ein guter Autobauer, Designer, Konstrukteur zu sein, und damit, was z.B. der Fahrer unterwegs am ehesten braucht, will mich aber nicht mit Bau und Entwicklung von Motoren beschäftigen. Motoren werden von der jeweiligen Entwicklungsabteilung lt. Auftrag gefertigt und sind dazu da, von mir als fertige Module eingesetzt zu werden. Kein Mensch muß alles machen können, jeder gehe seinen Neigungen nach. Dort gibt es genug zu tun.

Auf das angefragte Thema dieses Posts übertragen, heißt das nun:

Ich hatte nach einer - von mir möglicherweise bisher nicht gefundenen - generellen Zentrier-Funktion für alle Teile (Steuerelemente) einer GUI angefragt. Etwa nach dem bekannten Muster bei einer Textverarbeitung: Markiere den gesamten Text und wähle dann (wo oder wie auch immer) ZENTRIEREN aus - fertig.

In uferlos weiten Teilen strotzt AHK nur so von genau solchen Befehlen und Funktionen, manchmal sogar völlig sinnfrei, überzählig, banal. Aber von den Entwicklern ("Motorenbauern") natürlich gut gemeint, um möglichst vielen ("Autobauern") - auch Anfängern - einen guten Einstieg und Zugang zu ermöglichen. Auch dieses tolle Forum sei damit lobend erwähnt. Wer könnte es mir dann also übel nehmen, wenn ich - gerne naiv - annehme, daß es einen solchen simplen Befehl auch für das Zentrieren - von was auch immer - gibt, ich ihn aber lediglich noch nicht gefunden habe?

Die Frage war:
"...wieviel Center-Automatik (horizontal + vertikal) ist maximal machbar?"
Ich gebe zu, daß ich aus jetziger Sicht die Frage nicht präzise genug gestallt habe, insbesondere ist sie "nach oben offen", was aber nicht in meiner Absicht lag. Aber ich weiß - dank den Kommentaren - es erst jetzt besser.

Die Frage stelle ich inzwischen so:
Gibt es für das generelle Zentrieren (horizontal + vertikal) aller Elemente in einer GUI einen allgemeinen Funktionsschalter wie "CENTER", und wenn ja, wie setzt man diesen dann ein?

Die Antwort darauf wurde in diesem Post eindeutig gegeben - wenn auch zwischen den Zeilen:

"NEIN - diesen angefragten Zentrier-Befehl gibt es nicht.
Wenn du das so haben willst, dann ist Handarbeit angesagt, so wie du es ja schon gemacht hast.
Aber du kannst ja - so wie wir auch - jederzeit "Motorenbauer" werden und dir einen solchen Befehl mit dem Casio neben der Maus ertüfteln - so du dich dazu geführt fühlst."


Insofern ist meine Frage beantwortet.
Vielen Dank.

Bei meinen künftigen Posts werde ich mich bemühen, gerade in der hier diskutierten Angelegenheit deutlich präziser meine Fragen zu stellen - versprochen.
Last edited by Stroker-007 on 30 Jun 2022, 00:39, edited 1 time in total.

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Re: Auto-Center für alle GUI-Elemente

Post by Stroker-007 » 29 Jun 2022, 19:42

Weil das nun ein so langer trockener Text war, hier noch etwas Unterhaltung.
Ich stelle das Skript ein, das der (nebensächliche) Ausgangspunkt für diesen Post war.
Möge es dem ein oder anderen genauso nützlich sein wie mir. Prost!

Code: Select all

#SingleInstance Force
CoordMode Mouse

; Dieses Skript wurde durch das AHK-Doku-Beispiel bei "PixelGetColor" inspiriert. 
; Es stellt im Clipboard "schlüsselfertige" Einfügedaten für das Skripten zur Verfügung.   
; Nach individuellen Bedürfnissen änder- und ausbaubar.
; Ich rufe es mittels meinem allgemeinen AHK-Systray-Servicepoint auf.

Action := "Mouse" ;  default

Gui, Font, s10 
Gui, +AlwaysOnTop
Gui, Add, Text, x30 y20 Center, Welche Daten sollen ins Clipboard kopiert werden?`nMausPos = voreingestellt.
Gui, Add, Button, x30  y69 w90 h25, MausPos
Gui, Add, Button, x137 y69 w90 h25, Farbe
Gui, Add, Button, x244 y69 w90 h25, FensterID
Gui, Add, Text, x45 y111 Center, Mausspitze an gewünschter Stelle platzieren,`ndann [Ctrl-Alt-K] drücken.
Gui, Show, w363 h164, Koord-Farb-Fen
Return

GuiEscape:
GuiClose:
ExitApp

ButtonMausPos:
Action := "Mouse"
Return

ButtonFarbe:
Action := "Color"
Return

ButtonFensterID:
Action := "Window"
Return

^!k::

if Action = Mouse
{
   MouseGetPos, MausX, MausY
   Info := "Koordinaten = " MausX ", " MausY
   MsgBox, 4096,, %Info%, 2
   Clipboard := MausX ", " MausY
}
else 
if Action = Color
{
   MouseGetPos, MausX, MausY
   CoordMode Pixel
   PixelGetColor, Farbe, %MausX%, %MausY%, RGB
   Info := "RGB-Farbe = " Farbe
   MsgBox, 4096,, %Info%, 2
   Clipboard := Farbe
}
else 
if Action = Window
{
   MouseGetPos,,, Window

   ; buchbar nach Bedarf (auch als Untermenü ausbaubar - wenn ich mal Zeit habe)
   ;WinGet, ProzessID, PID, ahk_id %Window%
   ;WinGetTitle, Titel, ahk_id %Window%
   ;WinGetClass, Klasse, ahk_id %Window%

   Info := "FensterID = " Window
   MsgBox, 4096,, %Info%, 2
   Clipboard := Window
}
Return

just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Auto-Center für alle GUI-Elemente

Post by just me » 04 Jul 2022, 07:22

Moin,

ein später Nachklatsch.

Es ist wahrscheinlich möglich, die Größe des Fensters und die Größe und Verteilung der Controls vollautomatisch zu berechnen. Es ist allerdings höchstwahrscheinlich recht mühsam. Normalerweise würde man in einem 'Probelauf' alle Controls erstellen, um die Größe zu bestimmen. Dann kann man mit etwas Rechnerei im zweiten Durchgang die Controls positionieren und dimensionieren.

Für das gegebene Beispiel sieht die Sache nicht so kompliziert aus. Hier reicht es, das Control zu bestimmen, welches die Breite des Fensters bestimmt. In Deinem Fall ist es das erste Textelement.

Für die Standardabstände zwischen den Controls und den Controls zum Fensterrand gibt es:

Code: Select all

Gui, Margin, ...
Damit wird die Fenstergröße abhängig von den sichtbaren Controls automatisch bestimmt. Wenn Du Position und/oder Größe eines Controls am Fensterrand nachträglich änderst, kannst Du die Neuberechnung der Randbereiche erzwingen:

Code: Select all

Gui, Show, AutoSize ...
Hier ein Beispiel für die 'halbautomatische' Berechnung Deines Beispielfensters:

Code: Select all

#SingleInstance Force
CoordMode Mouse

; Dieses Skript wurde durch das AHK-Doku-Beispiel bei "PixelGetColor" inspiriert.
; Es stellt im Clipboard "schlüsselfertige" Einfügedaten für das Skripten zur Verfügung.
; Nach individuellen Bedürfnissen änder- und ausbaubar.
; Ich rufe es mittels meinem allgemeinen AHK-Systray-Servicepoint auf.

Action := "Mouse" ;  default

; Gui, Font, s10
; Gui, +AlwaysOnTop
; Gui, Add, Text, x30 y20 Center, Welche Daten sollen ins Clipboard kopiert werden?`nMausPos = voreingestellt.
; Gui, Add, Button, x30  y69 w90 h25, MausPos
; Gui, Add, Button, x137 y69 w90 h25, Farbe
; Gui, Add, Button, x244 y69 w90 h25, FensterID
; Gui, Add, Text, x45 y111 Center, Mausspitze an gewünschter Stelle platzieren,`ndann [Ctrl-Alt-K] drücken.
; Gui, Show, w363 h164, Koord-Farb-Fen
Gui, Font, s12
Gui, +AlwaysOnTop
; Fensterrandbereiche und Standardabstände zwischen den Controls festlegen
Gui, Margin, 30, 20
; Der erste Text ist hier das 'bestimmende' Control und wird ohne Positions- bzw. Größenangaben erstellt
Gui, Add, Text, vTX Center, Welche Daten sollen ins Clipboard kopiert werden?`nMausPos = voreingestellt.
; Wir holen uns die von AHK bestimmte Größe
GuiControlGet, TX, Pos
; Weil danach 3 Buttons in einer Reihe erstellt werden, sollte die Breite durch 3 teilbar sein
W := Ceil(TXW / 3) * 3
; Ggf. wird die Breite korrigiert
If (W <> TXW)
   GuiControl, Move, TX, w%W%
; Die Breite der Buttons wird auf 1/3 der um 30 (2 * 15 für die Abstände) verringerten Textbreite festgelegt.
BtnW := (W - 30) / 3
; Ersten Button am linken Rand erstellen (xm)
Gui, Add, Button, xm w%BtnW%, MausPos
; Zweiten Button mit einem Abstand von 15 Pixeln (x+15) auf der Höhe des ersten Buttons (yp) erstellen.
Gui, Add, Button, x+15 yp wp, Farbe
; Dritten Button mit einem Abstand von 15 Pixeln (x+15) auf der Höhe des zweiten Buttons (yp) erstellen.
Gui, Add, Button, x+15 yp wp, FensterID
; Der letzte Text ist zentriert und kann deshalb die Breite des ersten Textcontrols nutzen
Gui, Add, Text, xm y+20 w%w% Center, Mausspitze an gewünschter Stelle platzieren,`ndann [Ctrl-Alt-K] drücken.
; Die Fensterrandbereiche werden automatisch berücksichtigt
Gui, Show, , Koord-Farb-Fen

Return

GuiEscape:
GuiClose:
ExitApp

ButtonMausPos:
Action := "Mouse"
Return

ButtonFarbe:
Action := "Color"
Return

ButtonFensterID:
Action := "Window"
Return

^!k::

if Action = Mouse
{
   MouseGetPos, MausX, MausY
   Info := "Koordinaten = " MausX ", " MausY
   MsgBox, 4096,, %Info%, 2
   Clipboard := MausX ", " MausY
}
else
if Action = Color
{
   MouseGetPos, MausX, MausY
   CoordMode Pixel
   PixelGetColor, Farbe, %MausX%, %MausY%, RGB
   Info := "RGB-Farbe = " Farbe
   MsgBox, 4096,, %Info%, 2
   Clipboard := Farbe
}
else
if Action = Window
{
   MouseGetPos,,, Window

   ; buchbar nach Bedarf (auch als Untermenü ausbaubar - wenn ich mal Zeit habe)
   ;WinGet, ProzessID, PID, ahk_id %Window%
   ;WinGetTitle, Titel, ahk_id %Window%
   ;WinGetClass, Klasse, ahk_id %Window%

   Info := "FensterID = " Window
   MsgBox, 4096,, %Info%, 2
   Clipboard := Window
}
Return

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Re: Auto-Center für alle GUI-Elemente

Post by Stroker-007 » 04 Jul 2022, 16:51

Hello just me,

vielen Dank für dieses eindrucksvolle Beispiel!
Habe sofort mit anderen Schrift-Größen experimentiert und wurde staunender Zuschauer eines geradezu magischen Anpassungs-Vorganges.

Der Versuch, Deine extra Bemühungen jetzt tatsächlich zu verstehen, fordert mich aktuell noch ziemlich heraus, aber ich wills versuchen.
Gui, Add, Text, vTX Center, Welche Daten sollen ins Clipboard kopiert werden?`nMausPos = voreingestellt.
; Wir holen uns die von AHK bestimmte Größe
GuiControlGet, TX, Pos
; Weil danach 3 Buttons in einer Reihe erstellt werden, sollte die Breite durch 3 teilbar sein
W := Ceil(TXW / 3) * 3
Der Schlüssel zu meinem Verständnis dürfte in diesen Zeilen liegen.
TX ist ein (von Dir kreierter) Variablenname, der mit vTX geholt wird. Hoff ich doch.

Was bitte ist jetzt "TXW" ?

Ist das eine Variable VOR der Breite-Option? Im Gegensatz zu w[meine Angabe] - also nach w - muß offensichtlich eine Variablen-Übergabe AN w VOR w stehen?
Ist das richtig? Wo in der Doku steht genau das? Und daß sowas überhaupt gemacht werden kann. Und wie man da überhaupt drauf kommen kann... :roll:

Ich schätze, wenn ich das geklickt habe, dann versteh ich den Rest auch noch...

Danke Dir schon mal!
Stroker-007

just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Auto-Center für alle GUI-Elemente  Topic is solved

Post by just me » 05 Jul 2022, 03:17

Moin,

Code: Select all

Gui, Add, Text, vTX Center, Welche Daten sollen ins Clipboard kopiert werden?`nMausPos = voreingestellt.
Erst einmal habe ich dem Textelement den Namen TX verpasst. Diesen Namen kann man auch für die Ausgabevariable von GuiControlGet benutzen. AHK kann dann automatisch zuordnen, auf welches Element sich die Anweisung bezieht.

Code: Select all

GuiControlGet, TX, Pos
Mit dem Unterbefehl Pos holt man sich Position und Größe eines Gui-Controls. Der Name der Ausgabevariablen dient hier nur als Stammname. Mit den Stammnamen TX erzeugt die Anweisung 4 Variablen mit den Namen TXX (X-Position), TXY (Y-Position), TXW (Breite) und TXH (Höhe). TXW enthält deshalb die aktuelle Breite des Textelements TX. Hättest Du das Element mit einer Breitenangabe wie w600 erstellt, würde TXW ebenfalls 600 enthalten.

Genug erklärt? ;)

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Re: Auto-Center für alle GUI-Elemente

Post by Stroker-007 » 06 Jul 2022, 12:55

Ja, danke, ist genug erklärt.
Verstehe jetzt, wie das funktioniert.

Ist aber trotzdem für mich und meine momentane AHK-Lernstufe noch sehr abenteuerlich, dieses "freihändige Jonglieren" mit frank und frei hingezauberten Variaben. Ich mein, als "Erlebniserzählung" könnte ich das sofort auch, wenn ich einfachso drauflos überlege, was zur Umsetzung der Skalierbarkeit, die sich am 1. Textelement (TX) orientiert, alles zu machen wäre. Aber bei der skriptischen Umsetzung würde ich dann wohl - frank und frei - so einige Funktionen erfinden... was dann aber net läuft. Aber so ganz weit entfernt wäre ich bei AHK damit nicht einmal. Denn der skriptisch umgesetzte Zauber hat - wie in diesem Beispiel zu sehen - durchaus was von einer gewissen Banalität, oder besser puren Einfachheit. Und in solche Denke zusammen mit den Regeln reinzukommen... das dauert halt.

Danke für das Lehrstück!

Post Reply

Return to “Ich brauche Hilfe”