Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

GUI mit -caption Option "beweglich" machen



  • Please log in to reply
20 replies to this topic
fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Guten Morgen zusammen,

 

wenn ich meine GUI mit der -caption option ausstatte dann erscheint sie an der Position die ich per Gui, Show angebe. Wie kann ich das Fenster beweglich machen, so dass ich als User es verschieben kann? Am besten so, dass es sich bewegen lässt wenn man in den Hintergrund klickt und die Maustaste gedrückt hält.

 

In der Hilfe finde ich dazu leider nichts.

 

Per Google Scripte zu finden ist seit dem Forumumzug schwer geworden. Früher war es leichter Beispiele zu finden.

 

Ich hoffe ich nerv euch nicht...

 

MfG
fump



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Ich würde folgende Befehle benutzen ich will mal sehen ob dir das weiterhilft.

  1. OnMessage(LClick)

     

  2. SetTimer

     

  3. GetkeyState

     

  4. MouseGetPos

     

  5. WinMove

Versuch mal damit selber eine Lösung zu basteln.

Die Befehle stehen sogar schon in der richtigen Reihenfolge.

 

Ich hoffe ich nerv euch nicht...

Nein ganz im Gegenteil es ist ganz schön zu sehen, dass sich jemand richtig reinhängt.


Visit the new forum ahkscript.org.

http://ahkscript.org


Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012
Mit jeder neuen frage die im Forum beantwortet wird, erleichtert man anderen dann später, die Lösung zu finden! Zumindest solange das Forum auch erhalten bleibt...
R.I.P. DE-Forum

Find the recent autohotkey version here: ahkscript.org


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

So da bin ich wieder happy.png

 

Ich habe mir die von nnnik aufgezählten Befehle angeschaut und etwas daraus gebastelt... Ich bekomm es hin das es sich bewegt, aber es beweget sich immer wenn die Linke Maustaste gedrückt wird. Ich bekomms nicht hin die eigentliche Funktion an dieses eine Fenster zu binden.

 

Hier mein bisheriger Code:

 

ClipGUIOrder := 4

Gui, Clip:New, HWNDh_ClipGUI +ToolWindow +LastFound +AlwaysOnTop -caption
xPos := 5
If (ClipGUIOrder = 3)
	yPos := 10
else
	yPos := 25
Loop, 6
{
	If (ClipGUIOrder = 1)
		{
			Gui, Clip:Font, S6 CDefault, Verdana
			Gui, Clip:Add, Button, x10 y5 w60 h15 gClipOptions, OPTIONEN
			Gui, Clip:Add, Button, x90 y5 w60 h15 gClipExit, EXIT
		}
	If (ClipGUIOrder = 2)
		{
			Gui, Clip:Font, S6 CDefault, Verdana
			Gui, Clip:Add, Button, x10 y5 w60 h15 gClipOptions, OPTIONEN
			Gui, Clip:Add, Button, x170 y5 w60 h15 gClipExit, EXIT
		}
	If (ClipGUIOrder = 3)
		{
			Gui, Clip:Font, S6 CDefault, Verdana
			Gui, Clip:Add, Button, x485 y10 w60 h15 gClipOptions, OPTIONEN
			Gui, Clip:Add, Button, x485 y30 w60 h15 gClipExit, EXIT
		}
	If (ClipGUIOrder = 4)
		{
			Gui, Clip:Font, S6 CDefault, Verdana
			Gui, Clip:Add, Button, x10 y5 w60 h15 gClipOptions, OPTIONEN
			Gui, Clip:Add, Button, x10 y320 w60 h15 gClipExit, EXIT
		}
	Gui, Clip:Font, S10 CDefault, Verdana
	Gui, Clip:Add, Text, x%xPos% y%yPos% w10 h20 , %A_Index%
	Gui, Clip:Font, S6 CDefault, Verdana
	Gui, Clip:Add, Text, xp+10 yp w25 h25 border, 
	Gui, Clip:Add, Text, xp+25 yp w25 h25 border, 
	Gui, Clip:Add, CheckBox, xp+28 yp w10 h12,
	Gui, Clip:Add, CheckBox, xp yp+13 w10 h12,
	Gui, Clip:Add, Button, xp-53 yp+12 w25 h15 , CN
	Gui, Clip:Add, Button, xp+25 yp w25 h15 , DEL
	if (ClipGUIOrder = 1)
		{
			if (A_Index = 3)
				{
					xPos += 80
					yPos := 25
				}
			else
				yPos += 50
		}
	If (ClipGUIOrder = 2)
		{
			if (A_Index = 2 || A_Index = 4)
				{
					xPos += 80
					yPos := 25
				}
			else
				yPos += 50
		}
	If (ClipGUIOrder = 3)
		{
			xPos += 80
		}
	If (ClipGUIOrder = 4)
		{
			yPos += 50
		}
}

OnMessage(0x201, "WM_LBUTTONDOWN")

Gui, Clip:Show
Return

ClipOptions:
Return

ClipExit:
Gui, Clip:Destroy
Return

WM_LBUTTONDOWN()
{
	Settimer, MoveClip, 100
}

MoveClip:
Loop,
	{
		KeyIsDown := GetKeyState("LButton")
		if (KeyIsDown=1)
			{
				MouseGetPos, AusgabeX, AusgabeY
				WinMove, ahk_id %h_ClipGUI%,, %AusgabeX%, %AusgabeY%
			}
		else
                        {
                               Settimer, MoveClip, off
                               break
                        }
	}
Return

Falls jemand noch einen Tip für den Aufbau der GUI hat dann immer her damit happy.png

 

Weitere Hilfe nehme ich gerne an!

 

MfG
fump



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Ich konnte das Verhalten von deinem Script leider nicht nachbauen wahrscheinlich liegt es daran, dass du noch andere Fenster im Hintergrund hast die auch diese Nachricht empfangen und zu diesem Skript gehören.

Um das zu verhindern kannst du die HWND auslesen die bei deinem SnedMessage mitgeliefert wird>> siehe Hilfe mit der deines Fensters vergleichen.

 

 

BTW

CoordMode muss übrigens hierbei auf Screen gesetzt werde weil sonst erhälst du einen Bug.

Und ich hätte den Code für das Fenster verschieben eher so geschrieben:

 

WM_LBUTTONDOWN(lparam,wparam,param3,HWND)
{
Global ClipGuiHwnd
d:=A_FormatInteger ;Für die Hex>>dezimal Umwandlung
SetFormat,IntegerFast,H ;Für die Hex>>dezimal Umwandlung
If (HWND+0=GUIHWND) ;wenn das Aktive Fenster dein Fenster ist
    Settimer, MoveClip, 100 
SetFormat,IntegerFast,% d ;auf den vorherigen Wert zurücksetzen.
}

MoveClip:
MouseGetPos,StartX,StartY
Loop,
	{
		KeyIsDown := GetKeyState("LButton")
		if (KeyIsDown=1)
			{
                MouseGetPos, AusgabeX, AusgabeY
				WinMove, ahk_id %h_ClipGUI%,,% AusgabeX-StartX,% AusgabeY-StartY ;ist Geschmacksache :D
            }
		else
                        {
                               Settimer, MoveClip, off
                               break
                        }
	}
Return

Aber sonst echt gute Arbeit grin.png


Visit the new forum ahkscript.org.

http://ahkscript.org


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Ja stimmt. Ich habe noch eine GUI im Hintergrund von der aus diese GUI gestartet wird.

 

Wenn ich auf das Clip GUI klicke dann springt das Fenster zwischen der oberen linken Ecke und dem Mauszeiger hin und her. Ich hab es nun per IfWinActive, ahk_id %h_ClipGUI% auf diese GUI gebunden aber das Springen bekomm ich nicht weg. Damit die Controls weiterhin nutzbar sind hab ich es nun auf die rechte Maustaste umgeändert, gibt es dazu eine elegantere Lösung? Damit die Controls auch bei benutzen der linken Maustaste weiterhin funktional bleiben.

 

Ich hab den CoordMode für Mouse auf Screen gesetzt und die Clip GUI um Default ergänzt. Leider ohne Erfolg.

 

Der untere Teil sieht nun so aus:

MoveClip:
Loop,
	{
		KeyIsDown := GetKeyState("RButton")
		if (KeyIsDown=1)
			{
				IfWinActive, ahk_id %h_ClipGUI%
					{
						Gui, Clip:Default
						MouseGetPos, AusgabeX, AusgabeY
						WinMove, ahk_id %h_ClipGUI%,, %AusgabeX%, %AusgabeY%
					}
			}
		else
			{
				Settimer, MoveClip, off
				break
			}
	}


just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011
✓  Best Answer

Männer Gottes, das ist doch schon uralt:

 

#NoEnv

Gui, -Caption
Gui, Margin, 20, 20
Gui, Add, Text, w400 h400 Center +0x100 +0x200 Border, Klicke irgendwo außerhalb um dieses Fenster zu bewegen!
Gui, Show, , Move GUI without caption!
OnMessage(0x201, "WM_LBUTTONDOWN")

Return

GuiClose:
GuiEscape:
ExitApp

WM_LBUTTONDOWN() {
   If (A_GuiControl = "") ; Klick auf den Hintergrund der GUI
      PostMessage, 0xA1, 2, 0 ; sehr sehr alter Trick von SKAN: 0xA1 = WM_NCLBUTTONDOWN
}

 

 


Prefer ahkscript.org for the time being.


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Durch nnnik hab ich auf jeden Fall etwas gelernt, darauf kommt es ja an :) Vielen Dank dafür!

 

Die Lösung von just me hab ich bei meiner Recherche nicht gefunden. Wie hätte ich suchen sollen um das zu finden?



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Bei sowas hilft halt nur Erfahrung grin.png
Hätte aber selber draud kommen können da bei GUIs alles über Messages gemacht wird.


Visit the new forum ahkscript.org.

http://ahkscript.org


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Wie genau funktioniert das mit diesen Messages eigentlich?

 

Kann man das "mithören" abschalten? Ich sage dem Script ja es soll bei LMausButtonDown die Funktion X ausführen. Solange das Script läuft macht das Script genau das oder? Also bei jedem Linksklick egal in welcher Anwendungen es wird Funktion X ausgeführt. Stimmt das? Wie kann man dieses Verhalten abschalten?



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Nein nicht ganz es wird eine EventMessages an das betroffene Control/GUI gesendet.

Diese hat eine Nummer und das Control/die Gui verarbeitet dann diese anhand dieser Nummer.

 

Dein Skript erhält nur dann eine Message wenn ein Guie, von deinem Script, betroffen ist (zumindest in der standard ausführungwink.png)

Ein sendmessage Befehl kommt einem Klick gleich über die Messages sagt das Betriebsystem dem Control, dass jetzt etwas eingegeben wurde. Also wäre es schlecht das abzuschalten.


Visit the new forum ahkscript.org.

http://ahkscript.org


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Klingt verständlich :) Danke!



Dr_Holle
  • Members
  • 105 posts
  • Last active: Mar 26 2014 10:10 AM
  • Joined: 18 Dec 2012

Danke just me, genau danach habe ich gerade gesucht cool.png



SAPlayer
  • Members
  • 403 posts
  • Last active: Apr 11 2014 04:45 PM
  • Joined: 06 Nov 2012

Danke erstmal für diese elegante Lösung ;)

Ich will jetzt aber soweit gehen, dass ich beim Ändern der Position die neue Position speichere, sodass diese wieder genutzt wird.

Allerdings weiß ich jetzt nicht, welche WM-Message ich dafür benutzen soll - WM_LBUTTONUP (0x202) und WM_NCLBUTTONUP (0xA2) habe ich schon probiert, leider erfolglos. Diese werden irgendwie vom WM_LBUTTONDOWN abgefangen...

 

Ich würde mich freuen, wenn mir da jemand auf die Sprünge helfen könnte.



fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Ich hab es ganz simpel gelöst:

WM_LBUTTONDOWN()
{
	global SaveXY
	IfWinActive, ahk_id %h_ClipGUI%
		{
			If (A_GuiControl = "") ; Klick auf den Hintergrund der GUI
				PostMessage, 0xA1, 2, 0 ; sehr sehr alter Trick von SKAN: 0xA1 = WM_NCLBUTTONDOWN
			if (SaveXY=0)
				{
					WinGetPos, ClipGUIX, ClipGUIY,,, ahk_id %h_ClipGUI%
					IniWrite,%ClipGUIX%, %A_ScriptDir%\funktionen.ini, ClipGUI, ClipGUIX
					IniWrite,%ClipGUIY%, %A_ScriptDir%\funktionen.ini, ClipGUI, ClipGUIY
				}
		}
}

Vielleicht reicht dir das ja auch :)