Kontextmenü, mit Icon, Bildern (jpg,gif,bmp) oder Farbquadraten - habe ich gerade vor ein paar Tagen in den Skripten gepostet. Guckst du ![]()
Beiträge von BugFix
-
-
Öffne mal SciTE und gib "Alt+w" ein. Im Wizard kannst du u.A. auch Code für MsgBoxen mit allen Einstellungen generieren.

-
v0.7
Berücksichtigung von DISABLED Item. -
Warum hast du nicht GUICtrlSendToDummy dafür benutzt?
OK, wenn man mit Dummy arbeitet ist das eine Lösung. Ich hatte aber noch das Problem, dass ich existierende Controls nutzen musste (in meiner MenuEx-UDF), das normale Event aber zwingend verworfen werden musste und ausschließlich aus der Callbackfunktion heraus stattfinden durfte. -
Ich hatte nach einer eleganten Lösung für dieses Problem gesucht und habe sie auch gefunden.
Falls jemand mal vor dem Problem steht, will ich euch das nicht vorenthalten.Wozu braucht man das?
[autoit]
Nun, wenn man mit GuiRegisterMsg arbeitet muss die Callbackfunktion schnellstmöglich verlassen werden. MsgBox, InputBox etc. dürfen von dort nicht aufgerufen werden
Nehmen wir aber an, eine in Auswertung der Callbackfunktion aufzurufende Funktion muss auf Usereingabe warten oder eine MsgBox zeigen, dann würde die Rückkehr aus der Callbackfunktion nicht absehbar sein und könnte zu undefinierten Zuständen (bis zum Absturz) führen. Bisher hatte ich dann immer eine Triggervariable gesetzt, deren Wert ich in der Hauptprogrammschleife überprüfte und dann die entsprechende Funktion aufrief.
Das geht aber auch eleganter. Man verwendet ein Control (wenn es sonst nicht benötigt wird, tuts auch ein Dummy) und läßt es auslösen. ControlClick ist eine Möglichkeit, funktioniert aber nicht in jeder Situation.
Mit dem folgenden Einzeiler kann man nun ganz elegant und sicher die Control-ID des gewünschten Controls in den Windows Nachrichtenstrom befördern und normal mit GuiGetMsg oder im OnEventMode auswerten._WinAPI_PostMessage($Handle_GUI, $WM_COMMAND, $ID_Ctrl, 0)
[/autoit] -
Schön, wenns euch gefällt.

Vorschlag: Mach die MouseOver-Farbe festlegbar. Das blau ist ja schön und gut, aber wenn ich meine GUI in Richtung grün beispielsweise designe, dann passt's nicht. Ich meine damit: Ein eigener Parameter zum Farbe festlegen.

Ich wollte mich da eigentlich an Standardmenüs orientieren. Und eine extra Farbgebung als Funktion möchte ich eigentlich nicht einbauen. Aber du kannst ja bei Bedarf die Globale Variable für die Farbe in deinem Skript überschreiben.
[autoit]Global $__iHOVER_COLOR = 0xADD8E6
[/autoit] -
Also zur Erklärung:
GUIRegisterMsg registriert ein Callback Funktion. In Abhängigkeit von den verwendeten Windows-Nachrichten enthalten wParam und lParam Werte.
Wenn du dich da informieren möchtest, lies am besten bei MSDN nach. Hier z.B. die Infos für WM_COMMAND
$GUI_RUNDEFMSG braucht keinen Wert extra bekommen - ist eine Konstante.
Mit dem Fokus kannst du das natürlich ganz nach Bedarf händeln. -
Version v0.6 - s. Post #1
-
könnte man als Traymenü für Linksclick und rechtsclick auch verwenden - also zwei getrennte menüs.
Hier verstehe ich jetzt nicht, was du meinst. Du möchtest dieses Kontextmenü als Traymenü verwenden? Könnte klappen, musst du dann für das TrayBar-Handle erstellen. Einfach mal Probieren.
wenn du das menü offen hast, nimmt er bei einem linksclick nicht auf dem menü, erst den zweiten - der erste wird fürs schliessen 'gefressen'.
Trifft zu, wenn du bei offenem Kontextmenü das Parent schließen willst oder eine andere Mausaktion stattfinden soll.
--> Behoben in nächster Version
die geänderten werte werden erst gesetzt wenn man das menü öffnet.
Gesetzt werden diese sofort. Wenn du das Event auswertest und den Status auslliest, wirst du das feststellen. Es ist nur eine optische Verzögerung, die beim erneuten Öffnen des Menüs erscheint. Funktionell ohne Einfluss.
schön währe noch wenn die zeile auf der man sich gerade mit dem cursor befindet, erhöht wird.
Ich schau mal, was sich machen lässt.
-
Das ist schon sehr seltsam, ich hatte zwar eine Codezeile vergessen (Korrektur, wenn Menüfenster den unteren Bildschirmrand überragt), aber das kann eigentlich bei dir nicht zutreffen.
Die Position richtet sich nach dem Mausklick (Fenster Menü linke obere Ecke an Mauspos).
Kann ich so nicht nachbilden, sehr seltsam.Edit: Ahhh, habs entdeckt: Wenn nach Aufpoppen der GUI, diese verschoben wird und dann das Menü aufgerufen wird, erscheint es in Relation zum alten Standort.
Da muss ich mal suchen, warum das passiert - bei Parent-Child sollte das eigentlich nicht vorkommen. -
Hier ein neues Projekt von mir, die
MenuExOwnContext-UDF.Im Moment nur für Kontextmenüs, Erweiterung für Standardmenüs in Planung.Das sind die Eigenschaften:
- Anzeige des Menüs kann an Bedingung gekoppelt werden (z.B. Anzahl Item eines Listview muss > 0 sein)
- Itemtypen: Label, Checkbox, Radio, Image (jpg,bmp,gif), Icon (aus Icondatei, DLL), Shape (Trennlinie) --- Bilddateien sollten quadratisch sein, werden auf 16x16 px skaliert
- Menübreite wählbar, Standard 200 px
- Linker Rand für Menü allgemein und zusätzlich für jedes einzelne Item einstellbar (dadurch sind Einzüge möglich)
- Item-ID sind völlig normale Standard-Ctrl-ID und können somit auch "normal" angesprochen werden. Von Farbgebung (ausser Schrift) rate ich aber ab, da die Controls auf einem Background-Label liegen (vereinfacht die Größenanpassung des Menü-Fensters)Edit 1: Noch einen Fehler bei der Positionierung beseitigt
Edit 2:
- Neu: Hervorhebung der Item bei Mouse-Hover
- kleinen Bug für Fensterposition behoben
- Klick auf GUI bei offenem Menü wird jetzt erkanntEdit 3:
Jetzt ergänzt: Wenn ein Item auf GUI_DISABLE gesetzt ist, wird dieses beim Hover nicht gehighlightet und ein Mausklick bleibt ohne Effekt.Edit 4:
- Funktionen umbenannt zu _GUICtrlOwnContext_...
- Hover Color kann bei Erstellen des Menüs oder später mit eigener Funktion individuell festgelegt werden
- Bug beim Rechtsklick auf/neben offenes Menü gefixed
- Tipp von funkey für Bkcolor eingearbeitet
- Hover Geschwindigkeit erhöht (Adlibzeit von 50 auf 10 ms verringert)
- Im Bsp. sind jetzt alle Imagedaten binär hinterlegt (deshalb nur als Anhang)
aktuelle Version v0.8Edit 5:
- NEU Je Item kann ein Submenü (1 Level tief) erstellt werden. Markierung für Submenü differenziert nach Status Enable/Disable des Item.
WICHTIG: Bevor Submenüs erstellt werden können, müssen erst alle Item im Hauptmenü erstellt werden:Code
Alles anzeigen- Hauptmenü -- Item1 -- Item2 -- Item3 -- Submenü1 --- Item1 Sub1 --- Item2 Sub1 --- Item3 Sub1 -- Submenü2 --- Item1 Sub2 --- Item2 Sub2 --- Item3 Sub2
- überarbeitet: Erkennen, ob Maus über Item - nicht mehr an Ctrl gebunden. Die gesamte Fläche des Eintrags, inkl. Image, wird als Ctrl erkannt
- keine AdlibRegister-Funktion mehr, alles wird in Window- und Mouse-Procedure ausgewertet
- funkeys Hinweis berücksichtigt: bei erneutem Aufruf Menü jetzt alte Hovermarkierung gelöscht
Jetzt auch in der UDF Binärdaten (für SubItem-Markierung), daher neue Version nur im Anhang.
Neues Bsp-Skript. Die Bsp.-Skripte sind aufgrund kleiner interner Änderungen in der UDF mit den unterschiedlichen Versionen nicht kompatibel.
aktuelle Version v0.9so sieht es z.B. aus:
v0.8 [Blockierte Grafik: http://www.imgbox.de/users/BugFix/ContextMenu.jpg] v0.9Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. OwnContext v0.8 ( 0.9 im Anhang )
[autoit]#Region - TimeStamp
[/autoit] [autoit][/autoit] [autoit]
; 2012-07-11 22:49:23 v 0.8
#EndRegion - TimeStamp
#include-once
#Include <GUIConstantsEx.au3>
#Include <Constants.au3>
#include <StaticConstants.au3>
#Include <StructureConstants.au3>
#Include <WindowsConstants.au3>
#Include <WinAPI.au3>; ======================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; FUNCTIONS
;
; _GUICtrlOwnContext_Startup Initialize Functions
; _GUICtrlOwnContext_Shutdown Close Ressources, automatically on AutoIt Exit
; _GUICtrlOwnContext_Create Create (Context)Menu
; _GUICtrlOwnContext_AddItem Create Menu-Item (Default-Item, Checkbox-Item, Radio-Item, Shape)
; _GUICtrlOwnContext_AddImage Create Menu-Item with Image (icon, jpg/gif/bmp, colored squares)
; _GUICtrlOwnContext_ShowFlag Condition to show Menu (True/False)
; _GUICtrlOwnContext_SetHoverColor Sets custom hover color
; ======================================================================================================OnAutoItExitRegister('_GUICtrlOwnContext_Shutdown')
[/autoit] [autoit][/autoit] [autoit]Global Const $__HC_ACTION = 0
[/autoit] [autoit][/autoit] [autoit]
Global $__hGUI_MNUEX, $__hWIN_PROC, $__hHOOK_PROC
Global $__hSTUB__MouseProc, $__hMOD, $__hHOOK
Global $__aHWND_MNU[1][8] ; [[hWnd-ParentCtrl, hWnd-Menu, fCondition, Item-Array, Shape-counter, Margin, Width, HoverColor]] --- Item-Array: [[counter], [fIsRadio], [ID1, iType], [ID2, iType], [..IDn]]
Global $__iMNU_DEF_HOVERCOLOR = 0xEFFFFF
Global $__iMNU_DEF_WIDTH = 200
Global $__iMNU_DEF_HEIGHT = 23
Global $__iMNU_DEF_MARGIN = 10
Global $__iMNU_DEF_LABELSHIFT = 4
Global $__iMNU_DEF_SHAPEHEIGHT = 3
Global $__hCURRENT_ACTIVE_MNU = 0;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: _GUICtrlOwnContext_Startup
; Description......: Initialize functions
; Parameter(s).....: $_hGUI GUI Handle
; Return Value(s)..: Nothing
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _GUICtrlOwnContext_Startup($_hGUI)
$__hGUI_MNUEX = $_hGUI
; == initialize Callback Function to analyze $WM_NOTIFY
$__hWIN_PROC = DllCallbackRegister('__WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
$__hHOOK_PROC = _WinAPI_SetWindowLong($__hGUI_MNUEX, $GWL_WNDPROC, DllCallbackGetPtr($__hWIN_PROC))
; == initialize Callback Function to analyze MOUSE-Message
$__hSTUB__MouseProc = DllCallbackRegister("__MouseProc", "long", "int;wparam;lparam")
$__hMOD = _WinAPI_GetModuleHandle(0)
$__hHOOK = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($__hSTUB__MouseProc), $__hMOD)
EndFunc ;==>_GUICtrlOwnContext_Startup;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: _GUICtrlOwnContext_Shutdown
; Description......: Close ressources, automatically on AutoIt exit
; Requirement(s)...: _GUICtrlOwnContext_Startup() must be called before
; Return Value(s)..: Nothing
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _GUICtrlOwnContext_Shutdown()
_WinAPI_SetWindowLong($__hGUI_MNUEX, $GWL_WNDPROC, $__hHOOK_PROC)
_WinAPI_UnhookWindowsHookEx($__hHOOK)
DllCallbackFree($__hSTUB__MouseProc)
EndFunc ;==>_GUICtrlOwnContext_Shutdown;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: _GUICtrlOwnContext_Create
; Description......: Create (Context)Menu
; Parameter(s).....: $_hParentCtrl hWnd or ID of control, for which the menu is to be effective
; .................: $_iWidth Menu width (-1 = 200 px, Default)
; .................: $_iMarginLeft Left margin (-1 = 10 px, Default)
; .................: $_iHoverColor Item hover color, (-1=$__iMNU_DEF_HOVERCOLOR)
; Requirement(s)...: _GUICtrlOwnContext_Startup() must be called before
; Return Value(s)..: Menu Handle
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _GUICtrlOwnContext_Create($_hParentCtrl, $_iWidth=-1, $_iMarginLeft=-1, $_iHoverColor=-1)
If Not IsHWnd($_hParentCtrl) Then $_hParentCtrl = GUICtrlGetHandle($_hParentCtrl)
If IsKeyword($_iMarginLeft) Or $_iMarginLeft = -1 Then $_iMarginLeft = $__iMNU_DEF_MARGIN
If IsKeyword($_iWidth) Or $_iWidth = -1 Then $_iWidth = $__iMNU_DEF_WIDTH
Local $hMenu = GUICreate('', $_iWidth, $__iMNU_DEF_HEIGHT, -1, -1, BitOR($WS_BORDER,$WS_POPUP), $WS_EX_MDICHILD, $__hGUI_MNUEX)
If $__aHWND_MNU[UBound($__aHWND_MNU)-1][0] <> '' Then ReDim $__aHWND_MNU[UBound($__aHWND_MNU)+1][8]
$__aHWND_MNU[UBound($__aHWND_MNU)-1][0] = $_hParentCtrl
$__aHWND_MNU[UBound($__aHWND_MNU)-1][1] = $hMenu
$__aHWND_MNU[UBound($__aHWND_MNU)-1][2] = True
Local $aItem[2][3] = [[0],[False]]
$__aHWND_MNU[UBound($__aHWND_MNU)-1][3] = $aItem
$__aHWND_MNU[UBound($__aHWND_MNU)-1][4] = 0
$__aHWND_MNU[UBound($__aHWND_MNU)-1][5] = $_iMarginLeft
$__aHWND_MNU[UBound($__aHWND_MNU)-1][6] = $__iMNU_DEF_WIDTH
If $_iWidth <> $__iMNU_DEF_WIDTH Then $__aHWND_MNU[UBound($__aHWND_MNU)-1][6] = $_iWidth
$__aHWND_MNU[UBound($__aHWND_MNU)-1][7] = $__iMNU_DEF_HOVERCOLOR
If $_iHoverColor <> -1 Then $__aHWND_MNU[UBound($__aHWND_MNU)-1][7] = $_iHoverColor
Return $hMenu
EndFunc ;==>_GUICtrlOwnContext_Create;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: _GUICtrlOwnContext_AddItem
; Description......: Create Menu-Item (Default-Item, Checkbox-Item, Radio-Item, Shape)
; Parameter(s).....: $_hMnu Menu Handle
; .................: $_sText Item-Text, if empty string (Default) ==> create shape
; .................: $_iType 1=Label (Default), 2=Checkbox, 3=Radio
; .................: $_iMarginLeft Left margin, only if different from value, that used with _GUICtrlOwnContext_Create
; Requirement(s)...: with _GUICtrlOwnContext_Create menu created
; Return Value(s)..: Success Item-ID
; .................: Failure -1, @error=1 on specified handle does not exist
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _GUICtrlOwnContext_AddItem($_hMnu, $_sText='', $_iType=1, $_iMarginLeft=-1)
Local $iIndexArray = __GetIndexFromMnuArray($_hMnu)
If @error Then Return SetError(1,0,-1)
Local $aItem = $__aHWND_MNU[$iIndexArray][3]
Local $iCountShape = $__aHWND_MNU[$iIndexArray][4]
Local $iCountEntry = $aItem[0][0] -$iCountShape
If IsKeyword($_iMarginLeft) Or $_iMarginLeft = -1 Then $_iMarginLeft = $__aHWND_MNU[$iIndexArray][5]
Local $iWidth = $__aHWND_MNU[$iIndexArray][6]
Local $iHeight = $__iMNU_DEF_HEIGHT
If $_sText = '' Then $_iType = 4
If $_iType = 4 Then $iHeight = $__iMNU_DEF_SHAPEHEIGHTLocal $iID, $iTop_BackLabel = ($iCountEntry*$__iMNU_DEF_HEIGHT + $iCountShape*$__iMNU_DEF_SHAPEHEIGHT)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateLabel('', 0, $iTop_BackLabel, $iWidth, $iHeight)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetState(-1, $GUI_DISABLE)
If $_iType = 4 Then $iCountShape += 1ReDim $aItem[UBound($aItem)+1][3]
[/autoit] [autoit][/autoit] [autoit]
$aItem[0][0] += 1
WinMove($_hMnu, '', 10, 10, $iWidth, ($aItem[0][0]-$iCountShape)*$__iMNU_DEF_HEIGHT + $iCountShape*$__iMNU_DEF_SHAPEHEIGHT)
Local $iItemTop = ($__iMNU_DEF_LABELSHIFT+ $iCountEntry*$__iMNU_DEF_HEIGHT + $iCountShape*$__iMNU_DEF_SHAPEHEIGHT)
Switch $_iType
Case 1 ; Standard Label
$iID = GUICtrlCreateLabel($_sText, $_iMarginLeft, $iItemTop, $iWidth-$_iMarginLeft-2, 17)
Case 2 ; Checkbox
$iID = GUICtrlCreateCheckbox($_sText, $_iMarginLeft, $iItemTop-1, $iWidth-$_iMarginLeft-2, 17)
Case 3 ; Radio
$iID = GUICtrlCreateRadio($_sText, $_iMarginLeft, $iItemTop-1, $iWidth-$_iMarginLeft-2, 17)
$aItem[1][0] = True
Case 4 ; Shape
$iID = GUICtrlCreateLabel('', 4, ($iCountEntry*$__iMNU_DEF_HEIGHT + ($iCountShape-1)*$__iMNU_DEF_SHAPEHEIGHT), $iWidth-8, 1, $SS_GRAYFRAME)
EndSwitch
GUICtrlSetResizing($iID, $GUI_DOCKALL)$aItem[$aItem[0][0]+1][0] = $iID
[/autoit] [autoit][/autoit] [autoit]
$aItem[$aItem[0][0]+1][1] = $_iType
$__aHWND_MNU[$iIndexArray][3] = $aItem
$__aHWND_MNU[$iIndexArray][4] = $iCountShape
Return $iID
EndFunc ;==>_GUICtrlOwnContext_AddItem;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: _GUICtrlOwnContext_AddImage
; Description......: Create Menu-Item with Image (icon, jpg/gif/bmp, colored squares)
; Parameter(s).....: $_hMnu Menu Handle
; .................: $_sText Item-Text
; .................: $_sPathImage Path image file
; .................: $_sIconName Name or number of icon inside icon file with multiple icons, -1 (Default)
; .................: $_iType 1=Picture(bmp,jpg,gif), 2=Icon, 3=colored squares
; .................: $_iMarginLeft Left margin, only if different from value, that used with _GUICtrlOwnContext_Create
; .................: $_iColor Color for squares
; Requirement(s)...: with _GUICtrlOwnContext_Create menu created
; Return Value(s)..: Success Item-ID
; .................: Failure -1, @error=1 on specified handle does not exist
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _GUICtrlOwnContext_AddImage($_hMnu, $_sText, $_sPathImage='', $_sIconName=-1, $_iType=1, $_iMarginLeft=-1, $_iColor=0xFFFFFF)
Local $iIndexArray = __GetIndexFromMnuArray($_hMnu)
If @error Then Return SetError(1,0,-1)
Local $aItem = $__aHWND_MNU[$iIndexArray][3]
Local $iCountShape = $__aHWND_MNU[$iIndexArray][4]
Local $iCountEntry = $aItem[0][0] -$iCountShape
If IsKeyword($_iMarginLeft) Or $_iMarginLeft = -1 Then $_iMarginLeft = $__aHWND_MNU[$iIndexArray][5]
Local $iWidth = $__aHWND_MNU[$iIndexArray][6]Local $iID, $iTop_BackLabel = ($iCountEntry*$__iMNU_DEF_HEIGHT + $iCountShape*$__iMNU_DEF_SHAPEHEIGHT)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateLabel('', 0, $iTop_BackLabel, $iWidth, $__iMNU_DEF_HEIGHT)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetState(-1, $GUI_DISABLE)ReDim $aItem[UBound($aItem)+1][3]
[/autoit] [autoit][/autoit] [autoit]
$aItem[0][0] += 1
WinMove($_hMnu, '', 10, 10, $iWidth, ($aItem[0][0]-$iCountShape)*$__iMNU_DEF_HEIGHT + $iCountShape*$__iMNU_DEF_SHAPEHEIGHT)
Local $iItemTop = ($__iMNU_DEF_LABELSHIFT+ $iCountEntry*$__iMNU_DEF_HEIGHT + $iCountShape*$__iMNU_DEF_SHAPEHEIGHT), $iIDPic
If $_iMarginLeft < 2 Then $_iMarginLeft = 2
Switch $_iType
Case 1
Local $iStyle = $SS_NOTIFY
If StringRight($_sPathImage, 3) = 'bmp' Then $iStyle = BitOR($iStyle,$SS_BITMAP)
$iIDPic = GUICtrlCreatePic($_sPathImage, $_iMarginLeft -2, $iItemTop-1, 16, 16, $iStyle)
$iID = GUICtrlCreateLabel($_sText, $_iMarginLeft +16 , $iItemTop, $iWidth-$_iMarginLeft-18, 17)
Case 2
$iIDPic = GUICtrlCreateIcon($_sPathImage, $_sIconName, $_iMarginLeft -2, $iItemTop-1, 16, 16, BitOR($SS_NOTIFY,$SS_ICON))
$iID = GUICtrlCreateLabel($_sText, $_iMarginLeft +16 , $iItemTop, $iWidth-$_iMarginLeft-18, 17)
Case 3
$iIDPic = GUICtrlCreateLabel('', $_iMarginLeft -2, $iItemTop-1, 16, 16)
GUICtrlSetBkColor(-1, $_iColor)
$iID = GUICtrlCreateLabel($_sText, $_iMarginLeft +16 , $iItemTop, $iWidth-$_iMarginLeft-18, 17)
EndSwitch
GUICtrlSetResizing($iIDPic, $GUI_DOCKALL)
GUICtrlSetResizing($iID, $GUI_DOCKALL)$aItem[$aItem[0][0]+1][0] = $iID
[/autoit] [autoit][/autoit] [autoit]
$aItem[$aItem[0][0]+1][1] = 1
$__aHWND_MNU[$iIndexArray][3] = $aItem
Return $iID
EndFunc ;==>_GUICtrlOwnContext_AddImage;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: _GUICtrlOwnContext_ShowFlag
; Description......: Condition to show Menu (True/False)
; .................: If the condition is TRUE, the menu will displayed.
; Parameter(s).....: $_hMnu Menu Handle
; .................: $_fFlag Boolean expression (eg a test function to return True / False)
; Requirement(s)...: with _GUICtrlOwnContext_Create menu created
; Return Value(s)..: Nothing
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _GUICtrlOwnContext_ShowFlag($_hMnu, $_fFlag=False)
For $i = 0 To UBound($__aHWND_MNU) -1
If $__aHWND_MNU[$i][1] = $_hMnu Then
$__aHWND_MNU[$i][2] = $_fFlag
Return
EndIf
Next
EndFunc ;==>_GUICtrlOwnContext_ShowFlag;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: _GUICtrlOwnContext_SetHoverColor
; Description......: Sets custom hover color
; Parameter(s).....: $_hMnu Menu Handle
; .................: $_iColor custom RGB color
; Requirement(s)...: with _GUICtrlOwnContext_Create menu created
; Return Value(s)..:
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _GUICtrlOwnContext_SetHoverColor($_hMnu, $_iColor=$__iMNU_DEF_HOVERCOLOR)
Local $iIndexArray = __GetIndexFromMnuArray($_hMnu)
If @error Then Return SetError(1,0,$iIndexArray)
$__aHWND_MNU[$iIndexArray][7] = $_iColor
Return '0x' & Hex($_iColor,6)
EndFunc ;==>_GUICtrlOwnContext_SetHoverColor#region - internal functions
[/autoit] [autoit][/autoit] [autoit]
;===============================================================================
; Function Name....: __IsHover
; Description......: Checks if the mouse is over an entry. Change background color, if so.
;===============================================================================
Func __IsHover()
Local Static $iID_LastOver = 0
If $__hCURRENT_ACTIVE_MNU = 0 Then Return
Local $aCursor = GUIGetCursorInfo()
If Not IsArray($aCursor) Then Return
Local $iID = $aCursor[4]
Local $iIndexArray = __GetIndexFromMnuArray($__hCURRENT_ACTIVE_MNU)
Local $aItem = $__aHWND_MNU[$iIndexArray][3]
Local $iWidth = $__aHWND_MNU[$iIndexArray][6]
Local $aMPos[2] = [$aCursor[0],$aCursor[1]]
Local $iHoverColor = $__aHWND_MNU[$iIndexArray][7]
For $i = 2 To $aItem[0][0] +1
If __MouseOverCtrl($__hCURRENT_ACTIVE_MNU, $aItem[$i][0], $aMPos) And _
$iID_LastOver <> $aItem[$i][0] And _
ControlGetText($__hCURRENT_ACTIVE_MNU, '', $aItem[$i][0]) <> '' And _
BitAND(GUICtrlGetState($aItem[$i][0]), $GUI_ENABLE) Then
If $iID_LastOver <> 0 Then GUICtrlSetBkColor($iID_LastOver, $GUI_BKCOLOR_TRANSPARENT)
$iID_LastOver = $aItem[$i][0]
GUICtrlSetBkColor($aItem[$i][0], $iHoverColor)
ExitLoop
EndIf
Next
EndFunc ;==>__IsHover;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: __GetIndexFromMnuArray
; Description......: Search index from menu array for given menu handle
;===============================================================================
Func __GetIndexFromMnuArray($_hMnu)
For $i = 0 To UBound($__aHWND_MNU) -1
If $__aHWND_MNU[$i][1] = $_hMnu Then
Return $i
EndIf
Next
Return SetError(1,0,-1)
EndFunc ;==>__GetIndexFromMnuArray;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: __WinProc
; Description......: Callback windows procedure
;===============================================================================
Func __WinProc($hWnd, $Msg, $wParam, $lParam)
Switch $Msg
Case $WM_NOTIFY
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $iOldOpt, $aMPos$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
[/autoit] [autoit][/autoit] [autoit]
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iCode = DllStructGetData($tNMHDR, "Code")$iOldOpt = Opt('MouseCoordMode', 1)
[/autoit] [autoit][/autoit] [autoit]
$aMPos = MouseGetPos()
Opt('MouseCoordMode', $iOldOpt); == Menu is shown, clicked outside menu, but inside assigned control ==> Menu hide
[/autoit] [autoit][/autoit] [autoit]
If $__hCURRENT_ACTIVE_MNU <> 0 And $iCode = $NM_CLICK Then
Local $tPoint = DllStructCreate('int;int')
DllStructSetData($tPoint, 1, $aMPos[0])
DllStructSetData($tPoint, 2, $aMPos[1])
Local $tRectContext = _WinAPI_GetWindowRect($__hCURRENT_ACTIVE_MNU)
If Not _WinAPI_PtInRect($tRectContext, $tPoint) Then
GUISetState(@SW_HIDE, $__hCURRENT_ACTIVE_MNU)
AdlibUnRegister('__IsHover')
$__hCURRENT_ACTIVE_MNU = 0
Return _WinAPI_CallWindowProc($__hHOOK_PROC, $hWnd, $Msg, $wParam, $lParam)
EndIf
EndIf; == Menu show
[/autoit] [autoit][/autoit] [autoit]
Switch $iCode
Case $NM_RCLICK
For $i = 0 To UBound($__aHWND_MNU) -1
If $hWndFrom = $__aHWND_MNU[$i][0] Then
If $__aHWND_MNU[$i][2] Then ; == Condition True?
$__hCURRENT_ACTIVE_MNU = $__aHWND_MNU[$i][1]
Local $aWin = WinGetPos($__hGUI_MNUEX)
Local $aWinMnu = WinGetPos($__hCURRENT_ACTIVE_MNU)
Local $iX = $aMPos[0], $iY = $aMPos[1]
If $iX +$aWinMnu[2] > @DesktopWidth Then $iX -= $aWinMnu[2]
If $iY +$aWinMnu[3] > @DesktopHeight Then $iY -= $aWinMnu[3]
WinMove($__hCURRENT_ACTIVE_MNU, '', $iX, $iY)
AdlibRegister('__IsHover', 10)
GUISetState(@SW_SHOW, $__hCURRENT_ACTIVE_MNU)
EndIf
ExitLoop
EndIf
Next
EndSwitch
Case Else
Return _WinAPI_CallWindowProc($__hHOOK_PROC, $hWnd, $Msg, $wParam, $lParam)
EndSwitch
EndFunc ;==>__WinProc;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: __MouseProc
; Description......: Callback mouse procedure
;===============================================================================
Func __MouseProc($nCode, $wParam, $lParam)
If $nCode < 0 Or $__hCURRENT_ACTIVE_MNU = 0 Then
Return _WinAPI_CallNextHookEx($__hHOOK, $nCode, $wParam, $lParam)
EndIf
Local $iCtrl = 0, $iType, $aItem
Local $iOldOpt = Opt('MouseCoordMode', 2)
Local $aMPos = MouseGetPos()
Opt('MouseCoordMode', $iOldOpt)
For $i = 0 To UBound($__aHWND_MNU) -1
If $__aHWND_MNU[$i][1] = $__hCURRENT_ACTIVE_MNU Then
$aItem = $__aHWND_MNU[$i][3]
For $j = 2 To $aItem[0][0] +1
If __MouseOverCtrl($__hCURRENT_ACTIVE_MNU, $aItem[$j][0], $aMPos) Then
$iCtrl = $aItem[$j][0]
$iType = $aItem[$j][1]
ExitLoop(2)
EndIf
Next
EndIf
NextIf $nCode = $__HC_ACTION Then
[/autoit] [autoit][/autoit] [autoit]
Switch $wParam
Case $WM_RBUTTONDOWN
If $iCtrl <> 0 Then
Return _WinAPI_CallNextHookEx($__hHOOK, $nCode, $wParam, $lParam)
Else
__MenuHide()
Return _WinAPI_CallNextHookEx($__hHOOK, $nCode, $wParam, $lParam)
EndIf
Case $WM_LBUTTONDOWN
If $iCtrl <> 0 Then
; ctrl is disabled ==> do nothing
If BitAND(GUICtrlGetState($iCtrl), $GUI_DISABLE) Then Return _WinAPI_CallNextHookEx($__hHOOK, $nCode, $wParam, $lParam)
; set state for checkbox/radios
If $iType = 2 Then
GUICtrlSetState($iCtrl, BitXOR(BitOR($GUI_CHECKED, $GUI_UNCHECKED), BitAND(GUICtrlRead($iCtrl),$GUI_CHECKED)))
ElseIf $iType = 3 Then
GUICtrlSetState($iCtrl, BitXOR(BitOR($GUI_CHECKED, $GUI_UNCHECKED), BitAND(GUICtrlRead($iCtrl),$GUI_CHECKED)))
For $j = 2 To $aItem[0][0] +1
If $aItem[$j][1] <> 3 Or $aItem[$j][0] = $iCtrl Then ContinueLoop
GUICtrlSetState($aItem[$j][0], $GUI_UNCHECKED)
Next
EndIf
Else
__MenuHide()
Return _WinAPI_CallNextHookEx($__hHOOK, $nCode, $wParam, $lParam)
EndIf
_WinAPI_PostMessage($__hGUI_MNUEX, $WM_COMMAND, $iCtrl, 0)
__MenuHide()
Return -1
EndSwitch
EndIf
Return _WinAPI_CallNextHookEx($__hHOOK, $nCode, $wParam, $lParam)
EndFunc ;==>__MouseProc;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: __MenuHide
; Description......: Hides menu and stops hover check
;===============================================================================
Func __MenuHide()
AdlibUnRegister('__IsHover')
GUISetState(@SW_HIDE, $__hCURRENT_ACTIVE_MNU)
GUISetState(@SW_SHOW, $__hGUI_MNUEX)
$__hCURRENT_ACTIVE_MNU = 0
EndFunc ;==>__MenuHide;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: __MouseOverCtrl
; Description......: Checks if mouse is over an given control
;===============================================================================
Func __MouseOverCtrl($_hGUI, $_iID, $_aMPos)
Local $posC = ControlGetPos($_hGUI, '', $_iID)
If @error Then Return False
If ($_aMPos[0] >= $posC[0] And $_aMPos[0] <= $posC[0]+$posC[2]) And _
($_aMPos[1] >= $posC[1] And $_aMPos[1] <= $posC[1]+$posC[3]) Then
Return True
Else
Return False
EndIf
EndFunc ;==>__MouseOverCtrl#endregion
[/autoit]
DL bisher: 15 -
Ich fürchte, Deine Mühe dürfte umsonst gewesen zu sein und eine Lösung scheint nicht möglich.
(Fast) Nichts ist unmöglich.
Hier inkl. "Anschieben" weiteren Codes:Spoiler anzeigen
[autoit]#Include <WinAPI.au3>
[/autoit] [autoit][/autoit] [autoit]
#Include <Array.au3>
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>Global $fID_Changed = False, $iID_Current, $iIndex_Current
[/autoit] [autoit][/autoit] [autoit]$hGUI = GUICreate('TEST')
[/autoit] [autoit][/autoit] [autoit]
$input1 = GUICtrlCreateInput('1', 40, 30, 60, 20)
$input2 = GUICtrlCreateInput('', 40, 60, 60, 20)
$input3 = GUICtrlCreateInput('', 40, 90, 60, 20)
$input4 = GUICtrlCreateInput('', 40, 120, 60, 20)
$btArray = GUICtrlCreateButton('Zeige Werte-Array', 20, 200, 150, 25)Global $aInput[4][2] = [[$input1],[$input2],[$input3],[$input4]] ; == alle Input in einem Array verwalten, Werte werden in das Array gelesen
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW, $hGUI)
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND') ; == registriert Windows-Message "WM_COMMAND" und weist dieser Msg die gleichnamige Funktion zu
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
If $fID_Changed Then
$fID_Changed = False
_Event()
EndIf
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $btArray
_ArrayDisplay($aInput)
EndSwitch
WEndFunc _Event()
[/autoit] [autoit][/autoit] [autoit]
Switch $iID_Current
Case $input1
MsgBox(0, '', 'Hier dein Code für Input-1' & @CRLF & 'Wert: ' & $aInput[$iIndex_Current][1])
Case $input2
MsgBox(0, '', 'Hier dein Code für Input-2' & @CRLF & 'Wert: ' & $aInput[$iIndex_Current][1])
Case $input3
MsgBox(0, '', 'Hier dein Code für Input-3' & @CRLF & 'Wert: ' & $aInput[$iIndex_Current][1])
Case $input4
MsgBox(0, '', 'Hier dein Code für Input-4' & @CRLF & 'Wert: ' & $aInput[$iIndex_Current][1])
EndSwitch
EndFuncFunc WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit]
#forceref $hWnd, $iMsg
Local $hWndFrom, $iIDFrom, $iCode, $iNext, $fFound = False
$hWndFrom = $ilParam
$iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
Select
Case $iCode = 0x0
Local $ID = _WinAPI_GetDlgCtrlID(ControlGetHandle($hGUI, '', ControlGetFocus($hGUI)))
For $i = 0 To UBound($aInput) -1
If $aInput[$i][0] = $ID Then
$fFound = True
ExitLoop
EndIf
Next
If Not $fFound Then Return $GUI_RUNDEFMSG ; == Control-ID gehört nicht zu den überwachten Input
$iNext = $i +1
If $iNext = UBound($aInput) Then $iNext = 0 ; == Array-Index für nächstes Control, bei Ende wieder zum ersten
$aInput[$i][1] = GUICtrlRead($aInput[$i][0]) ; == Wert auslesen und in das Array schreiben
ControlFocus($hGUI, '', $aInput[$iNext][0]) ; == Fokus auf nächstes Input setzen
$iID_Current = $ID ; == aktuelle ID in Globale Variable schreiben (für Weiterverarbeitung)
$iIndex_Current = $i ; == Array-Index der ID in Globale Variable schreiben (für Weiterverarbeitung)
$fID_Changed = True ; == Triggerwert zum Start der Weiterverarbeitung
EndSelect
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND -
Ich hatte dir in dem angesprochenen Thread eine Lösungsvariante gepostet. (deine letzte Frage dort hatte ich aber nicht mitbekommen ;))
Aber diese stellt sich auch gar nicht, da den Inputs ja konkret Felder zugeordnet sind. In der WM_COMMAND wird erkannt welches Control den Fokus hat (verwaltet in einem Array), während ENTER betätigt wird. Dein Problem ist also bereits gelöst.EDIT:
Ich habe dir die Lösung inklusive "Anschieben" weiteren Codes im Original-Thread gepostet.
Bitte beachten: In Funktionen, die mit GuiRegisterMsg registriert werden, sollten keine Funktionen gestartet werden, die einen undefinierten Zeitablauf haben. (z.B. MsgBox enthalten oder Warten auf Usereingabe etc.)!
Deshalb schalte ich in diesen Fällen boolsche Variablen als Trigger, über deren Status dann in der Hauptprogrammschleife die weiteren Funktionen aktiviert werden können. -
-
$var: Er will die Datei-Inhalte nach dem Wort durchsuchen, nicht die Datei-Namen.
Ich glaube, im EN-Forum habe ich etwas derartiges für PDF schonmal gesehen. Mußt du mal dort suchen. -
Unnütz ist etwas nur wenn man es nicht benötigt(du solltest aber an andere auch denken), wäre nicht grad toll wenn die alle befehle aus AutoIt löschen die du als unnüzu empfindest(also welche die du sonst nie benutzt)
Jetzt stell ich mir die Frage ob du bei allen Projekten anderer Personen die dich sowieso nicht interessieren immer hinschreibst das du das "als absolut unnütz empfinde"´st ??? 
1. Obwohl ich es persönlich nicht brauche habe ich den Hinweis (Hook) gegeben. - Das war meine Intention hier zu posten.
2. Du solltest Lesen lernen. Ich habe begründet, warum ich keinerlei Aktivitäten in dieser Richtung unternehme, mit dem Zusatz, dass das aber für jeden anders sein kann (Geschmackssache). Un du wirst mir schon zugestehen müssen, dass ich eine persönliche Meinung zu etwas habe und auch noch die Frechheit besitze diese zu Äüßern.
-
Mein Ziel währe es jetzt die drei Funktionen/UDF´s zu "verschmelzen" - also von jeder den Vorteil aber keiner den Nachteil.
Ist so schwer nicht: Mouse-Hook und Keyboard-Hook in einem gemeinsamen Skript lösen das. Die entsprechenden Hook-Skripte findest du hier im Forum, habe ich garantiert schon gepostet, musst dann nur noch anpassen.
Ich selbst habe keinen Bock dazu, weil ich eine Hotkey-UDF als absolut unnütz empfinde (aber das ist Geschmackssache).
-
Aber die DDEMLServer.au3 brauche ich nicht, oder?
Nein, ich habe den nur der Vollständigkeit halber dazugefügt.
Mit dem IE funktioniert es nun auch.
Du kannst den DDE-Aufruf auch für die IE-Abfrage (und jeden sonstigen Browser) verwenden. Mußt nur in der Funktion statt "Firefox" den entsprechenden Programmnamen mit übergeben (wenn ich die Funktion jetzt richtig interpretiert habe, leider nicht beschrieben).
-
Hier die Lösung.
Mittels DDE kann man das Auslesen vornehmen. Für DDE in AutoIt habe ich hier eine Lösung gefunden.
Ich hänge die notwendigen Dateien aber gleich mal an (habe dort auch die ganzen parallelen Konsolenausgaben auskommentiert).Und hier das Skript:
[autoit]#include <DDEML.au3>
[/autoit][autoit][/autoit][autoit]
#include <DDEMLClient.au3>
ConsoleWrite(_Get_FF_url() & @CRLF)Func _Get_FF_url()
[/autoit]
Local $sRet = _DDEMLClient_RequestString("Firefox", "WWW_GetWindowInfo", "0xFFFFFFFF", $CF_TEXT)
Local $aSplit = StringSplit($sRet, ',')
Local $aUrl = StringRegExp($aSplit[1], '(?<=")([^"]+)', 1)
Return $aUrl[0]
EndFunc -
Ich zeig dir trotzdem mal, wie du das nutzt - ist ganz simpel:
Spoiler anzeigen
[autoit]#include <GuiListBox.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <WinAPI.au3>
#include <StructureConstants.au3>$hGui = GUICreate('Test')
[/autoit] [autoit][/autoit] [autoit]
$cListBox = GUICtrlCreateList('', 10, 10, 300, 150)
$hListBox = GUICtrlGetHandle($cListbox)
$cEdit = GUICtrlCreateEdit('', 10, 180, 300, 150)
GUICtrlSetData($cListBox, 'Zeile1|Zeile2|Zeile3|Zeile4'); == Da WM_NOTIFY ausser dem Event nur die Mausposition als Info bereitstellt, muss bei mehreren Controls geprüft werden,
[/autoit] [autoit][/autoit] [autoit]
; == ob die Maus gerade über dem Control ist. Dazu werden die (relativen) Controlpositionen in einem RECT gespeichert.
$tList = DllStructCreate($tagRECT)
$tEdit = DllStructCreate($tagRECT)
_WinAPI_SetRect($tList, 10, 10, 310, 160)
_WinAPI_SetRect($tEdit, 10, 180, 310, 330)
Global $aID[2][2] = [[$cListBox,$tList],[$cEdit,$tEdit]]GUISetState()
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_PARENTNOTIFY, 'WM_PARENTNOTIFY')Do
[/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg() = -3Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
#forceref $hWnd, $iMsg
Switch $ilParam
Case $hListBox
Switch BitShift($iwParam, 16)
Case $LBN_DBLCLK
ConsoleWrite('Double-Click' & @CRLF)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMANDFunc WM_PARENTNOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
#forceref $hWnd, $iMsg
Switch $hWnd
Case $hGui
Local $iX = BitAND($ilParam, 0xFFFF)
Local $iY = BitShift($ilParam, 16)
Local $sControl = _ClickedControl($iX, $iY)
Switch BitAND($iwParam, 0xFFFF)
Case $WM_LBUTTONDOWN
ConsoleWrite('Left-Down, X,Y: ' & $iX & ',' & $iY & @TAB & @TAB & 'on ' & $sControl & '-Control' & @CRLF)
Case $WM_RBUTTONDOWN
ConsoleWrite('Right-Down, X,Y: ' & $iX & ',' & $iY & @TAB & @TAB & 'on ' & $sControl & '-Control' & @CRLF)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_PARENTNOTIFYFunc _ClickedControl($_iX, $iY)
[/autoit] [autoit][/autoit] [autoit]
Local $cCtrl
For $i = 0 To UBound($aID) -1
If _WinAPI_CoordInRect($aID[$i][1], $_iX, $iY) Then
$cCtrl = $aID[$i][0]
ExitLoop
EndIf
Next
Switch $cCtrl
Case $cListBox
Return 'ListBox'
Case $cEdit
Return 'Edit'
EndSwitch
EndFunc;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _WinAPI_SetRect(ByRef $tRECT, $X1, $Y1, $X2, $Y2)
; Description: Befüllt eine RECT-Struktur in einem Aufruf mit Werten
; Parameter(s): $tRECT RECT-Struktur
; $X1, $Y1, $X2, $Y2 Werte des Rectangle (left, top, right, bottom)
; Return Value(s): Erfolg <> 0
; Fehler 0 set @error 1-keine Struktur übergeben
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _WinAPI_SetRect(ByRef $tRECT, $X1, $Y1, $X2, $Y2)
If Not IsDllStruct($tRECT) Then Return SetError(1,0,0)
Local $ret = DllCall("user32", 'long', 'SetRect', 'ptr', DllStructGetPtr($tRECT), 'long', $X1, 'long', $Y1, 'long', $X2, 'long', $Y2)
If @error > 0 Then Return SetError(1,@error,0)
Return $ret[0]
EndFunc ;==>_WinAPI_SetRect;===============================================================================
[/autoit]
; Function Name: _WinAPI_CoordInRect(ByRef $tRECT, $X, $Y)
; Description: Ermittelt ob eine übergebene Koordinate innerhalb einer RECT-Struktur ist
; Analog zu _WinAPI_PtInRect, aber statt $tagPOINT werden Einzelkoordinaten übergeben
; Parameter(s): $tRECT RECT-Struktur
; $X X-Koordinate
; $Y Y-Koordinate
; Return Value(s): Erfolg True/False Punkt in/nicht in RECT
; Fehler 0 set @error 1-keine Struktur übergeben
; 2-Dll-Fehler (s. @extended)
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _WinAPI_CoordInRect(ByRef $tRECT, $X, $Y)
If Not IsDllStruct($tRECT) Then Return SetError(1,0,0)
Local $ret = DllCall("user32", "long", "PtInRect", "ptr", DllStructGetPtr($tRECT), "long", $X, "long", $Y)
If @error > 0 Then Return SetError(2,@error,0)
If $ret[0] Then Return True
Return False
EndFunc ;==>_WinAPI_CoordInRect
Edit: Ich habe das Bsp. mal erweitert, um zu zeigen, wie du bei mehreren Controls vorgehst.