hi. danke für den Tipp. Habe es ausprobiert, entspricht leider nicht dem was ich brauche.
ich werde hier mein python-problem lösen müssen.
Beiträge von UPIA
-
-
okay, hab jetzt die richtigen libs. und läuft.
ich habe inzwischen die richtigen formeln für das umrechnen in python gefunden (wie du auch schon gesagt hattest).
nur ist die lib dafür irgendwie in pyproj versteckt. und ich schaffe es nicht das pyproj modul zu installieren mit den 9-Jahre alten Anleitungen im NetzEdit: So also an dieser Stelle 1000Dank für das astreine Script. Habe alle Daten damit konvertiert! Muss die Tage mal schauen wie ich die ins Bild bekomme und wie das ausschaut.
Das "Projekt" muss ich zeittechnisch jetzt erstmal parken. -
Wow. okay also mit GPS meinte ich Geographische Koordinaten (Lon, Lat) dezimal (WGS84). Mit UTM zone 32N (das ist das Zielformat / Backgroundkartenformat).
woher hast du das script? mir fehlen 2 au3: JSON.au3, BinaryCall.au3 musste ich erst suchen - und funktionieren nicht richtig (_JSON_Parse($sResponse) Unknown Function Name)...
woher zieht man sich diese au3's offiziell, wenn man sie nicht aus irgendeinem Forum-post nimmt?
Bis dato teste ich nochmal mein Pythonscript gegen den Online-Umrechner
-
*das bezog sich nur auf die wahl der lage des referenzpunktes, damit ich zunächst mal nicht mit negativen koordinaten zu tun habe.
die berechnung ist auf alle fälle der richtige weg. aber für eine seite grafik war der aufwand jetzt schon enorm. egal, ich lass das mal sacken.
immer noch offen für Alternativen!EDIT:
während einer tasse tee ließ ich mal den rudimentären bot nach roten punkten suchen und das sieht schon mal sehr viel besser aus. ich muss das nur noch skalieren.
für das projekt reicht mir der schlenker. ich benötige aber immer noch für die Zukunft eine Lösung mit GPS auf 2D (wenn mgl UTM). -
Ich habe den Fundstellen in einem Buch ein Zeitalter und eine PLZ-Ort zugeordnet. Das war der Anfang um es darzustellen. Es gibt einen Bezahlservice, wo ich das mit Mapcode erledigen kann (teuer und entspricht nicht dem was ich möchte). Dann hab ich mir über die PLZ-Ort die GPS gezogen.
Du hast die Komplexität gut erklärt. Ich hatte die Geographische Ansicht aus der ich die Koordinaten hatte als Hintergrund (Bild 2). Das Latitüdenproblem in der Umrechnung hatte ich erwartet (Y-Achse verzerrt), aber irgendwie passt auch die X-Achse nicht.
Ich habe über einen Referenzpunkt gerechnet - mal unten links (0,0)*, dann zentral um die Latitüdenverzerrung zu verringern. Würde ich mehrere Referenzpunkte (z.b. ein Raster) wählen und immer zum nächsten prüfen, wäre ich wohl genauer. aber da will ich auch nicht in die Kartographie einsteigen.
*bei GPS ist ja der Breitengrad oben größer im gegensatz zum imageHahaha. je mehr ich grüble, desto mehr lacht mich der Ansatz mit dem roten Punkt aus der UTM-Karte wieder in die UTM-Karte an.
Aber ja, das ist mein Dilemma. Bekomme ich das in python überhaubt ausreichend genau hin. Vor 50 Jahren hätte ich eine Karte gemalt und Schnipsel ausgeschnitten und mit der Polaroid dokumentiert. Heut zu tage stell ich mich irgendwie blöd an

-
hi leute.
ich hab 215 Orte, die ich in eine Reliefkarte eintragen möchte. Ich habe mir die GPS-Koordinaten dazu geladen um diese dann auf die Karte zu projizieren (vllt. schon falsch abgebogen). Ach ja witzige Anekdote, hatte zwischendurch mal ChatGPT gefragt, ob er anhand von PLZ und Ortsnamen diese Punkte auf einer Landkarte eintragen könnte:
zurück zum Thema: ich habe mir dann mit python ein svg erstellt, dass ich dann über die Karte legen wollte. Ergebnis war ernüchternd. Es sind wohl zu viele Ungenauigkeiten bei meiner Umrechnung. Versuch hier:

Jetzt habe ich einen weiteren zweifelhaften, aber möglichen Ansatz gefunden, indem ich die Punkte plotte und mir dann die 2D-x,y-pixel mit PixelSearch() suche. und das ganze in einem Macro laufen lasse: (der kleine rote Kreis)

Daher vorab Frage an Euch:
Übershe ich eine viel einfachere Lösung/Tool/App?
Lohnt es sich die GPS-2D-Umrechnung zu verfeineren LatExactCalc? (hat da jmd Erfahrung)?Anmerkung: ich hab natürlich versucht auch die Punkte manuell auf eine Karte zu schieben, aber ich bekomme keine große Karte wo ich die Ortschaften sehe und diese später ausblenden kann - sonst wäre ich schon fertig
monetäre Lösungen wie mapcode usw kommen für mich nicht in Frage.Ich weiß, ist sehr weit vom Schuss (auch im Offtopic) aber wo wenn nicht hier finde ich jemand der überhaupt weiß von was ich spreche

-
Verstehe ich nicht ganz. Gehe ich auf das Fenster vom DCS kann ich die F3 ausführen. Lege ich die F3 auf eine Mouse-Taste dann führt die die Mouse-Taste als F3 aus. Hoffe, du meinste das.
Es ging mir nur drum zu testen ob es an autoit liegt, dass die tasten nicht erkannt werden. Oder ob das Programm generell etwas gegen generierte tastendrücke hat. Daher wäre es wichtig zu wissen, ob du mit einer 3rd-Party Software funktioniert (also nicht autoit am laufen ist).
Alles weiterführende um das Programm "auszutricksen" ist zeit- und nervenaufwändig (und hier auch fehl am Platz - da gibt es andere Foren). Da würde ich mir lieber eine Makro-Tastatur kaufen.
Aber berichte gerne, wenn du neue erkenntnisse hast!
EDIT: oops, hab da zwei beiträge übersehen/übersprungen ..
-
.. ja du müsstest das Windows-Handle herausfinden und dann versuchen der Anwendung direkt die Tasten zu schicken, was aber nicht immer einfach ist und vor allem nicht immer funktionieren muss.
Hast du auch Punkt 1. versucht? Das ist wirklich wichtig, damit wir ausschließen können dass der DCS Autoit verwehrt!
(ich hab schon öfter erlebt, dass Anwendungen Autoit-Keys blockieren/verzögern, konnte diese dann aber über 3rd Party Software senden (diese wurden akzeptiert) .. soll kein Lösungsansatz sein - nur dir evtl viel mühe ersparen!) -
da hast du dir ja ein hartes nüsschen für den anfang rausgesucht
das fällt mir noch ein:
1. Als Erstes müsstest du mal versuchen ob du nicht die F3-Taste mit einer anderen Software binden kannst (z.B. deiner Maus-Software) und ob das im Spiel funktioniert.
2. Du solltest auch mal (falls möglich) versuchen das Spiel im Randlos oder Windows Modus zu setzen (also NICHT vollbild) ob die tasten da ankommen.
3. Compiliere mal dieses Script zu einer .exe (mit Tools > Compile) und erstelle eine Verknüpfung auf den Desktop. Es wartet 5 Sekunden bis es F3 drückt.
(also wenn du im Spiel bist - Randlos Modus: Auf den Desktop, die Verknüpfung klicken, zurück ins Spiel, dort mehrfach ins Fenster klicken und warten ob F3 wirkt. Danach Fenster-Moduns, dann Vollbild-Modus)Edit: (vergaß er):
CodeSleep(5000) ; warte 5 sekunden bis ich im Anwendungsfenster bin Send("{F3 down}") ; drücke F3 runter Sleep(222) ; für 222ms Send("{F3 up}") ; lasse F3 los Exit ; endeAnsonsten wären es nicht mehr ganz triviale Ansätze wie Aspirinjunkie aufzeigt, ControlSend-Versuche etc. daher empfehle ich nochmal die 3 basic steps zu versuchen ob wir da nicht irgendein muster erkennen

-
das ist die standardmeldung. ist alles okay.
du musst aber auch den code posten
am besten im code-block (2 links vom zitat)
sonst kann ich nicht helfen.da hilft nur viel testen und die übersicht behalten, welcher key gerade gedrückt ist usw...
-
Ist das Fenster des Simulators aktiv (also hast du vorher reingeklickt)?
sonst empfängt es die tasten von send() nicht.
Ansonsten versuche mal: Opt ("SendKeyDownDelay", 120) -
-
schicke am besten immer das aktuelle script in code-block [<>] verpackt, dann ist es einfacher.
Code
Alles anzeigen;Hotkey Macros Opt ("SendKeyDelay", 40) ; default: 5 / Zeit zwischen gesendeten tastendrücken Opt ("SendKeyDownDelay", 70) ; default: 5 / Zeit wie lange eine taste gerdückt wird Global $hotkey_x = "{PAUSE}" ; Pause/Unterbechung - beendet dieses programm (oder über taskleiste!) Global $hotkey_1 = "{NUMPAD0}" ; Beispiel für einen Hotkey Global $run = 1 HotKeySet($hotkey_x, Stop) ; macro-funktion der Taste zuweisen HotKeySet($hotkey_1, Macro_C) Func Macro_C() ; Funktion mit Macro Send("{!C}") Sleep(1000) Send("{RSHIFT}{C}") MsgBox(0,"HotkeyTest", "Macro wurde ausgeführt") EndFunc Func Stop() $run = 0 EndFunc While $run = 1 Sleep(20) WEnd Exitum erstmal den hotkey zu prüfen kannst du zb. eine Messagebox einbauen, damit du sicher bist, dass der hotkey das macro auslöst (s.o.)
EDIT: Sollte kein Fenster aufpoppen wenn du den Hotkey drückst dann versuche einen anderen Hotkey!jetzt musst du dein programm genau kennen (lernen) welche tasten es registriert. einige erkennen NUMPAD0 nicht als 0, dann kann man da macros drauflegen ...
es kann auch sein, dass die tastendrücke eine mindestdauer haben um registriert zu werden. das habe ich mal in den obersten beiden zeilen reingesetzt (musst du ggf anpassen) -
Tippt der Ziffernblock denn eine 0 wenn du ihn drücks (also ist NUM eingeschaltet) ? Ansonsten versuche es erstmal mit einem anderen Hotkey der dich nicht stört (und auch die Anwendung nicht).
-
Hallo Hilmi,
du hast dich ja schon vorgestellt und offensichtlich den teil mit den spielen und bots in den regeln gelesen.
wenn du dir mehrere macros für ein programm basteln möchtest würde ich mal so beginnen:Code
Alles anzeigen;Hotkey Macros Global $hotkey_x = "{PAUSE}" ; Pause/Unterbechung - beendet dieses programm (oder über taskleiste!) Global $hotkey_1 = "{NUMPAD0}" ; Beispiel für einen Hotkey Global $run = 1 HotKeySet($hotkey_x, Stop) ; macro-funktion der Taste zuweisen HotKeySet($hotkey_1, Macro_C) Func Macro_C() ; Funktion mit Macro Send("{!C}") Sleep(1000) Send("{RSHIFT}{C}") EndFunc Func Stop() $run = 0 EndFunc While $run = 1 Sleep(20) WEnd Exitdie frage ist wie viele hotkeys du brauchst und auf welche freien (gut zugängliche) tasten du das legen willst ...
-
hi.
Sehe jetzt erst, deine überarbeitete wm_notify. Funzt einwandfrei bei mir!
ich bin auf win11. danke für die info! Jetzt kapier ich auch wie dieses Script funktioniert, dass ich eine zeitlang her gefunden habe:Code
Alles anzeigenFunc _GuiRoundCorners($h_win, $i_x1, $i_y1, $i_x3, $i_y3) Dim $pos, $ret, $ret2 $pos = WinGetPos($h_win) $ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", $i_x1, "long", $i_y1, "long", $pos[2], "long", $pos[3], "long", $i_x3, "long", $i_y3) If $ret[0] Then $ret2 = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $ret[0], "int", 1) If $ret2[0] Then Return 1 Else Return 0 EndIf Else Return 0 EndIf EndFunc;==>_GuiRoundCornersSchönen Sonntag!
-
der 'echte' Button liefert bei NM_CUSTOMDRAW den 'Hover' Status automatisch.
okay, mächtig! das wm_notify zu lesen ist wirklich schick. letztenendes muss halt doch der Farbeimer ran und das Icon wieder draufgeballert werden - dafür aber vollends kompatibel!
Ich hab die Buttons auf die Schnelle nicht abrunden können wie den Default. Das sollte aber doch mit den Styles gehen?!
-
jetzt weiß ich wofür diese wm_notify geschichte gut ist
große erkenntnis für das button-handling, sehr geil! 
mir ist ab diesem punkt nicht klar, welchen nachteil es hat ob mein button ein label, grafikhandle oder ein echter button ist!
"Das Zeichnen des Buttons könnte man noch verfeinern bzw. an Win 11 anpassen"
das würde mich auch interessieren (habe die gui-stlyes probiert aber die sind nicht wirklich der bringer.
hat der echte button hier vorteile, weil er besser dargestellt werden kann? -
wenn ich für meine "methode" einfach ein label auf der hGUI unter die subGUI platzieren kann ich den hover-status mit GUIGetCursorInfo($hGUI) auslesen. damit reduziert sich der button-handling code auch wesentlich. letztenendes wird sich aber doch jeder der mehrere OnMouseOver Buttons kontrollieren will einen button-händler basteln.
das noch zur ergänzung, meine Buttons etwas schlanker mit einem zusätzlichen Label:
AutoIt
Alles anzeigen#include <GUIConstants.au3> Example() ; compare multiple buttons fixing the icon-gui-bug Func Example() Local $winbg = 0x666666 Global $hGUI = GUICreate("GuiTest", 300, 400) GUISetBkColor($winbg, $hGUI) ; Press this button to "solve" the problem Local $idButton_bg = GUICtrlCreateButton("Change BG!", 210, 370, 85, 25) ;upia Local $idIcon7 = GuiSubButtonCreate($hGUI, "", 30, 250, 48, 48, "C:\Windows\System32\imageres.dll", -132, 32, 32, 8, 8, 0xff8888, 0xffbbbb, 0xffcccc) Local $idIcon8 = GuiSubButtonCreate($hGUI, "", 100, 250, 48, 48, "C:\Windows\System32\imageres.dll", -132, 32, 32, 8, 8, 0x8888ff, 0xbbbbff, 0xccccff) Local $idIcon9 = GuiSubButtonCreate($hGUI, "", 170, 250, 48, 48, "C:\Windows\System32\imageres.dll", -132, 32, 32, 8, 8, 0x88ff88, 0xbbffbb, 0xccffcc) GUISetState(@SW_SHOW, $hGUI) ; Loop until the user exits. While 1 Local $gmb = GUIGetMsg(1) Local $gm = $gmb[0] Local $h = $gmb[1] Local $c = $gmb[2] Switch $gm Case $GUI_EVENT_CLOSE ExitLoop Case $idButton_bg If $winbg = 0xcccccc Then $winbg = 0x666666 GUISetBkColor($winbg, $hGUI) GUISetState() ElseIf $winbg = 0x666666 Then $winbg = 0xcccccc GUISetBkColor($winbg, $hGUI) GUISetState() EndIf Case $idIcon7[1] ; check subgui-buttons on [1] hSUB Label ConsoleWrite("Works!" & @CRLF) Case $idIcon8[1] ConsoleWrite("Works!" & @CRLF) Case $idIcon9[1] ConsoleWrite("Works!" & @CRLF) Case $GUI_EVENT_NONE ; Button handling of the SubGui's with cursorinfo Local $nfo = GUIGetCursorInfo($hGUI) ; use this to check hover and out on [3] (hGUI-Label) Local $hover = $nfo[4] Switch $hover Case $idIcon7[3] $idIcon7 = GuiSubButtonSet($idIcon7, 1) Case $idIcon8[3] $idIcon8 = GuiSubButtonSet($idIcon8, 1) Case $idIcon9[3] $idIcon9 = GuiSubButtonSet($idIcon9, 1) Case 0 ; check - no hover => release any if state is hover If $idIcon7[7] = 1 Then $idIcon7 = GuiSubButtonSet($idIcon7, 0) If $idIcon8[7] = 1 Then $idIcon8 = GuiSubButtonSet($idIcon8, 0) If $idIcon9[7] = 1 Then $idIcon9 = GuiSubButtonSet($idIcon9, 0) EndSwitch EndSwitch WEnd GUIDelete($hGUI) EndFunc ;==>Example Func GuiSubButtonCreate($hGUI, $strText, $xPos, $yPos, $bWidth, $bHight, $iconFile, $iconIndex, $iconSizeX, $iconSizeY, $iconXoff, $iconYoff, $staticCol, $overCol, $pressCol) Local $ctrlID = -1, $icon GUISwitch($hGUI) Local $xLayer = GUICtrlCreateLabel("", $xPos, $yPos, $bWidth, $bHight) ; <<--------------------------- Trick? this triggers GUIGetCursorInfo($hGUI) - no sub-check Local $hChild = GUICreate("", $bWidth, $bHight, $xPos, $yPos, $WS_POPUP, $WS_EX_MDICHILD, $hGUI) GUISwitch($hChild) GUISetState(@SW_DISABLE, $hChild) GUISetState(@SW_HIDE, $hChild) $ctrlID = GUICtrlCreateLabel($strText, 0, 0, $bWidth, $bHight) GUISetBkColor($staticCol, $hChild) ;set state static GUICtrlSetBkColor($ctrlID, $staticCol) $icon = GUICtrlCreateIcon($iconFile, $iconIndex, 0+$iconXoff, 0+$iconYoff, $iconSizeX, $iconSizeY, Default) GUISetState(@SW_ENABLE, $hChild) GUISetState(@SW_SHOW, $hChild) Local $ret[8] = [$hChild, $ctrlID, $icon, $xLayer, $staticCol, $overCol, $pressCol, 0] GUISwitch($hGUI) Return $ret EndFunc Func GuiSubButtonSet($aID, $state) Local $stateL = $aID[7] If $stateL <> $state Then Local $i = $state + 4 Local $c = $aID[$i] GUISetBkColor($c, $aID[0]) GUICtrlSetBkColor($aID[1], $c) GUISetState(@SW_SHOW) $aID[7] = $state;?! EndIf Return $aID EndFunc -
Velted wow, dass ergebnis sieht gleich aus wie bei Kanashius nur mit weniger code.
Kann mir jemand das bitte noch final bestätigen:"Man kann einen .ico file nicht so manipulieren, dass er in AutoIt per GUICtrlCreateIcon() geladen wird und nicht den Transparenz-Bug aufweist!"EDIT: hab das erst jetzt kapiert!
Velted zeichnet das Icon einfach richtig (ohne bug mit WinAPI) auf ein Label.
Kanashius Weg "repariert" die transparenten Pixel auf einem GraphicHandle.
Und mein "Workaround" zeichnet eine neue sub-gui die ihren wahren BG nie zeigt und der Button ist auch nur ein Label.
Das funktioniert zwar, ohne Einsatz von extra-Bibliotheken aber auf Kosten von Programmierkomfort.Tendentiell ist für mich die Methode von Velted am geeignetsten. Ich werde mal die Tage einen Performance-Test für alle 3 Methoden machen und berichten!
ich hab hier mal alle 3 Versionen hinzugefügt und mit OnMouseOver Effekten belegt. Funzen alle super!
Besonders beim Button-Handling zeigt sich aber der Mehraufwand meiner Methode (da wäre eine Handler-Funktion sinnvoll - im nächsten Post verbessert.)
GUI-Button-Test: (Originale, Kanashius, Velted, UPIA) Der Code:
AutoIt
Alles anzeigen#include <GUIConstantsEx.au3> #include <GUIConstants.au3> #include <GDIPlus.au3> #include <WinAPIShellEx.au3> #include <WinAPISysWin.au3> #include <StaticConstants.au3> ;velted Global Const $SS_REALSIZEIMAGE = 0x0800 ; fehlt in StaticConstants.au3 Example() ; compare multiple buttons fixing the icon-gui-bug Func Example() Local $winbg = 0x666666 Global $hGUI = GUICreate("GuiTest", 300, 400) GUISetBkColor($winbg, $hGUI) ;$winbg ; Create a button control. - from examples working perfectly with trans icon on Default Color (No GUISetBkColor!) but has no color! Local $idButton_1 = GUICtrlCreateButton("", 30, 30, 48, 48, $BS_ICON) GUICtrlSetTip ( $idButton_1, "DefBtn", "") Local $idIcon_1 = GUICtrlSetImage($idButton_1, "C:\Windows\System32\imageres.dll", -82, 1) ; The same but with color => not showing .ico file Local $idButton_2 = GUICtrlCreateButton("ColBtn", 100, 30, 48, 48, $BS_ICON) GUICtrlSetTip ( $idButton_2, "no ico!", "") GUICtrlSetBkColor($idButton_2, 0x666666) Local $idIcon_2 = GUICtrlSetImage($idButton_2, "C:\Windows\System32\imageres.dll", -82, 1) ; Createing a color label with the icon as pseudo-button works ONLY if GUI-BG-color is same as the icons background Local $idButton_3 = GUICtrlCreateLabel("", 170, 30, 48, 48) GUICtrlSetTip ( $idButton_3, "bad ico", "") GUICtrlSetBkColor($idButton_3, 0x666666) Local $idIcon_3 = GUICtrlCreateIcon("C:\Windows\System32\imageres.dll", -82, 178,38, 32,32) ; Press this button to "solve" the problem Local $idButton_bg = GUICtrlCreateButton("Change BG!", 210, 370, 85, 25) ;kanashius Local $idIcon1 = GuiCtrlCreateIconEx("C:\Windows\System32\imageres.dll", -82, 30, 110, 48, 48, 32,32) GUICtrlSetBkColor(-1, 0x8888ff) GUICtrlSetTip ( $idIcon1, "Kanashius", "") Local $idIcon2 = GuiCtrlCreateIconEx("C:\Windows\System32\imageres.dll", -82, 100, 110, 48, 48, 32,32) GUICtrlSetBkColor(-1, 0xff8888) GUICtrlSetTip ( $idIcon2, "Kanashius", "") Local $idIcon3 = GuiCtrlCreateIconEx("C:\Windows\System32\imageres.dll", -82, 170, 110, 48, 48, 32,32) GUICtrlSetBkColor(-1, 0x88ff88) GUICtrlSetTip ( $idIcon3, "Kanashius", "") ;velted Local $idIcon4 = GuiCtrlCreateIcon2("", 30, 180, 48, 48, "C:\Windows\System32\imageres.dll", 4) GUICtrlSetBkColor(-1, 0x8888ff) GUICtrlSetTip ( $idIcon4, "Velted", "") Local $idIcon5 = GuiCtrlCreateIcon2("", 100, 180, 48, 48, "C:\Windows\System32\imageres.dll", 4) GUICtrlSetBkColor(-1, 0xff8888) GUICtrlSetTip ( $idIcon5, "Velted", "") Local $idIcon6 = GuiCtrlCreateIcon2("", 170, 180, 48, 48, "C:\Windows\System32\imageres.dll", 4) GUICtrlSetBkColor(-1, 0x88ff88) GUICtrlSetTip ( $idIcon6, "Velted", "") ;upia Local $idIcon7 = GuiSubButtonCreate($hGUI, "", 30, 250, 48, 48, "C:\Windows\System32\imageres.dll", -132, 32, 32, 8, 8) GuiSubButtonSet($idIcon7, 0x8888ff) GUICtrlSetTip ( $idIcon7[1], "UPIA", "") Local $idIcon8 = GuiSubButtonCreate($hGUI, "", 100, 250, 48, 48, "C:\Windows\System32\imageres.dll", -132, 32, 32, 8, 8) GuiSubButtonSet($idIcon8, 0xff8888) GUICtrlSetTip ( $idIcon8[1], "UPIA", "") Local $idIcon9 = GuiSubButtonCreate($hGUI, "", 170, 250, 48, 48, "C:\Windows\System32\imageres.dll", -132, 32, 32, 8, 8) GuiSubButtonSet($idIcon9, 0x88ff88) GUICtrlSetTip ( $idIcon9[1], "UPIA", "") ;_WinAPI_SetLayeredWindowAttributes($hGUI, $winbg, 255) GUISetState(@SW_SHOW, $hGUI) Local $iPID = 0 Local $lastH[2] = [-1,-1] ; for button control (regular) Local $lastB[2] = [-1,-1] ; for gui-buttons ; Loop until the user exits. While 1 Local $gmb = GUIGetMsg(1) Local $gm = $gmb[0] Local $h = $gmb[1] Local $c = $gmb[2] ;If $gm <> 0 Then ConsoleWrite($gm & " - Handle: " & $h & " - Control: " & $c & " -------> lH: " & $lastH[0] & @CRLF) Switch $gm Case $GUI_EVENT_CLOSE ExitLoop Case $idButton_bg If $winbg = 0xcccccc Then $winbg = 0x666666 GUISetBkColor($winbg, $hGUI) GUISetState() ElseIf $winbg = 0x666666 Then $winbg = 0xcccccc GUISetBkColor($winbg, $hGUI) GUISetState() EndIf Case $idButton_1 MsgBox(0,"Default Button", "ico is transparent, but surface has fix color!") Case $idButton_2 MsgBox(0,"Default Button with Color", "Color set with GUICtrlSetBkColor() prevents ico") Case $idButton_3 If $winbg = 0xcccccc Then $winbg = 0x666666 GUISetBkColor($winbg, $hGUI) GUISetState() ElseIf $winbg = 0x666666 Then $winbg = 0xcccccc GUISetBkColor($winbg, $hGUI) GUISetState() EndIf Case $idIcon1 ConsoleWrite("Works!" & @CRLF) Case $idIcon2 ConsoleWrite("Works!" & @CRLF) Case $idIcon3 ConsoleWrite("Works!" & @CRLF) Case $idIcon4 ConsoleWrite("Works!" & @CRLF) Case $idIcon5 ConsoleWrite("Works!" & @CRLF) Case $idIcon6 ConsoleWrite("Works!" & @CRLF) Case $idIcon7[1] ; check subgui-buttons ConsoleWrite("Works!" & @CRLF) Case $idIcon8[1] ConsoleWrite("Works!" & @CRLF) Case $idIcon9[1] ConsoleWrite("Works!" & @CRLF) Case $GUI_EVENT_NONE ; Button handling of the SubGui's with cursorinfo Local $CHECK = $idIcon7 Local $ci = GUIGetCursorInfo($CHECK[0]) If $ci[4] = $CHECK[1] Or $ci[4] = $CHECK[1]+1 Then If $lastB[0] <> $CHECK[1] Then GuiSubButtonSet($CHECK, 0xbbbbff) $lastB[0] = $CHECK[1] $lastB[1] = $CHECK[0] EndIf Else If $lastB[0] = $CHECK[1] Then GuiSubButtonSet($CHECK, 0x8888ff) $lastB[0] = 0 $lastB[1] = 0 EndIf EndIf Local $CHECK = $idIcon8 Local $ci = GUIGetCursorInfo($CHECK[0]) If $ci[4] = $CHECK[1] Or $ci[4] = $CHECK[1]+1 Then If $lastB[0] <> $CHECK[1] Then GuiSubButtonSet($CHECK, 0xffbbbb) $lastB[0] = $CHECK[1] $lastB[1] = $CHECK[0] EndIf Else If $lastB[0] = $CHECK[1] Then GuiSubButtonSet($CHECK, 0xff8888) $lastB[0] = 0 $lastB[1] = 0 EndIf EndIf Local $CHECK = $idIcon9 Local $ci = GUIGetCursorInfo($CHECK[0]) If $ci[4] = $CHECK[1] Or $ci[4] = $CHECK[1]+1 Then If $lastB[0] <> $CHECK[1] Then GuiSubButtonSet($CHECK, 0xbbffbb) $lastB[0] = $CHECK[1] $lastB[1] = $CHECK[0] EndIf Else If $lastB[0] = $CHECK[1] Then GuiSubButtonSet($CHECK, 0x88ff88) $lastB[0] = 0 $lastB[1] = 0 EndIf EndIf Local $nfo = GUIGetCursorInfo($hGUI) ; use this to check hover and out - regular buttons/ctrlid's Local $hover = $nfo[4] ;If $hover <> 0 Then ConsoleWrite("............ " & $hover) Switch $hover Case $idIcon1 If Not $lastH[0] = $idIcon1 Then GUICtrlSetBkColor($idIcon1,0xbbbbff) $lastH[0] = $idIcon1 $lastH[1] = 1 EndIf Case $idIcon2 If Not $lastH[0] = $idIcon2 Then GUICtrlSetBkColor($idIcon2,0xffbbbb) $lastH[0] = $idIcon2 $lastH[1] = 1 EndIf Case $idIcon3 If Not $lastH[0] = $idIcon3 Then GUICtrlSetBkColor($idIcon3,0xbbffbb) $lastH[0] = $idIcon3 $lastH[1] = 1 EndIf Case $idIcon4 If Not $lastH[0] = $idIcon4 Then GUICtrlSetBkColor($idIcon4,0xbbbbff) $lastH[0] = $idIcon4 $lastH[1] = 1 EndIf Case $idIcon5 If Not $lastH[0] = $idIcon5 Then GUICtrlSetBkColor($idIcon5,0xffbbbb) $lastH[0] = $idIcon5 $lastH[1] = 1 EndIf Case $idIcon6 If Not $lastH[0] = $idIcon6 Then GUICtrlSetBkColor($idIcon6,0xbbffbb) $lastH[0] = $idIcon6 $lastH[1] = 1 EndIf Case 0 ; regular buttons/ctrlid's check - no hover => release any If Not $lastH[0] = 0 Then Local $cid = $lastH[0] Switch $cid Case $idIcon1 GUICtrlSetBkColor($idIcon1,0x8888ff) Case $idIcon2 GUICtrlSetBkColor($idIcon2,0xff8888) Case $idIcon3 GUICtrlSetBkColor($idIcon3,0x88ff88) Case $idIcon4 GUICtrlSetBkColor($idIcon4,0x8888ff) Case $idIcon5 GUICtrlSetBkColor($idIcon5,0xff8888) Case $idIcon6 GUICtrlSetBkColor($idIcon6,0x88ff88) EndSwitch $lastH[0] = 0 $lastH[1] = 0 EndIf EndSwitch EndSwitch WEnd GUIDelete($hGUI) If $iPID Then ProcessClose($iPID) EndFunc ;==>Example Func GuiCtrlCreateIconEx($sFilename, $iIconIndex, $iLeft, $iTop, $iWidth = Default, $iHeight = Default, $iIconWidth = Default, $iIconHeight = Default, $iStyle = Default) ;kanashius If $iIconWidth = Default Then $iIconWidth = $iWidth If $iIconHeight = Default Then $iIconHeight = $iHeight Local $idGraphic = GUICtrlCreateGraphic($iLeft, $iTop, $iWidth, $iHeight, $iStyle) _GDIPlus_Startup() Local $hIcon = _WinAPI_ShellExtractIcon($sFilename, $iIconIndex, $iIconWidth, $iIconHeight) Local $hBitmap = _GDIPlus_BitmapCreateFromHICON($hIcon) Local $iColorPrev = -1, $iImgWidth=_GDIPlus_ImageGetWidth($hBitmap), $iImgHeight = _GDIPlus_ImageGetHeight($hBitmap) Local $iLeftSpace = (_WinAPI_GetClientWidth(GUICtrlGetHandle($idGraphic))-$iImgWidth)/2, $iTopSpace = (_WinAPI_GetClientHeight(GUICtrlGetHandle($idGraphic))-$iImgHeight)/2 For $x=0 To $iImgWidth For $y=0 To $iImgHeight Local $iColor = _GDIPlus_BitmapGetPixel($hBitmap, $x, $y) If BitAND($iColor, 0xFF000000)<>0 Then $iColor = BitAND($iColor, 0xFFFFFF) If $iColor<>$iColorPrev Then GUICtrlSetGraphic($idGraphic, $GUI_GR_COLOR, $iColor, $iColor) $iColorPrev = $iColor EndIf GUICtrlSetGraphic($idGraphic, $GUI_GR_PIXEL, $iLeftSpace+$x, $iTopSpace+$y, 40, 30, 270) EndIf Next Next ; export here once to _ffccff _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_Shutdown() return $idGraphic EndFunc Func GuiCtrlCreateIcon2($tx, $pX, $pY, $iW, $iH, $sIconFileName, $IconIndex, $iBtnStyle=BitOR($SS_CENTERIMAGE, $SS_ICON, $SS_NOTIFY, $SS_REALSIZEIMAGE) ) ;velted ; Createing a color label with the icon as pseudo-button Local $idButton = GUICtrlCreateLabel($tx, $pX, $pY, $iW, $iH, $iBtnStyle) GUICtrlSetTip(-1, "nice ico", "") Local $hIcon = _WinAPI_ShellExtractIcon($sIconFileName, $IconIndex, 32, 32) GUICtrlSendMsg(-1, $STM_SETICON, $hIcon, 0) Return $idButton EndFunc Func GuiSubButtonCreate($hGUI, $strText, $xPos, $yPos, $bWidth, $bHight, $iconFile, $iconIndex, $iconSizeX, $iconSizeY, $iconXoff, $iconYoff, $initCol=0xf0f0f0) Local $ctrlID = -1, $icon Local $hChild = GUICreate("", $bWidth, $bHight, $xPos, $yPos, $WS_POPUP, $WS_EX_MDICHILD, $hGUI) GUISwitch($hChild) GUISetState(@SW_DISABLE, $hChild) GUISetState(@SW_HIDE, $hChild) $ctrlID = GUICtrlCreateLabel($strText, 0, 0, $bWidth, $bHight) GUISetBkColor($initCol, $hChild) ;set state static GUICtrlSetBkColor($ctrlID, $initCol) $icon = GUICtrlCreateIcon($iconFile, $iconIndex, 0+$iconXoff, 0+$iconYoff, $iconSizeX, $iconSizeY, Default) GUISetState(@SW_ENABLE, $hChild) GUISetState(@SW_SHOW, $hChild) Local $ret[2] = [$hChild, $ctrlID] Return $ret EndFunc Func GuiSubButtonSet($aID, $col) GUISetBkColor($col, $aID[0]) GUICtrlSetBkColor($aID[1], $col) GUISetState(@SW_SHOW) EndFunc