Jump to content

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

ToolTip Script klappt nicht bei Textfeldern



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

Guten Abend,

 

dieses Script hier zeigt auf Controls einen ToolTip an beim Mouseover.

Ich hatte gehofft das es auch bei Text klappt. Jedoch wird bei Text nix angezeigt.

 

Ich verstehe das Script nicht gut genug um es anzupassen.

 

Könnte mir jemand erklären was zu tun ist damit es auch bei Textfeldern klappt?

 

Vielen Dank!

 

MfG
fump

 

Gui, 2:Add, Text,, Move mouse over any control in this window
Gui, 2:Add, Edit, w200 vMyEdit
Gui, 2:Add, button,Vbutton1 y+15, Button
Gui, 2:Add, text,Vtext1 x+10, Button
Gui, 2:Add, Checkbox, Vmycheckbox x+10,checkbox
Gui, 2:Show,,Tool tip for controls

; in this array for the first element define a tooltip message, for the second element the name of a control 
; the third element another tooltip message and the fourth element another name of control and so on
;  ***********       tooltip message,control's name
msg_control_array = tip for edit box,MyEdit
                   ,tip for first  button,button1
                   ,tip for second button,text1
                   ,tip for the checkbox,mycheckbox

OnMessage(0x200, "WM_MOUSEMOVE")
OnMessage(0x2a3, "WM_MOUSELEAVE")
return

WM_MOUSEMOVE(wParam, lParam)
{
global gcontrol         ; in case I need this variable outside of the funtion
gcontrol := A_GuiControl
X := lParam & 0xFFFF      ;  in case I need the mouse X posicion
Y := lParam >> 16         ;  in case I need the mouse Y posicion
if gcontrol =   
   return    ;  exit funtion if control = ""
global msg_control_array
Loop, parse, msg_control_array, `,
	{ 
	if gcontrol = %A_LoopField%
		{
     tooltip %msg%
     break
 		} ; end if
	msg := A_LoopField
	} 
}       

WM_MOUSELEAVE(wParam, lParam)
{
  OnMessage(0x200, "WM_MOUSEMOVE")     ; On WM_MOUSELEAVE reanable WM_MOUSEMOVE
  tooltip
} 


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

Ich versteh nicht warum es nicht klappt. A_GuiControl beinhaltet lt. Hilfe "Der zugewiesene Variablenname des GUI-Steuerelements" also ist ein Textfeld kein Steuerelement? Kann das Script somit gar nicht funktionieren?



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

Kommas excapen und neuen Zuweisungsoperator benutzen: msg_control_array := "tip for edit box`,MyEdit`n`,tip for first button`,button1`n`,tip for second button`,text1`n`,tip for the checkbox`,mycheckbox"

 

 

En Hilfe:"OnMessage"

Und:
A_GuiControl: Blank unless the message was sent to a GUI control, in which case it contains the control's variable name or other value as described at A_GuiControl. Some controls never receive certain types of messages. For example, when the user clicks a text control, the operating system sends WM_LBUTTONDOWN to the parent window rather than the control; consequently, A_GuiControl is blank.




The Function's Parameters
A function assigned to monitor one or more messages can accept up to four parameters:

MyMessageMonitor(wParam, lParam, msg, hwnd)
{
    ... body of function...
}Although the names you give the parameters do not matter, the following information is sequentially assigned to them:

Parameter #1: The message's WPARAM value, which is an integer between 0 and 4294967295.
Parameter #2: The message's LPARAM value, which is an integer between 0 and 4294967295.
Parameter #3: The message number, which is useful in cases where a function monitors more than one message.
Parameter #4: The HWND (unique ID) of the window or control to which the message was sent. The HWND can be used with ahk_id.
 


Visit the new forum ahkscript.org.

http://ahkscript.org


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

@nnnik:

  1. Wenn du einen String mit := und Anführungszeichen zuweist (was bei dir der Fall ist), müssen Kommas nicht escapet werden
  2. Die HWND enthält aber nicht den Namen (in diesem Fall text1), somit ist es schwer, mit ihr zu arbeiten. Ich glaube, sie wird sogar bei jedem Script-Start geändert.


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

1. Ist das so, schön zu hören.grin.png

2. Man kann eine Ausgabevariable für die HWND von jedem Gui control erstellen.

 v:={} ;ein Assoziatives Array (nimmt auch strings an, anstatt bur Zahlen.)
Gui,Add,Text,HWNDHwndvariable1 vMyText
v[Hwndvariable1]:="MyText"
Gui,Add,Button,HWNDHwndvariable vMyButton
v[Hwndvariable]:="MyButton"
Controlname:=v[hwnd]

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

Ich verstehe was ihr mir sagen wollt, aber ich weiß nicht wie ich das umsetzen soll auf das oben gepostete Script :(

 

Die Hwnd ist über die OnMessage funktion eine normale Zahl. Wenn ich die Hwnd dann zum vergleich direkt über das Text-Element hole per "vEigenesEdit HwndEigenesEditHwnd" dann fängt diese mit 0x an.



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

Löscht meine Idee die Hwnd ist zwar richtig und das umrechnen des Hexstrings ist auch kein Problem, aber wie die Hilfe schon sagt werden die Messages anstatt an Text Controls an das Fenster gesendet. Der Pararmeter HWND enthält also die HWND des Fensters anstatt des Controls. Also kann man das Control nicht genau über die HWND bestimmen. Einzige Möglichkeit obwohl es hässlich ist: Die X und Y Koordinaten

Isinanyrect(x,y,Coords)
{
For each, val in Coords
{
msgbox % val[1] " " val[2] " " val[3] " " val[4]
If ((x>val[1])&&(x<val[2])&&(y>val[3])&&(y<val[4]))
return each
}
return ""
}


;Example:
rect:=[] ;dieses Array wird in ein anderes Array eingefügt es Enthält die X&Y MIN&MAX Werte:
v:={}
rect[1]:=0 ;Das Control beginnt bei X=0
rect[2]:=100 ;Das Control endet bei X=100
rect[3]:=0 ;Das Control beginnt bei Y=0
rect[4]:=10 ;Das Control endet bei Y=10
v["text1"]:=rect ;in v speicherst du so alle Controls 
rect:=[] ; wichtig!
rect[1]:=0 ;Das Control beginnt bei X=0
rect[2]:=100 ;Das Control endet bei X=100
rect[3]:=15 ;Das Control beginnt bei Y=0
rect[4]:=25 ;Das Control endet bei Y=10rect:=[]
v["text2"]:=rect


Msgbox % Isinanyrect(10,20,v) ; zum beispiel

 


Visit the new forum ahkscript.org.

http://ahkscript.org


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

Man könnte auch MouseGetPos nehmen (glaube 4. Parameter), das ist zwar nicht der AHK-Name des Controls, aber der Name bleibt zumindest mal (glaube ich) immer gleich ;)



Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012

Ja SAPlayer, MouseGetPos funktioniert, es gibt eben die ClassNN des Steuerelements und nicht den Namen aus.

Die Textlabels werden dort als "Statics" erkannt.


Find the recent autohotkey version here: ahkscript.org


Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012

Verwendung zum Beispiel so hier:

Gui, 2:Add, Text,, Move mouse over any control in this window
Gui, 2:Add, Edit, w200 vMyEdit
Gui, 2:Add, button,Vbutton1 y+15, Button
Gui, 2:Add, text,Vtext1 x+10, Button
Gui, 2:Add, Checkbox, Vmycheckbox x+10,checkbox
Gui, 2:Show,,Tool tip for controls
SetTimer, Hover, 100
Return

Hover:
	Gui 2:Default
	MouseGetPos,,,, ClassNN
	ControlGet, cHWND, Hwnd,, %ClassNN%, A
	GuiControlGet, controlname, Name, %cHWND%
	ToolTip % controlname
Return

Es stimmt zwar das MouseGetPos nur die ClassNN zurückgibt, aber davon kann man auf den Handle des Controls schließen und mit dem Handle kann man den Namen der zugewiesenen Variable ermitteln.


Find the recent autohotkey version here: ahkscript.org


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

http://www.autohotke...r-pic/?p=490639


Prefer ahkscript.org for the time being.


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

Verwendung zum Beispiel so hier:

Gui, 2:Add, Text,, Move mouse over any control in this window
Gui, 2:Add, Edit, w200 vMyEdit
Gui, 2:Add, button,Vbutton1 y+15, Button
Gui, 2:Add, text,Vtext1 x+10, Button
Gui, 2:Add, Checkbox, Vmycheckbox x+10,checkbox
Gui, 2:Show,,Tool tip for controls
SetTimer, Hover, 100
Return

Hover:
	Gui 2:Default
	MouseGetPos,,,, ClassNN
	ControlGet, cHWND, Hwnd,, %ClassNN%, A
	GuiControlGet, controlname, Name, %cHWND%
	ToolTip % controlname
Return

Es stimmt zwar das MouseGetPos nur die ClassNN zurückgibt, aber davon kann man auf den Handle des Controls schließen und mit dem Handle kann man den Namen der zugewiesenen Variable ermitteln.

 

Danke dafür! Anhand dieses Beispiels hab ich es nun ins andere Script integriert. Es funktioniert auch.

 

Was mich aber nun irritiert ist, dass Tooltip wird jenachdem wie schnell man ein element verlässt nicht ausgeblendet.

 

Habt ihr ne idee warum dem so ist?

 

Gui, 2:Add, Text,, Move mouse over any control in this window
Gui, 2:Add, Edit, w200 vMyEdit
Gui, 2:Add, button,Vbutton1 y+15, Button
Gui, 2:Add, text,Vtext1 x+10, Button
Gui, 2:Add, Checkbox, Vmycheckbox x+10,checkbox
Gui, 2:Show,,Tool tip for controls

msg_control_array = tip for edit box,MyEdit
                   ,tip for first  button,button1
                   ,tip for second button,text1
                   ,tip for the checkbox,mycheckbox

OnMessage(0x200, "WM_MOUSEMOVE")
OnMessage(0x2a3, "WM_MOUSELEAVE")
Return


WM_MOUSEMOVE(wParam, lParam)
{
	global controlname
	Gui 2:Default
	MouseGetPos,,,, ClassNN
	ControlGet, cHWND, Hwnd,, %ClassNN%, A
	GuiControlGet, controlname, Name, %cHWND%

	X := lParam & 0xFFFF
	Y := lParam >> 16
	if controlname =   
	   return

	global msg_control_array
	Loop, parse, msg_control_array, `,
		{ 
			if controlname = %A_LoopField%
				{
					tooltip %msg%
					break
				}
			msg := A_LoopField
		}
}

WM_MOUSELEAVE(wParam, lParam)
{
	OnMessage(0x200, "WM_MOUSEMOVE")     ; On WM_MOUSELEAVE reanable WM_MOUSEMOVE
	tooltip
} 
Return


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

Just mes Antwort war zwar kürzer der Inhalt war aber besser:

Du musst den Style 0x0100 bei deinen Text Controls Einschalten damit bei diesen A_GuiControl nicht leer ist.

 

To get notifications from static controls (Text, Pic) you have to define a gLabel or set the style SS_NOTIFY := 0x0100
Gui, Add, Text, vMyEdit2 gDummy, TOOLTIP2
; or
Gui, Add, Text, vMyEdit2 0x0100, TOOLTIP2


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

Also du meinst ich kann das Script vom ersten Post nehmen wenn ich den style hinzufüge?

 

Hab ich gemacht. Klappt auch :)

 

Aber... Beim verlassen des Textfeldes bleibt das tooltip stehen. Solange bis die maus über ein anderes Control geschoben wird.

 

Hast du ne Idee warum das so ist?

 

Gui, 2:Add, Text, x382 y170 w20 h20 vInfoFirst1 Center 0x0100, [?]

Gui, 2:Add, Text, x582 y170 w20 h20 vInfoFirst2 Center 0x0100, [?]

Gui, 2:Add, Text, x902 y170 w20 h20 vInfoFirst3 Center 0x0100, [?]

Gui, 2:Add, Text, x526 y200 w20 h20 vInfoFirst4 Center 0x0100, [?]

 

Diese 4 als Beispiel. Insgesammt sind es über 30 solcher Textfelder.



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

Mmh egal wie ich es versuche, leider bleibt das Tooltip immer stehen und verschwindet nicht.

 

Könnte mir da jemand bitte bitte die Lösung verraten?