Bilder verschwinden hinter Radio-Control, wenn der Mauszeiger drüber fährt

  • autoit.de/wcf/attachment/25282/Hallo allerseits. Nachdem ich bei den letzten Projekten alle Probleme durch nachlesen lösen konnte, bin ich bei diesem leider ziemlich Ideenlos.
    Ich habe ein Hilfsprogramm geschrieben, das mir verschiedene Internet-Radiostreams anzeigt (Daten dazu sind in einer Ini gespeichert) und ich über Radios einen auswählen, den Player starten und diesen Sender hören kann. Gefällt mir was da gerade läuft, kann ich durch Knopfdruck den Streamripper starten und den Stream downloaden.

    Auf meinem PC läuft das Programm (auch im Compilierten Zustand) ohne Probleme. Auf anderen Rechnern, verschwinden allerdings die Bilder (Logos der Streams), die sich im freien Bereich zwischen Text und Radiokreis befinden sobald der Mauszeiger über die Radio-Controls oder deren Text fährt. Außerdem wird auf dem Settings-Button das Bild nicht angezeigt.

    Hat von euch jemand eine Idee, wo hier das Problem liegen könnte? Ich weiß, dass es nicht gterade Professionell programmiert ist, aber ich bin ja noch am Üben. Das Fehlerhandling durch Auslesen der Rückgabewerte will ich machen, wenn das Programm erst mal Problemlos läuft.

    Spoiler anzeigen
    [autoit]

    #RequireAdmin
    #include <array.au3>
    #include <GUIConstantsEx.au3>
    #include <eigene.au3>
    #include <GuiButton.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $aGenres[3]=[2, "Genre1", "Genre2"]
    Local $aSender[4][8]
    Local $i=0
    $aSender[0][0]=3
    While $i<3
    $i+=1
    $aSender[$i][0]="Sender" & $i
    $aSender[$i][1]="Genre1"
    $aSender[$i][2]="URL" & $i
    $aSender[$i][3]=$i & ".gif"
    $aSender[$i][4]=20
    $aSender[$i][5]=20
    $aSender[$i][7]=1
    WEnd
    $aSender[3][1]="Genre2"

    [/autoit] [autoit][/autoit] [autoit]

    Global $grx=300
    Global $gry=210

    [/autoit] [autoit][/autoit] [autoit]

    Global $hMainGUI = GUICreate("PAIR", $grx, $gry)
    Global $hStartButton=GUICtrlCreateButton("&Play", 10, $gry-(25+20), 50, 25)
    Global $hCancelButton=GUICtrlCreateButton("&Beenden", $grx-(10+60), $gry-(25+20), 60, 25)
    Global $hSettingsButton=GUICtrlCreateButton("", $grx-(10+30), 6, 30, 30, $BS_ICON)
    _GUICtrlButton_SetImage($hSettingsButton, @ScriptDir & "\options_klein.ico")
    Global $hGenreCombo=GUICtrlCreateCombo($aGenres[1], 90, 10, 120)
    Global $vGenreCombo=""
    $hRecordButton=GUICtrlCreateButton("Stream &aufnehmen", 10+50+20, $gry-(25+20), 100, 25)
    $i=0
    While $i<$aGenres[0]
    $i+=1
    $vGenreCombo=$vGenreCombo & "|" & $aGenres[$i]
    WEnd
    GUICtrlSetData($hGenreCombo, $vGenreCombo, $aGenres[1])
    Global $vGenre=GUICtrlRead($hGenreCombo)
    GUICtrlCreateLabel("Musikrichtung: ", 10, 12)
    $i=0
    Local $iPos=0
    While $i<$aSender[0][0]
    $i+=1
    If $aSender[$i][1]=$vGenre Then
    $iPos+=1
    $aSender[$i][6]=GUICtrlCreateRadio(" " & $aSender[$i][0] & " ", 10, 50 + (($iPos-1)*30))
    GUICtrlCreatePic(@ScriptDir & "\" & $aSender[$i][3], 45-($aSender[$i][4]/2), 50 + (($iPos-1)*30), $aSender[$i][4], $aSender[$i][5])
    GUICtrlSetBkColor($aSender[$i][6], $GUI_BKCOLOR_TRANSPARENT)
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Global $playing=1
    Global $con=1

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $hMainGUI)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg=GUIGetMsg()

    [/autoit] [autoit][/autoit] [autoit]

    Select
    Case $msg=$hStartButton
    ;startet den Player und spielt den jeweiligen Sender ab
    Case $msg=$hGenreCombo
    Global $PosMainGUI=WinGetPos("PAIR", "Musikrichtung: ")
    $vGenre=GUICtrlRead($hGenreCombo)
    GUIDelete($hMainGUI)
    $hMainGUI = GUICreate("PAIR", $grx, $gry, $PosMainGUI[0], $PosMainGUI[1])
    $hStartButton=GUICtrlCreateButton("&Play", 10, $gry-(25+20), 50, 25)
    $hCancelButton=GUICtrlCreateButton("&Beenden", $grx-(10+60), $gry-(25+20), 60, 25)
    Global $hSettingsButton=GUICtrlCreateButton("", $grx-(10+30), 6, 30, 30, $BS_ICON)
    _GUICtrlButton_SetImage($hSettingsButton, @ScriptDir & "\options_klein.ico")
    $hGenreCombo=GUICtrlCreateCombo($vGenre, 90, 10, 120)
    $hRecordButton=GUICtrlCreateButton("Stream &aufnehmen", 10+50+20, $gry-(25+20), 100, 25)
    GUICtrlSetData($hGenreCombo, $vGenreCombo, $vGenre)
    $vGenre=GUICtrlRead($hGenreCombo)
    GUICtrlCreateLabel("Musikrichtung: ", 10, 12)
    $i=0
    $iPos=0
    While $i<$aSender[0][0]
    $i+=1
    If $aSender[$i][1]=$vGenre Then
    $iPos+=1
    $aSender[$i][6]=GUICtrlCreateRadio(" " & $aSender[$i][0] & " ", 10, 50 + (($iPos-1)*30))
    GUICtrlCreatePic(@ScriptDir & "\" & $aSender[$i][3], 45-($aSender[$i][4]/2), 50 + (($iPos-1)*30), $aSender[$i][4], $aSender[$i][5])
    GUICtrlSetBkColor($aSender[$i][6], $GUI_BKCOLOR_TRANSPARENT)
    EndIf
    WEnd
    GUISetState(@SW_SHOW, $hMainGUI)
    ;_ArrayDisplay($aSender)
    Case $msg=$hSettingsButton
    ;Öffnet die GUI für die Einstellungen
    Case $msg=$hRecordButton
    ;startet Streamripper und beginnt die Aufnahme
    Case $msg=$GUI_EVENT_CLOSE
    Exit
    Case $msg=$hCancelButton
    Exit
    EndSelect

    [/autoit] [autoit][/autoit] [autoit]

    If WinExists("Error") Then
    $playing=1
    ProcessClose(WinGetProcess("Error"))
    sleep(200)
    MsgBox(0, "Fehler", "Es ist ein Fehler bei der Verbindung " & @CRLF & "mit " & $con & " aufgetreten." & @CRLF & @CRLF & "Starten Sie die Wiedergabe erneut.")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit]

    Soweit mal das gekürzte Skript. Die Includes habe ich nach dem Kürzen nicht aussortiert, also nicht wundern, wenn was dabei steht, ohne daraus eine Funktion verwendet zu haben.

    Falls Wichtig
    Aufbau des Sender-Arrays:
    $aSender[0][0] - Anzahl an Sendern
    für i>0
    $aSender[i][0] - Sendername
    $aSender[i][1] - Genre
    $aSender[i][2] - URL des Senders
    $aSender[i][3] - Bild (Logo des Senders)
    $aSender[i][4 und 5] - Größe des Bildes (auch wenn die Bilddatei kleiner ist, wurde es aus irgend einem Grund immer Groß gezogen)
    $aSender[i][6] - Handle des Radio
    $aSender[i][7] - Shoutcast-Stream Ja/Nein

    Aufbau des Genre-Arrays:
    $aGenre[0] - Anzahl an Genres
    $aGenre[1...] - Genre

    Wäre super, wenn jemandem das Problem auffällt. Einem Profi springt das bestimmt direkt ins Auge.

    Edit: habe das gepostete Skript angepasst, dass es direkt zu starten geht. es müssten nur noch Bilder zum testen eingesetzt werden
    Edit2: Das Skript sollte jetzt mit den unten angehängten Bildern (im Skriptordner abgelegt) funktionieren. options_klein ist eigentlich eine .ico, die allerdings beim Hochladen nicht akzeptiert wurde. Nach dem Runterladen die Datei also wieder zu .ico umbenennen.

    Edit3: Nachdem ich heute nochmal eine Weile gesucht habe und etwas rumprobiert habe, bin ich auf folgenden Link gestoßen:
    http://www.codebot.de/index.php/Thre…icht-angezeigt/
    Ich habe dem Butten den Style $BS_ICON verpasst (oben schon geändert) und jetzt geht es auch auf anderen Rechnern. Warum es vorher bei mir schon ging weiß ich ehrlich gesagt nicht.
    Das Problem mit den Bildern besteht allerdings weiterhin. Ich habe mir zwar jetzt beholfen, indem ich die Bilder vor die Radios gezogen habe, aber zwischen Radio und Text wäre mir lieber. Die Radios ohne Text erstellen und stattdessen neben dem Bild ein Laber möchte ich nicht, da die Radios dann ja nur durch klicken auf den Punkt ausgewählt werden können. Es wäre also super, wenn hier jemand noch eine Lösung hat.

    7 Mal editiert, zuletzt von Mistil (19. März 2015 um 08:53)

    • Offizieller Beitrag

    verschwinden allerdings die Bilder (Logos der Streams), die sich im freien Bereich zwischen Text und Radiokreis befinden sobald der Mauszeiger über die Radio-Controls oder deren Text fährt.


    Das passiert dann, wenn die Länge der Radio-Ctrl nicht oder zu lang definiert wird. Du definierst keine Länge und weisst also gar nicht, wo dein Radio-Ctrl endet. Setzt aber dahinter ein Picture-Ctrl mit einem geratenen Wert für die x-Position. Solange der Focus nicht auf dem Radio liegt stört die Überschneidung nicht. Bekommt aberd das Radio den Fokus, wird der gesamte Platz des Radios auch fokussiert. Überschneidet sich das mit dem danach folgenden Picture, kann dieses nicht angezeigt werden.
    Deshalb, auch wenn es laut Funktionsbeschreibung optional ist, meine Empfehlung: Für alle Ctrl immer eine fixe Länge angeben. Dann hast du solche Probleme nicht.

  • Danke für deine Antwort BugFix. Also ist es nicht möglich, den Tekt zu einem Radio-Control mit Leerzeichen zu beginnen und in den entstehenden Freiraum ein anderes Control (hier ein Bild) zu setzen?

    Das ist schade. Ich hatte gehofft, man könnte das Problem umgehen, indem man das Radio-Control transparent macht.

    Allerdings wundert es mich, dass es an meinem PC (an dem ich auch programmiere) funktioniert.

  • So weit war ich schon, aber:

    Zitat

    Die Radios ohne Text erstellen und stattdessen neben dem Bild ein Laber möchte ich nicht, da die Radios dann ja nur durch klicken auf den Punkt ausgewählt werden können.

    Und alle Labels in der While-Schleife auf aktivitäten prüfen und dann das jeweilige Radio als checked setzen (bzw. das vorherige wieder unchecked) geht schwer, weil die Anzahl an Sendern nicht bekannt ist. Das kommt zum einen auf die Musikrichtung an und zum anderen können über die Ini ganz einfach Sender ergänzt werden.
    Die Radios lese ich erst beim Klicken auf Start in einer extra Schleife aus.

  • Na der hat ja mitgedacht ;)

    Ich habe jetzt nur von der GUIGetMsg-Schleife gesprochen, in der ich keinen Case für die jeweiligen Labels anlegen kann. Was natürlich ginge ist wie du schon sagst, neben den Radio-Handles auch die Lable-Handles im Array auffangen und in besagter Schleife diese nochmal in einer separaten Schleife zu prüfen. Ich hatte das mal ausprobiert, was die Reaktionszeit meines Skriptes allerdings stark gebremst hat. Zudem müssten dann noch andere Anpassungen gemacht werden. Wenn das wirklich die einzige Möglichkeit ist, dann lasse ich es lieber so, dass die Bilder ganz am Anfang stehen.

    Danke natürlich an euch für eure Hilfe und Tipps.

    • Offizieller Beitrag

    Dein Ziel war ja anzuzeigen: <Radio> (ohne Text) <Picture> <Text zum Radio>
    Dann kombiniere aus den 3 Control doch eines und arbeite damit. So gehts: (du kannst auf das Radio selbst oder Picture oder Label klicken, alles funzt)

    Spoiler anzeigen
    [autoit]


    #Include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $aRadio[2]

    [/autoit] [autoit][/autoit] [autoit]

    $gui = GUICreate('Test')
    $aRadio[0] = _GuiCtrlRadioPict_Create($gui, 'Radio-1', "C:/Users/Pictures/__1.JPG", 10, 10) ; hier deine Bildpfade anpassen (jpg, gif, bmp)
    $aRadio[1] = _GuiCtrlRadioPict_Create($gui, 'Radio-2', "C:/Users/Pictures/__2.JPG", 10, 40)
    GuiCtrlSetState( ($aRadio[1])[0], $GUI_CHECKED)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While True
    Switch GuiGetMsg()
    Case -3
    Exit
    Case $GUI_EVENT_PRIMARYUP
    For $i = 0 To UBound($aRadio) -1
    If _GuiCtrlRadioPict_IsClicked($gui, $aRadio[$i]) Then ExitLoop
    Next
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; liefert ein Array zurück, an [0] ist die ID des Radio
    Func _GuiCtrlRadioPict_Create($hGui, $sText, $sPathPict, $iX, $iY, $style=-1, $exStyle=-1)
    Local $iMargin = 5 ; Platz zwischen Radio und Picture sowie zwischen Picture und Text
    Local $tmpGUI = GUICreate('TMP')
    GUISwitch($tmpGUI)
    Local $tmpRadio = GUICtrlCreateRadio(' ', 0, 0)
    Local $tmpLabel = GUICtrlCreateLabel($sText, 0, 40)
    Local $aSizeR = ControlGetPos($tmpGUI, '', $tmpRadio)
    Local $aSizeL = ControlGetPos($tmpGUI, '', $tmpLabel)
    GUICtrlDelete($tmpRadio)
    GUICtrlDelete($tmpLabel)
    GUISwitch($hGUI)
    GUIDelete($tmpGUI)
    Local $radio = GUICtrlCreateRadio('', $iX, $iY, $aSizeR[2], $aSizeR[3], $style, $exStyle)
    Local $pict = GUICtrlCreatePic($sPathPict, $iX+$aSizeR[2]+$iMargin, $iY, $aSizeR[3], $aSizeR[3])
    Local $label = GUICtrlCreateLabel($sText, _
    $iX +$aSizeR[2] +$iMargin +$aSizeR[3] +$iMargin, _ ; x-Pos + Radiobreite + Margin + Picturebreite + Margin
    $iY +4, _ ; y-Pos +4
    $aSizeL[2], $aSizeL[3])
    Local $aOut[3] = [$radio, $pict, $label] ; [ID-Radio, ID-Pict, ID-Label]
    Return $aOut
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GuiCtrlRadioPict_IsClicked($hGui, ByRef $aRadio)
    Local $aCursor = GUIGetCursorInfo($hGui), $id_Match = False, $radioMatch = False
    Switch $aCursor[4]
    Case $aRadio[0] ; Radio
    $id_Match = True
    $radioMatch = True
    Case $aRadio[1], $aRadio[2] ; Pict, Label
    $id_Match = True
    EndSwitch
    If $id_Match Then
    If Not $radioMatch Then ControlClick($hGui, '', $aRadio[0])
    Return True
    Else
    Return False
    EndIf
    EndFunc

    [/autoit]
  • BugFix, du bist der Hammer. Danke dir.

    Dass es sowas wie $GUI_EVENT_PRIMARYUP gibt war mir garnicht bekannt (Hätte ich die Hilfe vielleicht mal ganz lesen sollen und nicht immer nur, welche Parameter angegeben werden müssen :S ). So wird die Schleife ja erst dann geprüft, wenn es wirklich was zum auslesen gibt. Ich bin mir sicher, dass diese Vorgehensweise auch noch bei anderen GUIs von mir zum einsatz kommt.

    Damit wäre mein Problem wohl zufriedenstellend gelöst.

    Ich würde aber gerne noch eine weitere Frage zu meinem Programm stellen (genauer zum Installer).
    Dieser wird von Kaspersky als Trojaner erkannt. Gibt es irgendwie eine Möglichkeit zu suchen, an welcher Stelle im Code das der Fall ist oder nur mittels try-and-error stückweise Codesegmente zu entfernen bis der Fehler nicht mehr auftritt?
    Kann das Problem auch durch Programme oder Dateien verursacht werden, die ich über FileInstall eingebunden habe?

    • Offizieller Beitrag

    Dieser wird von Kaspersky als Trojaner erkannt.


    Verwende beim Kompilieren kein UPX. Das wird von den Virenwächtern oft als Indiz einer möglichen Schadsoftware interpretiert. Schon hunderte AutoIt-User haben das immer und immer wieder an die Hersteller der Anti-Virensoftware als Fehler gemeldet - ist denen aber wie du siehst scheißegal. Die möchten gerne Angst produzieren um ihre Produkte zu verkaufen.

    NB: Wenn dan Problem gelöst ist, setze bitte den Status im Startpost auch auf "gelöst".

  • Leider hat das abschalten von UPX beim kompilieren nicht zum erfolg geführt (es war schon abgeschaltet).
    Das Problem liegt wohl an dem selbst entpackenden Archiv, das ich per FileInstall eingebunden habe. Wenn ich die Code-Zeile entferne, wird das Skript nicht als Virus erkannt. Das ein zu bindende Archiv selbst auch nicht. Erst das komplette Skript wird als Virus erkannt (trojan.win32.generic).
    UPX ist beim kompilieren wie gesagt abgeschaltet.

    Soll ich dafür ein neuer Thema erstellen, oder lässt sich das hier einfach mit lösen?

  • Ist nicht verschlüsselt. Ich weiß nicht, ob das mit einem Passwort noch funktioniert, weil das Archiv selbstentpackend ist und silent gestartet wird. Oder kennt einer einen Startparameter, mit dem ich das Passwort übermitteln könnte?
    Das Archiv ist übrigens ein rar und nicht zip

    Edit: Habs durch ausprobieren geschafft das PW per Prarameter zu übermitteln. Das Problem wurde dadurch leider nicht gelöst.

    Einmal editiert, zuletzt von Mistil (29. März 2015 um 15:34)