Problem bzg. GuiCtrlCreatePic und _Stringbetween

  • Hi :D

    Ich habe ein Problem mit GuiCtrlCreatePic , nämlich will ich ein
    Tool schreiben (zum üben) , dass sich einen Skin runterläd , ihn speichert &
    dann als Pic anzeigt , doch das will nicht...
    Es speichert zwar den Skin unter "@Scriptdir &"\skins\" , doch wird
    nicht als Pic angezeigt...

    Spoiler anzeigen
    [autoit]

    Global $Skin = GuiCtrLRead ($Skininput)

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

    If NOT FileExists (@Scriptdir &"\skins") Then
    DirCreate (@Scriptdir &"\skins")
    Endif

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

    $Steal = InetGet ("http://s3.amazonaws.com/MinecraftSkins/"&$Skin&".png",@ScriptDir &"\skins\"&$Skin&".png")

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

    If Fileexists (@Scriptdir &"\skins\"&$Skin&".png") Then
    GUICtrlCreatePic(@Scriptdir &"\skins\"&$Skin&".png", 552, 280, 100, 100)
    EndIf

    [/autoit]

    3 Mal editiert, zuletzt von Njahs (18. Dezember 2011 um 13:53)

  • Hm... etwas mager ,
    btw. ich habe noch ein problem , undzwar mit
    _Stringbetween...

    [autoit]

    #Include <Array.au3>
    #Include <String.au3>
    #Include <File.au3>

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

    Dim $Log[54] = ["2011-08-03","2011-08-04","2011-08-05","2011-08-06","2011-08-07","2011-08-08","2011-08-09","2011-08-10","2011-08-12","2011-08-13","2011-08-16","2011-08-17","2011-08-18","2011-08-20","2011-08-21","2011-08-23","2011-08-25","2011-08-26","2011-08-27","2011-08-28","2011-08-30",",2011-09-02","2011-09-04","2011-09-10","2011-09-16","2011-09-23","2011-09-25","2011-09-30","2011-10-03","2011-10-05","2011-10-07","2011-10-08","2011-10-10","2011-10-19","2011-10-20","2011-10-29","2011-11-02","2011-11-05","2011-11-10","2011-11-12","2011-11-13","2011-11-20","2011-11-23","2011-11-25","2011-11-27","2011-11-28","2011-11-30","2011-12-05","2011-12-06","2011-12-09","2011-12-10"]
    Dim $File[54]

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

    If Fileexists(@Scriptdir &"\ProBuilder.txt") Then FileDelete (@Scriptdir &"\ProBuilder.txt")

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

    For $i = 1 to 53 Step 1
    If Fileexists(@Scriptdir &"\"&$Log[$i]&".txt") Then
    $FileOpen = FileOpen (@Scriptdir &"\"&$Log[$i]&".txt")
    _FileReadToArray (@Scriptdir &"\"&$Log[$i]&".txt",$file)
    $ProBuilder = _StringBetween ($File,"(",")")
    FileWrite (@Scriptdir &"\Probuilder.txt",$ProBuilder)
    FileClose($FileOpen)
    Endif
    Next

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

    Exit

    [/autoit]

    So , nun schreibt es aber nur lauter "0" in die Probuilder.txt ,
    nun frag ich mich , wieso?

  • Njahs
    In Zeile 14 gibst du $file der Funktion mit. Das ist erstens ein ARRAY also wenn schon dann $file[$i-1] (dann muss $i auch bis 54 gehen um den ganzen $file-Array durchzugehen) und zweitens ist $file[x] immer standartmäßig= "" da es niergends verändert wird, also müsstest du es wahrscheinlich in Zeile 13 $file[$i-1]=FileRead...

    Dann sind jetzt die gröbstens Fehler, die mir auf die Kürze eingefallen sind

  • Njahs
    In Zeile 14 gibst du $file der Funktion mit. Das ist erstens ein ARRAY also wenn schon dann $file[$i-1] (dann muss $i auch bis 54 gehen um den ganzen $file-Array durchzugehen) und zweitens ist $file[x] immer standartmäßig= "" da es niergends verändert wird, also müsstest du es wahrscheinlich in Zeile 13 $file[$i-1]=FileRead...

    Dann sind jetzt die gröbstens Fehler, die mir auf die Kürze eingefallen sind

    Also , hab es jez mal geändert:

    [autoit]

    #Include <Array.au3>
    #Include <String.au3>
    #Include <File.au3>

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

    Dim $Log[54] = ["2011-08-03","2011-08-04","2011-08-05","2011-08-06","2011-08-07","2011-08-08","2011-08-09","2011-08-10","2011-08-12","2011-08-13","2011-08-16","2011-08-17","2011-08-18","2011-08-20","2011-08-21","2011-08-23","2011-08-25","2011-08-26","2011-08-27","2011-08-28","2011-08-30",",2011-09-02","2011-09-04","2011-09-10","2011-09-16","2011-09-23","2011-09-25","2011-09-30","2011-10-03","2011-10-05","2011-10-07","2011-10-08","2011-10-10","2011-10-19","2011-10-20","2011-10-29","2011-11-02","2011-11-05","2011-11-10","2011-11-12","2011-11-13","2011-11-20","2011-11-23","2011-11-25","2011-11-27","2011-11-28","2011-11-30","2011-12-05","2011-12-06","2011-12-09","2011-12-10"]
    Dim $File[54]

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

    If Fileexists(@Scriptdir &"\ProBuilder.txt") Then FileDelete (@Scriptdir &"\ProBuilder.txt")

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

    For $i = 1 to 53 Step 1
    If Fileexists(@Scriptdir &"\"&$Log[$i]&".txt") Then
    $FileOpen = FileOpen (@Scriptdir &"\"&$Log[$i]&".txt")
    $File[$i] = FileRead ($FileOpen)
    $ProBuilder = _StringBetween ($File[$i],"(",")")
    FileWrite (@Scriptdir &"\Probuilder.txt",$ProBuilder & @CRLF)
    Endif
    Next

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

    FileClose($FileOpen)

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

    Exit

    [/autoit]

    Funktionieren tut es aber leider immer noch nicht... ,
    diesmal schreibt es nichts in die .txt, btw. wenn ich "(,")" ändere ,
    zu zb. "-","-" eine 0 -,-'

  • Hallo Njahs,

    Zitat

    _StringBetween

    Gibt einen Teilstring zwischen einem angegebenen Start-String und einem Stopp-String zurück
    ...
    Rückgabewert

    Erfolg: Ein 0-basierendes $Array[0] enthält den ersten gefundenen String.
    Fehler: 0

    Quelle: dt. Hilfe du musst also

    [autoit]

    FileWrite (@Scriptdir &"\Probuilder.txt",$ProBuilder & @CRLF)

    [/autoit]

    zu

    [autoit]

    FileWrite (@Scriptdir &"\Probuilder.txt",$ProBuilder[0] & @CRLF)
    FileClose($FileOpen);sollte auch wieder geschlossen werden

    [/autoit]

    abändern

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (17. Dezember 2011 um 01:23)

  • Danke <3 jez funktioniert es einwandfrei!

    Das problem mit dem GuiCtrlCreatePic bleibt aber immer nocht :/

  • GUICtrlCreatePic kann keine PNG's :)

    aber das kann man so umgehen:

    [autoit]


    Func GUICtrlCreatePng($PNG_Extender_hScreen, $PNG_Extender_iX = "", $PNG_Extender_iY = "")

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

    Local $PNG_Extender_hPic = GUICtrlCreatePic("", $PNG_Extender_iY, $PNG_Extender_iX)

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

    _GDIPlus_Startup()
    Local $PNG_Extender_hImage = _GDIPlus_ImageLoadFromFile($PNG_Extender_hScreen)
    Local $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($PNG_Extender_hImage)
    GUICtrlSendMsg($PNG_Extender_hPic, 0x0172, 0, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    _GDIPlus_ImageDispose($PNG_Extender_hImage)
    _GDIPlus_Shutdown()

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

    Return $PNG_Extender_hPic

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

    EndFunc ;==>GUICtrlCreatePng

    [/autoit]


    du benötigst dazu aber den Include!!
    #include <GDIPlus.au3>

    dann einfach das, anstattGUICtrlCreatePIC nehmen ;)
    funktioniert aber nach dem selben prinzip

    GUICtrlCreatePng(<pfadzurDatei>, <X Position>, <Y Position>)
    returnt die Controll ID
    er nimmt automatisch die Bild breite und höhe, mit GUICtrlSetPos() kannste das aber auch ändern :)

  • funktioniert bei mir nicht...

    [autoit]

    $x = GUICtrlCreatePng(@Scriptdir &"\skins\Njahs.png", 150,150)
    Msgbox (0,"",$x)

    [/autoit]

    Gibt mir 0 als rückgabe wieder , und das Bild erscheint auch nicht.

  • Hast du den schon einmal auf deine Festplatte geschaut ob die Datei überhaupt heruntergeladen wird? D>as geht auch mit ener Zeile im Skriptcode:

    [autoit]

    Consolewrite($Skin&".png gefunden" & @crlf)

    [/autoit]

    Wenn ja schau dir das 3. Beispiel zu GUICtrlCreatePic an, das funktioniert. Wenn nein was ich vermute da:

    Zitat

    Die in Amazon S3 gespeicherten Daten sind standardmäßig sicher; nur die Bucket- und Objekt-Besitzer haben Zugang zu ihren selbst erstellen Amazon-S3-Ressourcen.

    das heisst ein nicht angemeldeter User kommt nicht an seine Daten. Solltest du folgendes versuchen:

    Zitat

    Um einen Benutzernamen und Passwort zum Verbinden zu benutzen, schreibt man einfach "Username:Passwort@" vor den Servernamen, z.B. "http://myuser:mypassword@https://autoit.de/www.somesite.com"

    Quelle: dt. Hilfefalls das auch nicht klappt musst du dich in Web-TCP oder HTTP einarbeiten und es mit einem der beiden versuchen,

    mfg autoBert

  • Das komische ist ja: Die datei wird heruntergeladen , unter dem richtigen namen + endung gespeichert (.png)
    Das mit dem 3. Bsp. von GuiCtrlCreatePic ist ja genau das , was Krabat nun auch gemacht hat ,
    klappt aber auch nicht

    *verzweifel ;(

  • Dann nimm das 3. Beispiel aus der Hilfe ersetze dort den Bild-Pfad mit dem Pfad zu deinem Skin.PNG.

    mfg autoBert

    <3 Funktioniert , aber ich will es ja in eine bereit vorhandene GUI zeichnen ,
    an einer bestimmten stelle , nicht eine neue GUI erstellen und dann
    darein , weißt du wie ich's lösen könnte?

  • Hallo Njahs,

    dann setzt du das Beispiel nicht richtig um. Da du aber bis jetzt nur einen Codefetzen zu deinem Problem gepostet hast kann man nicht erkennen wo dein (neuer) Fehler liegt. Poste daher bitte das komplette Skript oder ein lauffähiges Beispiel mit dem geleichen Problem,

    mfg autoBert

  • also, den Code den ich oben gepostet habe, der geht ;)
    vllt. hast du ihn nur falsch umgesetzt

    hier ist mal ein Beispiel:

    [autoit]


    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>

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

    $hGui = GUICreate("", 430, 300)
    GUISetState(@SW_SHOW, $hGui)

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

    $cPic = GUICtrlCreatePng(@ScriptDir & "\bild.png", 5, 5)

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

    GUICtrlSetPos($cPic, 0, 0, 430, 300) ; Bild verschieben und auf ganze GUI größe ziehen

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case Else
    ;
    EndSwitch
    WEnd

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

    Func GUICtrlCreatePng($PNG_Extender_hScreen, $PNG_Extender_iX = "", $PNG_Extender_iY = "")
    Local $PNG_Extender_hPic = GUICtrlCreatePic("", $PNG_Extender_iY, $PNG_Extender_iX)
    _GDIPlus_Startup()
    Local $PNG_Extender_hImage = _GDIPlus_ImageLoadFromFile($PNG_Extender_hScreen)
    Local $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($PNG_Extender_hImage)
    GUICtrlSendMsg($PNG_Extender_hPic, 0x0172, 0, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    _GDIPlus_ImageDispose($PNG_Extender_hImage)
    _GDIPlus_Shutdown()
    Return $PNG_Extender_hPic
    EndFunc ;==>GUICtrlCreatePng

    [/autoit]


    aber das Bild muss halt existieren ;)

    Einmal editiert, zuletzt von Krabat (17. Dezember 2011 um 23:33)

  • @Krabat das bild existiert ja , ich kriege es ja auch in eine neue Gui gezeichnet , doch nicht in die "alte"

    Okay , ich habs es gerade mal mit nur den Graphics & der Funktion von Krabat probiert , funktioniert :huh:
    Ich will meinen script hier nicht sehr gerne hochladen , weil ... öhm ja ,
    weil es halt viel arbeit war und so... Ich hätte wohl ICQ anzubieten: 621327466

  • also, den Code den ich oben gepostet habe, der geht ;)
    vllt. hast du ihn nur falsch umgesetzt

    Stimmt, der funktioniert hab in mal um eine DL-Funktion erweitert:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>

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

    $hGui = GUICreate("", 300, 300)
    $sPicFile = @ScriptDir & "\PeesAvatar.png"

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

    if Not FileExists($sPicFile) Then InetGet("http://autoit.de/wcf/images/avatars/avatar-1701.png",$sPicFile,1,0) ;Datei wird bei Bedarf herunter geladen
    $cPic = GUICtrlCreatePng($sPicFile, 5, 5)

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

    GUICtrlSetPos($cPic, 0, 0, 300, 300) ; Bild verschieben und auf ganze GUI größe ziehen
    GUICtrlSetState($cPic,$GUI_DISABLE)
    $idBtnTest = GUICtrlCreateButton("&Test",10,10,60)
    GUISetState(@SW_SHOW, $hGui)

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $idBtnTest
    MsgBox(0,"Test-Button","erfolgreich gefunden")
    ;
    EndSwitch
    WEnd

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

    Func GUICtrlCreatePng($PNG_Extender_hScreen, $PNG_Extender_iX = "", $PNG_Extender_iY = "")
    Local $PNG_Extender_hPic = GUICtrlCreatePic("", $PNG_Extender_iY, $PNG_Extender_iX)
    _GDIPlus_Startup()
    Local $PNG_Extender_hImage = _GDIPlus_ImageLoadFromFile($PNG_Extender_hScreen)
    Local $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($PNG_Extender_hImage)
    GUICtrlSendMsg($PNG_Extender_hPic, 0x0172, 0, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    _GDIPlus_ImageDispose($PNG_Extender_hImage)
    _GDIPlus_Shutdown()
    Return $PNG_Extender_hPic
    EndFunc ;==>GUICtrlCreatePng

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

    mfg autoBert

  • hat einer von euch 2 vill. ICQ?
    Dann könnte man schauen , wo das problem in
    meinem Script liegt , dass das bild nicht gemalt wird

    Edit:// :o ... Es lag an dem "local" in der funktion vor dem "$PNG_Extender_hPic = GUICtrlCreatePic("", $PNG_Extender_iY, $PNG_Extender_iX)"


    [autoit]

    Func GUICtrlCreatePng($PNG_Extender_hScreen, $PNG_Extender_iX = "", $PNG_Extender_iY = "")
    $PNG_Extender_hPic = GUICtrlCreatePic("", $PNG_Extender_iY, $PNG_Extender_iX)
    _GDIPlus_Startup()
    Local $PNG_Extender_hImage = _GDIPlus_ImageLoadFromFile($PNG_Extender_hScreen)
    Local $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($PNG_Extender_hImage)
    GUICtrlSendMsg($PNG_Extender_hPic, 0x0172, 0, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    _GDIPlus_ImageDispose($PNG_Extender_hImage)
    _GDIPlus_Shutdown()
    Return $PNG_Extender_hPic
    EndFunc ;==>GUICtrlCreatePng

    [/autoit]


    So funktioniert es , danke :P

    Edit2:// Doch nicht :S

    Edit3:// Okay , hatte nach langen Google diese Funktion gefunden , die auch Funktioniert.

    [autoit]

    Func GUICtrlCreatePng($hWnd, $sPath, $iX, $iY)
    _GDIPlus_Startup()
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend, $hGUI
    Local $hImage = _GDIPlus_ImageLoadFromFile($sPath), $iWidth = _GDIPlus_ImageGetWidth($hImage), $iHeight = _GDIPlus_ImageGetHeight($hImage)
    $hGUI = GUICreate("", $iWidth, $iHeight, $iX, $iY, 0x80000000, BitOR(0x40, 0x80000), $hWnd)
    $cLabel = GUICtrlCreateLabel("", 0, 0, $iWidth, $iHeight)
    GuiCtrlSetState (-1 , $GUI_DISABLE)
    GUICtrlSetBkColor(-1, -2)
    GUISetState(@SW_SHOWNOACTIVATE, $hGUI)
    $hScrDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate("int X;int Y")
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $iWidth)
    DllStructSetData($tSize, "Y", $iHeight)
    $tSource = DllStructCreate("int X;int Y")
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate("byte Op;byte Flags;byte Alpha;byte Format")
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", 255)
    DllStructSetData($tBlend, "Format", 1)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
    GUISwitch($hWnd)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    Return SetError(0,$hGUI,$cLabel)
    EndFunc ;==>GUICtrlCreatePng

    [/autoit]

    3 Mal editiert, zuletzt von Njahs (18. Dezember 2011 um 13:53)