1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. De Rand Ere

Beiträge von De Rand Ere

  • Login über Poloniex-API - wo muß ich das " "nonce" POST parameter " einsortieren

    • De Rand Ere
    • 16. Juni 2017 um 13:18

    Hallo zusammen,

    ich hab nun versucht diese Abfrage mit WinHttp nachzubilden.

    Aber irgend wie bin ich zu blöd. Die Funktion _WinHttpAddRequestHeaders läuft nicht sauber durch und gibt mir einen Fehler zurück (@error: 1 - DllCall failed) ;( .

    Könnt ihr euch die paar Zeile mal ansehen und mir vielleicht verraten, wo ich den Fehler mache?

    Spoiler anzeigen
    AutoIt
    #include <Crypt.au3>
    ;~ #include <Date.au3>
    #include <WinHTTP.au3>
    
    
    ; Poloniex-APi-Adresse: https://poloniex.com/tradingApi
    
    
    $tZeit = TimerInit ;Startzeit
    
    
    $key = "2F7CC9ZD-O0LTEC89-EFUNGPZV-9NLGYY9Q"
    $secret = "24663e57c05c19f84d2bfc66486f3a723560df3ced9a24a6cc174281cd2b559c7cbf644e02bc894a79ee87d2a4bf743dff1c54feb5702169223003d8b2bc03c8"
    
    
    $cNonce = Int(TimerDiff($tZeit)) ;enthält den nonce-Wert, muß bei jeder Angfrage erhöht werden
    
    
    $params = "nonce=" & $cNonce & "&command=returnBalances"
    
    
    $sign = hmac($params, $secret)
    
    
    $hSession = _winHttpOpen("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0")
    $hConnect = _WinHttpConnect($hSession, "poloniex.com")
    	ConsoleWrite("$hConnect: " & $hConnect & @CR)
    
    
    $hRequest = _WinHttpOpenRequest($hConnect, "POST")
    	ConsoleWrite("$hRequest: " & $hRequest & @CR)
    	ConsoleWrite("$hRequestERR: " & @error & @CR) ; 0 = i.O
    
    
    $vReturn = _WinHttpAddRequestHeaders($hRequest,"Key=" & $key )
    	ConsoleWrite("$vReturn1: " & $vReturn & @CR) ; Erfolg = 1
    	ConsoleWrite("Headers1: " & @error & @CR) ; sets @error: 1 - DllCall failed
    
    
    $vReturn =_WinHttpAddRequestHeaders($hRequest,"Sign=" & StringLower(Hex($sign)))
    	ConsoleWrite("$vReturn2: " & $vReturn & @CR) ; Erfolg = 1
    	ConsoleWrite("Headers2: " & @error & @CR)
    
    
    $sHtml = _WinHttpSimpleRequest($hConnect, "Post", "/tradingApi", "", $params)
    	ConsoleWrite("SimpleRequest: " & $sHtml & @CR)
    
    
    _WinHTtpCloseHandle($hConnect)
    _WinHTtpCloseHandle($hSession)
    
    
    
    
    Func hmac($message, $key, $hash = "SHA512")
    	Local $blocksize = 128
    	Local $a_opad[$blocksize], $a_ipad[$blocksize]
    	Local Const $oconst = 0x5C, $iconst = 0x36
    	Local $opad = Binary(''), $ipad = Binary('')
    	$key = Binary($key)
    	If BinaryLen($key) > $blocksize Then $key = Call($hash, $key)
    	For $i = 1 To BinaryLen($key)
    		$a_ipad[$i - 1] = Number(BinaryMid($key, $i, 1))
    		$a_opad[$i - 1] = Number(BinaryMid($key, $i, 1))
    	Next
    	For $i = 0 To $blocksize - 1
    		$a_opad[$i] = BitXOR($a_opad[$i], $oconst)
    		$a_ipad[$i] = BitXOR($a_ipad[$i], $iconst)
    	Next
    	For $i = 0 To $blocksize - 1
    		$ipad &= Binary('0x' & Hex($a_ipad[$i], 2))
    		$opad &= Binary('0x' & Hex($a_opad[$i], 2))
    	Next
    	Return Call($hash, $opad & Call($hash, $ipad & Binary($message)))
    EndFunc   ;==>hmac
    
    
    Func SHA512($message)
    	Return _Crypt_HashData($message, 0x0000800e)
    EndFunc   ;==>SHA512
    Alles anzeigen

    Für Hilfe wäre ich dankbar ....

  • Login über Poloniex-API - wo muß ich das " "nonce" POST parameter " einsortieren

    • De Rand Ere
    • 14. Juni 2017 um 04:51

    Morgen alpines,

    das ging mir die Nacht auch durch den Kopf. Das Script kann keiner testen, da ja immer ein Fehler angezeigt wird.

    Hier also das ganze mit den Key's.

    AutoIt
    ; Danke an Pawellek aus dem Forum www.mpcforum.pl, Beitrag https://www.mpcforum.pl/topic/1598344-aplikacja-z-wykorzystaniem-api/
    #include <Crypt.au3>
    #include <Date.au3>
    
    
    Global $tZeit = TimerInit ;Startzeit
    
    
    bitmarket_api()
    
    
    Func bitmarket_api() ;Abfrage Balance
    
    
    	;https://poloniex.com/tradingApi
    	Local $key = "2F7CC9ZD-O0LTEC89-EFUNGPZV-9NLGYY9Q"
    	Local $secret = "24663e57c05c19f84d2bfc66486f3a723560df3ced9a24a6cc174281cd2b559c7cbf644e02bc894a79ee87d2a4bf743dff1c54feb5702169223003d8b2bc03c8"
    
    
    	$cNonce = Int(TimerDiff($tZeit))
    ConsoleWrite($cNonce&@CR)
    	Local $tonce = _DateDiff('s', "1970/01/01 00:00:00", _DateAdd("h", -1, _NowCalc()))
    	Local $params = "?command=returnBalances&"&$cNonce
    
    
    	Local $sign = hmac($params, $secret)
    ConsoleWrite($params&@CR)
    	$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
    	$oHTTP.Open("POST", "https://poloniex.com/tradingApi", False)
    
    
    
    
    	$oHTTP.SetRequestHeader("Key",$key)
    	$oHTTP.SetRequestHeader("Sign",StringLower(Hex($sign)))
    
    
    
    
    	$oHTTP.Send($params)
    
    
    	$oReceived = $oHTTP.ResponseText
    	$oStatusCode = $oHTTP.Status
    ConsoleWrite($oReceived&@CR)
    	If $oStatusCode <> 200 Then
    		MsgBox(4096, "Response code", $oStatusCode)
    	Else
    		MsgBox(0, "ResponseText", $oReceived)
    	EndIf
    EndFunc   ;==>bitmarket_api
    
    
    Func hmac($message, $key, $hash = "SHA512")
    	Local $blocksize = 128
    	Local $a_opad[$blocksize], $a_ipad[$blocksize]
    	Local Const $oconst = 0x5C, $iconst = 0x36
    	Local $opad = Binary(''), $ipad = Binary('')
    	$key = Binary($key)
    	If BinaryLen($key) > $blocksize Then $key = Call($hash, $key)
    	For $i = 1 To BinaryLen($key)
    		$a_ipad[$i - 1] = Number(BinaryMid($key, $i, 1))
    		$a_opad[$i - 1] = Number(BinaryMid($key, $i, 1))
    	Next
    	For $i = 0 To $blocksize - 1
    		$a_opad[$i] = BitXOR($a_opad[$i], $oconst)
    		$a_ipad[$i] = BitXOR($a_ipad[$i], $iconst)
    	Next
    	For $i = 0 To $blocksize - 1
    		$ipad &= Binary('0x' & Hex($a_ipad[$i], 2))
    		$opad &= Binary('0x' & Hex($a_opad[$i], 2))
    	Next
    	Return Call($hash, $opad & Call($hash, $ipad & Binary($message)))
    EndFunc   ;==>hmac
    
    
    Func SHA512($message)
    	Return _Crypt_HashData($message, 0x0000800e)
    EndFunc   ;==>SHA512
    Alles anzeigen
  • Benötige Infomaterial für Anfänger - Bearbeiten von Textdateien

    • De Rand Ere
    • 13. Juni 2017 um 22:48

    autoiter:
    Is ja geil ... so eine ausführliche Erläuterung zu einem Script hab ich noch nie gesehen.
    Ich hoffe sie hilft MotDy2k.... :thumbup:

  • Login über Poloniex-API - wo muß ich das " "nonce" POST parameter " einsortieren

    • De Rand Ere
    • 13. Juni 2017 um 22:26

    Jaaaa ... ich erkenne einen Fehler.
    Wenn "command=" dann muß "nonce" auch ein "=" bekommen ....
    Funtz aber nicht ... kommt immer noch "fehlerhaftes Kommando"

    Ich habe keine Erfahrungen mit WinHttp. Aber bei allem, in den verschiedensten Sprachen, was ich gelesen habe soll das nonce-Parameter an diese Stelle. Allerdings bin ich auf anderen Programmiersprachen nur rudimentär unterwegs. Ich weiß also nicht ob die Position stimmt. ?(

  • Login über Poloniex-API - wo muß ich das " "nonce" POST parameter " einsortieren

    • De Rand Ere
    • 13. Juni 2017 um 21:53

    Hallo zusammen,

    seit gut 14 Tagen suche ich mir in allen möglichen Foren meine Information zusammen
    Das Thema "Bot" ist hier nicht ganz so erwünscht. Aber das ist eine offizielle Schnittstelle von Poloniex und deshalb trage ich mein Problem hier vor.

    Ich bin auch schon weit gekommen. Den Fehler der falschen Keys konnte ich bereits lösen ... Dank einem Post in einem polnischen Forum (da gehts auch um AutoIt - und nein, ich kann kein polnisch ... Dr Google sei Dank).

    Seit 2 Tagen ist aber Stillstand...

    Ich möchte mich bei der API von Poloniex anmelden und eine Abfrage platzieren. Anmeldung funktioniert. Ich bekomme den Fehler "{"error":"Invalid command."}"

    Mein Problem:
    Die Doku der API besagt, daß ich ein ""nonce" POST parameter", ein immer aufwärts zählenden Counter mit geben muß. (https://poloniex.com/support/api/)
    ---------
    All calls to the trading API are sent via HTTP POST to https://poloniex.com/tradingApi and must contain the following headers:

    • Key - Your API key.
    • Sign - The query's POST data signed by your key's "secret" according to the HMAC-SHA512 method.

    Additionally, all queries must include a "nonce" POST parameter. The nonce parameter is an integer which must always be greater than the previous nonce used.
    ------------
    Ich habe nun schon viele viele Varianten getestet .... leider ohne Erfolg. Hier erst mal mein TestModul ... eine einfache Abfrage der Balance.
    Die Key's sind unscharf ...teilweise ge-x-selt. Kann ich aber, wenn nötig reinstellen, da es ein Test-Acc ist. Wird später gelöscht/deaktiviert.

    Spoiler anzeigen


    ; Danke an Pawellek aus dem Forum https://autoit.de/www.mpcforum.pl, Beitrag https://www.mpcforum.pl/topic/1598344-…rzystaniem-api/
    #include <Crypt.au3>
    #include <Date.au3>


    Global $tZeit = TimerInit ;Startzeit


    bitmarket_api()


    Func bitmarket_api() ;Abfrage Balance


    ;https://poloniex.com/tradingApi
    Local $key = "2F7CC9ZD-O0LTEC89-xxxxxxxx-9NLGYY9Q"
    Local $secret = "24663e57c05c19f84d2bfc66486f3a723560df3cexxxxxxxx74281cd2b559c7cbf644e02bc894a79ee87d2a4bf743dff1c54feb5702169223003d8b2bc03c8"


    $cNonce = Int(TimerDiff($tZeit)*1000)
    ConsoleWrite($cNonce&@CR)
    Local $tonce = _DateDiff('s', "1970/01/01 00:00:00", _DateAdd("h", -1, _NowCalc()))
    Local $params = "command=returnBalances&nonce"&$cNonce


    Local $sign = hmac($params, $secret)
    ;~ ConsoleWrite($sign&@CR)
    $oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
    $oHTTP.Open("POST", "https://poloniex.com/tradingApi", False)


    $oHTTP.SetRequestHeader("Key",$key)
    $oHTTP.SetRequestHeader("Sign",StringLower(Hex($sign)))


    $oHTTP.Send($params)


    $oReceived = $oHTTP.ResponseText
    $oStatusCode = $oHTTP.Status
    ConsoleWrite($oReceived&@CR)
    If $oStatusCode <> 200 Then
    MsgBox(4096, "Response code", $oStatusCode)
    Else
    MsgBox(0, "ResponseText", $oReceived)
    EndIf
    EndFunc ;==>bitmarket_api


    Func hmac($message, $key, $hash = "SHA512")
    Local $blocksize = 128
    Local $a_opad[$blocksize], $a_ipad[$blocksize]
    Local Const $oconst = 0x5C, $iconst = 0x36
    Local $opad = Binary(''), $ipad = Binary('')
    $key = Binary($key)
    If BinaryLen($key) > $blocksize Then $key = Call($hash, $key)
    For $i = 1 To BinaryLen($key)
    $a_ipad[$i - 1] = Number(BinaryMid($key, $i, 1))
    $a_opad[$i - 1] = Number(BinaryMid($key, $i, 1))
    Next
    For $i = 0 To $blocksize - 1
    $a_opad[$i] = BitXOR($a_opad[$i], $oconst)
    $a_ipad[$i] = BitXOR($a_ipad[$i], $iconst)
    Next
    For $i = 0 To $blocksize - 1
    $ipad &= Binary('0x' & Hex($a_ipad[$i], 2))
    $opad &= Binary('0x' & Hex($a_opad[$i], 2))
    Next
    Return Call($hash, $opad & Call($hash, $ipad & Binary($message)))
    EndFunc ;==>hmac


    Func SHA512($message)
    Return _Crypt_HashData($message, 0x0000800e)
    EndFunc ;==>SHA512

    Nicht sehr sauber zusammengestellt, es geht mir auch nur drum zu begreifen, wie das funktioniert.
    Ich hab noch nie mit "Objecten" gearbeitet. Da tu ich mich noch schwer ... aber es wird.

    Könnt ihr mir bitte erlären an welcher Stelle im "Post"-Befehl die "nonce"-Information eingebaut werden muß?

    Vorab vielen Dank

  • FTP - Verbindung als Laufwerk mappen

    • De Rand Ere
    • 25. März 2015 um 23:59

    PS:
    Nach ca. einer Stunde sieht das dann so aus...

    Spoiler anzeigen


    WebSeite.de/logs/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../pub/.././ext/../../usage/

  • FTP - Verbindung als Laufwerk mappen

    • De Rand Ere
    • 25. März 2015 um 22:47

    Ja, hab ich gestestet und folgende "Erscheinung" registriert...

    Console zu Beginn:

    Spoiler anzeigen


    WebSeite.de/logs/./
    WebSeite.de/logs/../
    WebSeite.de/logs/access_log_2014-09-19.gz
    WebSeite.de/logs/access_log_2014-09-23.gz
    WebSeite.de/logs/access_log_2014-09-24.gz
    WebSeite.de/logs/access_log_2014-09-25.gz
    WebSeite.de/logs/access_log_2014-09-29.gz
    WebSeite.de/logs/access_log_2014-09-30.gz
    WebSeite.de/logs/access_log_2014-10-02.gz
    WebSeite.de/logs/access_log_2014-10-06.gz
    WebSeite.de/logs/access_log_2014-10-07.gz
    WebSeite.de/logs/access_log_2014-10-08.gz
    WebSeite.de/logs/access_log_2014-10-09.gz
    WebSeite.de/logs/access_log_2014-10-11.gz
    WebSeite.de/logs/access_log_2014-10-13.gz
    WebSeite.de/logs/access_log_2014-10-14.gz
    WebSeite.de/logs/access_log_2014-10-15.gz
    WebSeite.de/logs/access_log_2014-10-27.gz
    WebSeite.de/logs/access_log_2014-10-28.gz
    WebSeite.de/logs/access_log_2014-10-30.gz
    WebSeite.de/logs/access_log_2014-11-04.gz
    WebSeite.de/logs/access_log_2014-11-05.gz
    WebSeite.de/logs/access_log_2014-11-06.gz
    WebSeite.de/logs/access_log_2014-11-07.gz
    WebSeite.de/logs/access_log_2014-11-10.gz
    WebSeite.de/logs/access_log_2014-11-11.gz
    WebSeite.de/logs/access_log_2014-11-13.gz
    WebSeite.de/logs/access_log_2014-11-17.gz
    WebSeite.de/logs/access_log_2014-11-18.gz
    WebSeite.de/logs/access_log_2014-11-20.gz
    WebSeite.de/logs/access_log_2014-11-24.gz
    WebSeite.de/logs/access_log_2014-11-26.gz
    WebSeite.de/logs/access_log_2014-12-01.gz
    WebSeite.de/logs/access_log_2014-12-03.gz
    WebSeite.de/logs/access_log_2014-12-08.gz
    WebSeite.de/logs/access_log_2014-12-11.gz
    WebSeite.de/logs/access_log_2014-12-13.gz
    WebSeite.de/logs/access_log_2014-12-16.gz
    WebSeite.de/logs/access_log_2014-12-18.gz
    WebSeite.de/logs/access_log_2014-12-19.gz
    WebSeite.de/logs/access_log_2014-12-21.gz
    WebSeite.de/logs/access_log_2014-12-22.gz
    WebSeite.de/logs/access_log_2014-12-25.gz
    WebSeite.de/logs/access_log_2014-12-29.gz
    WebSeite.de/logs/access_log_2015-01-06.gz
    WebSeite.de/logs/access_log_2015-01-12.gz
    WebSeite.de/logs/access_log_2015-01-13.gz
    WebSeite.de/logs/access_log_2015-01-14.gz
    WebSeite.de/logs/access_log_2015-01-19.gz
    WebSeite.de/logs/access_log_2015-01-20.gz

    Das sieht ganz normal aus.
    Aber dann verlässt das Script den Ordner /logs/...

    Spoiler anzeigen


    WebSeite.de/logs/.././
    WebSeite.de/logs/../../
    WebSeite.de/logs/../.htaccess
    WebSeite.de/logs/../GPL-LICENSE.txt
    WebSeite.de/logs/../GPL-LIZENZUEBERSETZUNG.txt
    WebSeite.de/logs/../GProtector/
    WebSeite.de/logs/../cache/
    WebSeite.de/logs/../callback/
    WebSeite.de/logs/../checkout_billsafe.php
    WebSeite.de/logs/../checkout_confirmation.php
    WebSeite.de/logs/../checkout_ipayment.php
    WebSeite.de/logs/../checkout_masterpayment.php
    WebSeite.de/logs/../checkout_payment.php

    Und etwas später kommt dann scheinbar der Punkt, an dem sich das Script totläuft...

    Spoiler anzeigen


    WebSeite.de/logs/../version_info/../cache/
    WebSeite.de/logs/../version_info/../callback/
    WebSeite.de/logs/../version_info/../checkout_billsafe.php
    WebSeite.de/logs/../version_info/../checkout_confirmation.php
    WebSeite.de/logs/../version_info/../checkout_ipayment.php
    WebSeite.de/logs/../version_info/../checkout_masterpayment.php
    WebSeite.de/logs/../version_info/../checkout_payment.php

    WebSeite.de/logs/../version_info/../version_info/../cache/
    WebSeite.de/logs/../version_info/../version_info/../callback/
    WebSeite.de/logs/../version_info/../version_info/../checkout_billsafe.php
    WebSeite.de/logs/../version_info/../version_info/../checkout_confirmation.php
    WebSeite.de/logs/../version_info/../version_info/../checkout_ipayment.php
    WebSeite.de/logs/../version_info/../version_info/../checkout_masterpayment.php
    WebSeite.de/logs/../version_info/../version_info/../checkout_payment.php

    Das ist natürlich nur ein Auszug aus der Auflistung. Aber der Teilname "/version_info/.." wird immer wieder neu dazu eingetragen somit, daß der Dateiname "unendlich" wird.

    Leider kann ich Dein Script nicht ganz nachvollziehen. Mit den "BitAnd" komm ich nicht klar.

    Wenn ich z.B. über den Totalcommander eine FTP-Verbindung aufbaue und mir die Datenstruktur ansehe, dann gibt es kein "version_info"-Verzeichnis.
    Eigenartig ist auch, daß mir der Totalcommander im Verzeichnis "/logs/" 14 Datein anzeigt. Mit _FTP_FindFirst und _FTP_FindNext finde ich aber ca. 110 Dateien. Kann ich nicht nachvollziehen.

  • FTP - Verbindung als Laufwerk mappen

    • De Rand Ere
    • 25. März 2015 um 15:23

    Hallo AspirinJunkie,
    vielen Dank für Deine Antwort. Die Funktion kannte ich nicht. Habs auch gleich mal getestet. Komm aber mit der Pfadangabe nicht klar. Entweder gibt es Null Einträge im Array oder das Script verschwindet im Nirvana und wird nie fertig.

    Mein TestScript:

    Spoiler anzeigen


    #include <ftpEx.au3>
    #include <array.au3>

    $server = 'ftp.website.de'
    $username = 'U12345678'
    $pass = 'P123456789'

    ;~ $hFTP = _FTP_Open('FTP_open')
    ;~ $hFTPCon = _FTP_Connect($hFTP, $server, $username, $pass)

    $hFTP = _FTP_Open("BackUp")

    $hFTP_Sitzung = _FTP_Connect($hFTP,$server,$username,$pass)

    $vDir = _FTP_DirGetCurrent($hFTP_Sitzung) ; nur zum Test, ob FTP-Verbindung läuft
    MsgBox(1,"Test FTP", "Test Dir: "&$vDir)

    $aFileList = _FTP_FileList($hFTP_Sitzung, '/logs/')
    _ArrayDisplay($aFileList)

    _FTP_Close($hFTP_Sitzung)
    _FTP_Close($hFTP)

    Exit

    ;Deine Funktion folgt.....

  • FTP - Verbindung als Laufwerk mappen

    • De Rand Ere
    • 24. März 2015 um 12:47

    Hallo zusammen,

    ich möchte über eine FTP-Verbindung eine komplette Datensicherung von einer WEB-Seite machen. Dabei möchte ich einige Verzeichnisse (Cache) ausschließen. Da ich zur Auflistung der rund 10.000 Dateien "_FileListRekursiv" nutzen möchte ist es notwendig die FTP-Verbindung als Laufwerk zu Mappen. Der Aufbau der Verbindung ist kein Problem. Aber am Mappen häng ich nun schon zwei Tage. Hab hier im Forum gesucht aber nix zum Thema gefunden. Kann mir jemand von Euch helfen ??? Bin für jeden Gedankenanstoß dankbar...

    Gruß De Rand Ere

  • Grafik speichern - nur schwarzes Bild oder gar kein Ergebnis

    • De Rand Ere
    • 12. April 2014 um 15:39

    Na das is ja ein Ding ! Ich hatte mich schon über die GDI+-Funktion "SetPixel" gewundert ... ist aber noch vorstellbar. Aber "CreatBitmapFromScan0" kenn ich gar nicht. Ich suche immer in der Hilfe nach einer passenden Funktion ... da sind beide nicht beschrieben. Ich hab sie nun gefunden - in der au3 direkt. Das schau ich mir an. Danke für den Tip. Aber was soll die "CreatBitmapFromScan0" machen bzw. welches Fenster wird da gescannt ? Man könnte vermuten: das aktive...

    Die GUIBox.au3 in meiner Anwendung ist eine Variante des "Gummibandes" bzw. Rubberbanding - flexibles Rechteck -> Enddaten werden zur Neuberechnung der Koordinaten verwendet.

    Vorerst Danke...

  • Grafik speichern - nur schwarzes Bild oder gar kein Ergebnis

    • De Rand Ere
    • 11. April 2014 um 19:31

    UEZ

    Vielen Dank für Deine Mühe...
    Werde Deinen Vorschlag in den nächsten Tagen testen.

    Die GUIBox.au3 habe ich verwendet um nach der Berechnung ein Teil der Grafik zu markieren und dann in voller Größe neu zuberechnen.

    Erstmal vielen Dank und ein schönes WE

  • Grafik speichern - nur schwarzes Bild oder gar kein Ergebnis

    • De Rand Ere
    • 11. April 2014 um 14:46

    Mein Script ist nicht besonders sauber - sind noch viele Baustellen drin. Aber es läuft.


    Hier also das Script:

    Spoiler anzeigen
    [autoit]


    #include-once
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <ProgressConstants.au3>
    #include <ButtonConstants.au3>
    #include <GdiPlus.au3>
    #Include <Array.au3>
    #include <EditConstants.au3>

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

    #include <_GUIBox.au3>
    #include <Misc.au3>

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

    ;------------------------------------------------------------
    Global $vXs,$vXe,$vYs,$vYe,$vSpalte,$vZeile,$vStarX,$vEndX,$vStarY,$vEndY,$vDurchlauf,$vMaxDurchlauf,$vBereichX,$vBereichY,$vmI,$vmD
    Global $vBreiteGrafik, $vHoeheGrafik, $vStartGrafikX, $vStartGrafikY, $vSteppX, $vSteppY
    Global $Ratio1, $Ratio2, $Ratio3, $aMPos[4],$vRatio
    Global $vDisplayBreite, $vDisplayHoehe

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

    Global $nMsg,$hGraphic,$hPinsel,$vInteration,$aFarben[0],$vFarbanzahl,$vStop,$hBitmap,$hBuffer,$vStepp,$hKopie,$dc

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

    $user32 = DllOpen("user32.dll")
    $gdi32 = DllOpen("gdi32.dll")

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

    $vDisplayBreite=@DesktopWidth-20;
    $vDisplayHoehe=@DesktopHeight-20;
    $vStartGrafikX=10
    $vStartGrafikY=10

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

    $hWBild = GUICreate("Fraktal",$vDisplayBreite,$vDisplayHoehe-20, -1, 0)
    $dc = GetDC(WinGetHandle($hWBild))
    $hWDaten=GUICreate("FFP - Datenfenster",$vDisplayBreite,150,-1,@DesktopHeight-170,-1,-1,$hWBild)

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

    ; Eingabe der Eckdaten zur Berechnung
    GUICtrlCreateGroup("Werte für die X - und Y - Achse",5,4,236,113)
    GUICtrlCreateLabel("Startwert:",37,19)
    GUICtrlCreateLabel("Endwert:",140,19)
    GUICtrlCreateLabel("X:",12,39)
    $vStartX=GUICtrlCreateInput("-2.50", 28, 35, 100, 20)
    $vEndX=GUICtrlCreateInput("+1.00", 131, 35, 100, 20)
    GUICtrlCreateLabel("Y:",13,61)
    $vStartY=GUICtrlCreateInput("-1.40", 28, 58, 100, 20)
    $vEndY=GUICtrlCreateInput("+1.40", 131, 58, 100, 20)
    $lBreiteX_Achse=GUICtrlCreateLabel("Wert X-Achse: ",12,81,200,12)
    $lBreiteY_Achse=GUICtrlCreateLabel("Wert Y-Achse: ",12,97,200,12)
    GUICtrlCreateGroup("", -99, -99, 1, 1) ; Gruppe schliessen
    ; Eingabe der Eckdaten zur Berechnung
    GUICtrlCreateGroup("",250,4,180,62)
    GUICtrlCreateLabel("max. Durchläufe:",275,19)
    $vMaxDurchlauf=GUICtrlCreateInput("100", 360, 17, 60, 20)
    GUICtrlCreateLabel("Höchstwert Iteration:",259,41)
    $vMaxIteration=GUICtrlCreateInput("1000", 360, 39, 60, 20)
    GUICtrlCreateGroup("", -99, -99, 1, 1) ; Gruppe schliessen
    GUICtrlCreateGroup("Farbraster",250,70,180,39)
    GUICtrlCreateLabel("Faktor:",296,85)
    $vZoom=GUICtrlCreateInput("23", 360, 83, 60, 20)
    $updown = GUICtrlCreateUpdown($vZoom)
    GUICtrlCreateGroup("", -99, -99, 1, 1) ; Gruppe schliessen
    ; Gruppe Grafikgröße in Pixel
    GUICtrlCreateGroup("Grafikgröße - waagerecht x senkrecht",440,4,200,62)
    $vInputBeiteGrafik=GUICtrlCreateInput($vDisplayBreite, 470, 30, 60, 20) ;$vDisplayBreite
    $vBeiteGrafikTMP=GUICtrlCreateUpdown($vInputBeiteGrafik)
    GUICtrlCreateLabel("X",537,31)
    $vInputHoeheGrafik=GUICtrlCreateInput($vDisplayHoehe, 550, 30, 60, 20)
    $vHoeheGrafikTMP=GUICtrlCreateUpdown($vInputHoeheGrafik)
    GUICtrlCreateGroup("", -99, -99, 1, 1) ; Gruppe schliessen
    ; Gruppe Seitenverhältnis
    GUICtrlCreateGroup("Seitenverhältnis der Grafik",440,70,200,39)
    $bRatio1 = GUICtrlCreateRadio("4 : 3", 450, 85, 50, 20) ; = 0.75 oder 1.33333
    $bRatio2 = GUICtrlCreateRadio("16 : 9", 520, 85, 50, 20) ; = 0.5625 oder 1.777778
    $bRatio3 = GUICtrlCreateRadio("ohne", 590, 85, 45, 20)
    GUICtrlSetState($bRatio3, $GUI_CHECKED)
    GUICtrlCreateGroup("", -99, -99, 1, 1) ; Gruppe schliessen
    ; ----------------------------------------------------------------------------
    GUICtrlCreateGroup("Auswahl der Farbpalette",650,4,130,105)
    $bPalette1 = GUICtrlCreateRadio("Farbpalette 1", 670, 30, 100, 20)
    $bPalette2 = GUICtrlCreateRadio("Farbpalette 2", 670, 52, 100, 20)
    $bPalette3 = GUICtrlCreateRadio("Farbpalette 3", 670, 74, 100, 20)
    GUICtrlSetState($bPalette1, $GUI_CHECKED)
    GUICtrlCreateGroup("", -99, -99, 1, 1) ; Gruppe schliessen
    ; Gruppe Prozessbar
    $vGruppeProzess=GUICtrlCreateGroup("Fortschritt",$vDisplayBreite-220,79,210,30)
    $vProgressbar = GUICtrlCreateProgress($vDisplayBreite-216, 92, 200, 10, $PBS_SMOOTH)
    GUICtrlSetColor(-1, 32250)
    GUICtrlCreateGroup("", -99, -99, 1, 1) ; Gruppe schliessen
    ; ------------------------------ Fußzeile ---------------------------------------------------

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

    ;----------------------------------------------------------------
    $bFoto=GUICtrlCreateButton("Bild speichern",$vDisplayBreite-220,8,100,20)
    $bStart=GUICtrlCreateButton("Start",$vDisplayBreite-110,35,100,40,$BS_DEFPUSHBUTTON)
    $bAbbrechen=GUICtrlCreateButton("Beenden",$vDisplayBreite-220,35,100,40)
    GUISetState(@SW_SHOW,$hWBild)
    WinActivate("Fraktal")
    GUISetBkColor(0X000000)
    GUISetState(@SW_SHOW,$hWDaten)

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

    GUISwitch($hWDaten)

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

    While 1
    ;~ $nMsg=GUIGetMsg()
    $aMsg = GUIGetMsg(1)
    If $aMsg[1]=$hWBild Then
    Switch $aMsg[0]
    Case $GUI_EVENT_PRIMARYDOWN
    $aRubberGBox=_GBoxCreate("",2,0xFF0000)
    $aMPos[0]=MouseGetPos(0)
    $aMPos[1]=MouseGetPos(1)
    while _IsPressed("01",$user32)
    $aMPos[2]=MouseGetPos(0)
    $aMPos[3]=MouseGetPos(1)
    ;~ MsgBox(0,"$vRatio",$vRatio)
    ;~ $aMPos[3]=$aMPos[1]+($aMPos[2]-$aMPos[0])*0.75

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

    ;~ $vRatioTMP=($aMPos[2]-$aMPos[0])*$vRatio
    ;~ ToolTip("Position: "&$aMPos[0]&"x"&$aMPos[1]&" - - "&$aMPos[2]&"x"&$aMPos[3]&" R: "&$vRatio)
    _GBoxShowAt($aRubberGBox,$aMPos[0],$aMPos[1],$aMPos[2],$aMPos[3])
    Sleep(10)
    WEnd
    KoordinatenNeu()
    _GBoxDestroy($aRubberGBox)
    EndSwitch
    ElseIf $aMsg[1]=$hWDaten Then
    Switch $aMsg[0]
    Case $bFoto
    Fraktal_speichern()
    Case $bStart ;46
    Start()
    Case $bAbbrechen
    Abbrechen()
    Case $bRatio1
    $vRatio=Verhaeltniss(1)
    Case $bRatio2
    $vRatio=Verhaeltniss(2)
    Case $bRatio3
    $vRatio=Verhaeltniss(3)
    EndSwitch
    EndIf
    WEnd

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

    ; ---------------------------------------------------------------------------------------------------------------------------------------------------------------
    Func Start()
    EingabeAuslesen()
    GUICtrlSetData($bStart,"STOP")
    GUICtrlSetBkColor($bStart,0x777777)
    GUICtrlSetData($lBreiteX_Achse,"Wert X-Achse: "&StringFormat("%.18f",$vBereichX))
    GUICtrlSetData($lBreiteY_Achse,"Wert Y-Achse: "&StringFormat("%.18f",$vBereichY))
    GUISetState(@SW_SHOW,$hWBild)
    WinActivate("Fraktal")
    GUISetBkColor(0X000000)
    GUISetState(@SW_SHOW,$hWDaten)

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

    FarbTab_anlegen($vStepp)
    HotKeySet("{ESC}","CheckMaus")
    WinSetTitle($hWDaten,"","FFP - Datenfenster - - - 'ESC' stopt die Berechnung")
    Modul1()
    EndFunc

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

    Func KoordinatenNeu()
    GUICtrlSetData($vStartX, $vXs+$vSteppX*($aMPos[0]-20))
    GUICtrlSetData($vEndX,$vXs+$vSteppX*($aMPos[2]-20))
    GUICtrlSetData($vStartY, $vYs+$vSteppY*($aMPos[1]-35))
    GUICtrlSetData($vEndY,$vYs+$vSteppY*($aMPos[3]-35))
    EndFunc

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

    Func Modul1() ;Formel Apfelbrot original

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

    $vBeginn=TimerInit()
    $vStop=0
    $vYi=$vYs
    ;~ MsgBox(0,"","Breite von "&$vStartGrafikX&" - "&$vBreiteGrafik+$vStartGrafikX)
    For $vZeile=$vStartGrafikY to $vHoeheGrafik ; Pixel auf Y-Achse durchtackern
    GUICtrlSetData($vProgressbar, $vZeile*100/($vHoeheGrafik))
    GUICtrlSetData($vGruppeProzess,"Berechnet: "&StringFormat("%.2f",$vZeile*100/($vHoeheGrafik))&"%")
    $vYi=$vYi+$vSteppY
    $vXi=$vXs
    For $vSpalte=$vStartGrafikX to $vBreiteGrafik ; Pixel auf der X-Achse
    $vXi=$vXi+$vSteppX
    ;Berechnung des Fraktals
    $vDurchlauf=0
    $vInteration=0
    $vXt=0
    $vYt=0
    $vP=0
    While $vP=0
    $vX_tmp=$vXt*$vXt-$vYt*$vYt+$vXi
    $vYt=2*$vXt*$vYt+$vYi
    $vXt=$vX_tmp
    $vDurchlauf+=1
    ;~ $vInteration=$vXt*$vXt+$vYt*$vYt
    If ($vXt*$vXt+$vYt*$vYt)>$vmI Or $vDurchlauf>$vmD Then ExitLoop
    WEnd
    setPixel($dc,$vSpalte,$vZeile,Farbwert($vDurchlauf,$vmD)) ; DLL Funktion
    if $vStop=1 Then
    $vSpalte=$vBreiteGrafik+$vStartGrafikX
    $vZeile=$vHoeheGrafik+$vStartGrafikY
    EndIf
    Next
    Next
    Fraktal_speichern()
    GUICtrlSetData($bStart,"Start")
    ;~ MsgBox(0,"Rechenzeit","Dauer: "&Minute(timerdiff($vBeginn)))
    EndFunc

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

    Func CheckMaus()
    ;~ Opt("GUIOnEventMode",0)
    $vStop=1
    WinSetTitle($hWDaten,"","FFP - Datenfenster - - - Mit 'ESC' Berechnung gestoppt !")
    GUICtrlSetData($bStart,"Start")
    EndFunc

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

    Func Fraktal_speichern()
    _GDIPlus_Startup() ;Gdi starten
    $hGraphic = _GDIPlus_GraphicsCreateFromHDC ($dc)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($vBreiteGrafik,$vHoeheGrafik,$hGraphic) ;Buffer ertsellen 1. Teil
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; Buffer erstellen 2. Teil
    $hKopie = _GDIPlus_BitmapCloneArea($hGraphic,20,35,200,200)
    ;~ MsgBox(0,"Kopie",$hKopie)
    DirCreate(@ScriptDir&"\Bilder")

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

    ;~ $vNr=0
    ;~ $vI=0
    ;~ While $vI=0
    ;~ if FileExists(@ScriptDir&"\Bilder\Test"&$vNr&".tiff") Then
    ;~ $vNr=$vNr+1
    ;~ Else
    ;~ $vDateiName=@ScriptDir&"\Bilder\Test"&$vNr&".tiff"
    ;~ $vI=1
    ;~ EndIf
    ;~ WEnd
    $vDateiName=@ScriptDir&"\Bilder\Test_1.jpg"
    ConsoleWrite($vDateiName)
    $sCLSID=_GDIPlus_EncodersGetCLSID("JPG")
    If _GDIPlus_ImageSaveToFile($hKopie,$vDateiName)Then ;Test: _"&@YEAR&@MON&@MDAY&"-"&@HOUR&":"&@MIN&":"&@SEC&"
    MsgBox(0,"Speichern ....","Bild wurde erfolgreich gespeichert !!! "&@error,3)
    Else
    MsgBox(0,"Error",@error)
    EndIf
    EndFunc

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

    Func Farbwert($vDurchlauf,$vmD)
    ;~ ConsoleWrite ("Farbe: "&$vColor&" - ")
    if $vDurchlauf>$vmD Then
    $vColor=0x000000
    Else
    $vColor="0x"&$aFarben[int(Int($vDurchlauf*100/$vmD)*($vFarbanzahl-1)/100)]
    EndIf
    Return $vColor
    EndFunc

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

    Func FarbTab_anlegen($vStepp)
    Switch $vStepp
    Case 1,2,4,8,16,32,64,128
    $vFarbanzahl=Int(256/$vStepp)^3
    Case Else
    $vFarbanzahl=Int(256/$vStepp+1)^3
    EndSwitch
    ToolTip("Generiere Farbtabelle mit "&$vFarbanzahl&"Farben")
    Dim $aFarben[$vFarbanzahl]
    ;~ ConsoleWrite("Array-Farbzahl: "&$vFarbanzahl&@CR&@CR)
    $vNr=0
    For $vR=0 To 255 Step $vStepp
    For $vG=0 To 255 Step $vStepp
    For $vB=0 To 255 Step $vStepp
    $aFarben[$vNr]=Hex($vR,2)&Hex($vG,2)&Hex($vB,2)
    $vNr+=1
    Next
    Next
    Next
    ToolTip("")
    ;~ _ArrayDisplay($aFarben)
    EndFunc

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

    Func Abbrechen()
    ;~ _GDIPlus_BrushDispose($hPinsel)
    ;~ _GDIPlus_PenDispose($hPinsel)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hKopie)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_Shutdown()
    DllClose($user32)
    DllClose($gdi32)
    Exit
    EndFunc

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

    Func Verhaeltniss($vRatio)
    Select
    Case $vRatio=1
    GUICtrlSetStyle($vInputHoeheGrafik,$ES_READONLY)
    GUICtrlSetData($vInputHoeheGrafik,int(StringReplace(GUICtrlRead($vInputBeiteGrafik),".","")/4*3))
    $vRatio=1/4*3
    Case $vRatio=2
    GUICtrlSetStyle($vInputHoeheGrafik,$ES_READONLY)
    GUICtrlSetData($vInputHoeheGrafik,int(StringReplace(GUICtrlRead($vInputBeiteGrafik),".","")/16*9))
    $vRatio=1/16*9
    ; Code folgt noch
    Case $vRatio=3
    GUICtrlSetStyle($vInputHoeheGrafik,$GUI_SS_DEFAULT_INPUT)
    $vRatio=1/GUICtrlRead($vInputBeiteGrafik)*GUICtrlRead($vInputHoeheGrafik)
    EndSelect
    ;~
    Return $vRatio
    EndFunc

    Func EingabeAuslesen()
    $vXs=GUICtrlRead($vStartX) ;Startwert für X
    $vXe=GUICtrlRead($vEndX) ;Endwert für X
    $vYs=GUICtrlRead($vStartY) ;Startwert für Y
    $vYe=GUICtrlRead($vEndY) ;Endwert für Y
    $vmD=GUICtrlRead($vMaxDurchlauf) ;maxAnzahl der Dürchläufe
    $vmI=GUICtrlRead($vMaxIteration) ;MaxWert Iteration
    $vStepp=GUICtrlRead($vZoom) ;Farbfaktor auslesen
    $vBreiteGrafik=GUICtrlRead($vInputBeiteGrafik) ; Grafikbreite auslesen
    $vHoeheGrafik=GUICtrlRead($vInputHoeheGrafik) ;Grafikhöhe auslesen
    $vPalette1=BitAND(GUICtrlRead($bPalette1), $GUI_CHECKED) ;Wleche Palette ist aktiv
    $vPalette2=BitAND(GUICtrlRead($bPalette2), $GUI_CHECKED)
    $vPalette3=BitAND(GUICtrlRead($bPalette3), $GUI_CHECKED)
    ; Wertebereich ermitteln
    If $vXs<0 and $vXe<0 Then $vBereichX=($vXs+$vXe*-1)*-1
    If $vXs<0 and $vXe>0 Then $vBereichX=$vXs*-1+$vXe
    If $vXs>0 and $vXe>0 Then $vBereichX=$vXe-$vXs
    If $vYs<0 and $vYe<0 Then $vBereichY=($vYs+$vYe*-1)*-1
    If $vYs<0 and $vYe>0 Then $vBereichY=$vYs*-1+$vYe
    If $vYs>0 and $vYe>0 Then $vBereichY=$vYe-$vYs
    $vSteppX=$vBereichX/$vBreiteGrafik ;Schritweite für X errechnen
    $vSteppY=$vBereichY/$vHoeheGrafik ;Schritweite für Y errechnen
    EndFunc

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

    Func setpixel($dc, $x, $y, $color) ;pixel mit farbe an koordinaten setzen
    DllCall($gdi32, "long", "SetPixel", "long", $dc, "long", $x, "long", $y, "long", $color)
    EndFunc ;==>pix

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

    Func GetDC($handle)
    $dc = DllCall($user32, "int", "GetDC", "hwnd", $handle)
    Return $dc[0]
    EndFunc ;==>GetDC

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

    Func Minute($zLZ)
    $tM=-1
    $th=-1
    $zLZ=int($zLZ/1000)
    for $tI=$zLZ to 0 step -60 ;Minuten ausrechnen
    $tM+=1
    Next
    If $tM>59 Then
    for $tI=$tM to 0 step -60 ;Stunden ausrechnen
    $th+=1
    Next
    EndIf
    If $tM<1 Then
    $zLZ=$zLZ&" Sekunden"
    ElseIf $tM>=1 And $th<1 Then
    $zLZ=$tM&"."&StringFormat("%02s",$zLZ-$tM*60)&" Minuten"
    ElseIf $tM>=1 And $th>=1 Then
    $zLZ=$th&"."&$tM-$th*60&"."&StringFormat("%02s",$zLZ-$tM*60)&" Stunden"
    EndIf
    Return $zLZ
    EndFunc

    [/autoit]
  • Grafik speichern - nur schwarzes Bild oder gar kein Ergebnis

    • De Rand Ere
    • 11. April 2014 um 12:49

    Hallo zusammen,

    ich schreibe an einem Programm zur Fraktalberechnung. (ich weiß davon gibts schon tausende ... ist auch eher zur Schulung und zum experimentieren). Die Berechnung klapp inzwischen ganz gut. Zum Setzen der einzelnen Pixel nutze ich die SetPixel-Funktion der user32.dll, das sie schneller ist als die GDI+ -Funktion (GraphicsFillRect). Ist die Berechnung des Fraktals abgeschlossen soll die erzeugte Grafik gespeichert werden. Dazu nutze ich wiederum GDI+, da ich in der user32.dll nix passendes gefunden habe. Ich wandle also meine Grafik in ein Bitmap um. Da die Größe der Grafik veränderlich ist, ist die letzte Funtion "BitmapCloneArea". Damit soll die Grafik ohne Rand ausgeschnitten werden um sie dann zu speichern. Und hier liegt mein Problem: entweder wird garnichts gespeichert oder nur der schwarze Hintergrund.

    Ich habe das Script auf die wesentlichen Befehlszeilen gekürzt. Der Rest läuft ja.

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Fraktalberechnung
    ; Scriptauszug - nicht lauffähig

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

    #include-once
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <ProgressConstants.au3>
    #include <ButtonConstants.au3>
    #include <GdiPlus.au3>
    #Include <Array.au3>
    #include <EditConstants.au3>

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

    #include <_GUIBox.au3>
    #include <Misc.au3>

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

    ;---------------------------------------------------------------------------------------------------------------------

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

    $hWBild = GUICreate("Fraktal",$vDisplayBreite,$vDisplayHoehe, -1, 0) ; erstellt das Grafikfesnter
    $dc = GetDC(WinGetHandle($hWBild)) ; ermittelt den Gerätekontext der Grafikfensters
    $hWDaten=GUICreate("Datenfenster",$vDisplayBreite,150,-1,@DesktopHeight-170,-1,-1,$hWBild) ;erstellt das datenfenster

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

    While 1 ; Warteschleife für die verschiedenen Funktionen vor und nach der Berechnung - eher uninteressant
    ;~ $nMsg=GUIGetMsg()
    $aMsg = GUIGetMsg(1)

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

    If $aMsg[1]=$hWBild Then
    Switch $aMsg[0]
    Case $GUI_EVENT_PRIMARYDOWN ; Rechteck zeichnen
    $aMPos=MouseGetPos()
    while _IsPressed("01",$user32)
    ToolTip("Position: "&$aMPos[0]&"x"&$aMPos[1])
    _GDIPlus_GraphicsDrawRect($hGraphic, $aMPos[0], $aMPos[1],MouseGetPos(0)-$aMPos[0],MouseGetPos(1)-$aMPos[1],$hPinsel)
    WEnd
    EndSwitch

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

    ElseIf $aMsg[1]=$hWDaten Then
    Switch $aMsg[0]
    Case $bStart ;46
    Start()
    Case $bAbbrechen
    Abbrechen()
    Case $bRatio1
    Verhaeltniss(1)
    Case $bRatio2
    Verhaeltniss(2)
    Case $bRatio3
    Verhaeltniss(3)
    EndSwitch
    EndIf
    WEnd

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

    Func Start()
    ; Berechnung des Fraktals bzw. Pixels und setzen des Pixels
    setPixel($dc,$vSpalte,$vZeile,Farbwert($vDurchlauf,$vmD)) ; user32.DLL Funktion

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

    ; Am Ende der Berechnung
    Fraktal_speichern()

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

    EndFunc

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

    Func Fraktal_speichern()
    _GDIPlus_Startup() ;Gdi starten
    $hGraphic = _GDIPlus_GraphicsCreateFromHDC ($dc)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($vBreiteGrafik,$vHoeheGrafik,$hGraphic) ;Buffer ertsellen 1. Teil
    ;~ $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; Buffer erstellen 2. Teil
    $hKopie = _GDIPlus_BitmapCloneArea($hBitmap,0,0,$vBreiteGrafik,$vHoeheGrafik)

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

    DirCreate(@ScriptDir&"\Bilder")
    $vDateiName=@ScriptDir&"\Bilder\Test_1.jpg"

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

    If _GDIPlus_ImageSaveToFile($hKopie,$vDateiName)Then
    MsgBox(0,"Speichern ....","Bild wurde erfolgreich gespeichert !!! ",3)
    Else
    MsgBox(0,"Error",@error)
    EndIf
    EndFunc

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

    Func setpixel($dc, $x, $y, $color) ;pixel mit farbe an koordinaten setzen
    DllCall($gdi32, "long", "SetPixel", "long", $dc, "long", $x, "long", $y, "long", $color)
    EndFunc ;==>pix
    Func GetDC($handle)
    $dc = DllCall($user32, "int", "GetDC", "hwnd", $handle)
    Return $dc[0]
    EndFunc ;==>GetDC

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

    Wo hab ich meinen Fehler versteckt ?

    Vorab besten Dank...

  • ListView Items mit drag&drop sortieren - arbeitet ungenau und gibt falsche Werte

    • De Rand Ere
    • 21. Februar 2014 um 15:18

    So, ich hab den Fehler nun gefunden . Das Verschieben der Einträge im Array war nicht richtig durchdacht.

    Es gibt also drei verschiedene Situationen, die auftreten können.
    1. Verschieben bis an Ende -> gelöst mit _ArrayAdd
    2. Verschieben innerhalb des ListView (also nicht bis ans Ende) von oben nach unten -> glöst mit _ArrayInsert
    3. Verschieben innerhalb des ListView (also nicht bis ans Ende) von unten nach oben -> glöst mit _ArrayInsert
    Bei 2. und 3. muß dann der zu löschende Eintrag korregiert werden.

    Was bleibt ist der Effekt, daß ich z.B. das 1. Item im ListView anklicke und verschiebe. Optisch sehe ich das auch.
    Nach Abschluß der Prozedur wurde aber das 2. Item verschoben. Im ListView, wie im Array stimmen die Einträge,
    genau so als hätte ich ursprünglich das 2. Item ausgewählt.

    Was mich zu dem Schluß kommen läst, das die Position der Maus nicht richtig ausgelesen wird!

    Gibts dafür eine bessere Lösung ??

    Hier noch mal zur Info das Script:

    Spoiler anzeigen


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GUIListView.au3>
    #include <Array.au3>

    Global $aDateien[0], $iDropItem

    $vScrHoehe=@DesktopHeight-100
    $h_GUI = GUICreate(" Zeit für MP3 - Sortieren",500,$vScrHoehe,@DesktopWidth-500,5,-1,$WS_EX_ACCEPTFILES)

    $Text=GUICtrlCreateLabel("Wähle die Dateien aus, die Du nutzen möchtest !"&@CR&"Ziehe sie einfach von Deiner Dateiverwaltung in die Tabelle.",20,10,660,50)
    GUICtrlSetFont(-1,14,"","","Times New Roman")
    GUICtrlSetColor(-1,0xFF0000)

    $Liste=GUICtrlCreateListView ("",20,60,460,$vScrHoehe-155,Default,BitOR($WS_EX_CLIENTEDGE,$LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER)) ;$LVS_EX_HEADERDRAGDROP
    GUICtrlSetFont(-1,14,"","","Times New Roman")

    _GUICtrlListView_AddColumn($Liste, "Musikdatei", 373) ; Spaltenkopf & Breite festlegen
    _GUICtrlListView_AddColumn($Liste, "Größe", 75)

    GUICtrlSendMsg($Liste, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES,$LVS_ICON-1)
    GUICtrlSetState($Liste, $GUI_DROPACCEPTED)
    GUICtrlSetState($Liste,$LVS_EX_TRACKSELECT)

    $Gesamt=GUICtrlCreateLabel("gesamt: ",20,830,52,20)
    GUICtrlSetFont(-1,14,"","","Times New Roman")
    $gesGB=GUICtrlCreateLabel("",250,830,145,30)
    GUICtrlSetFont(-1,14,"","","Times New Roman")

    $Auswahl=GUICtrlCreateButton("Auswahl vollständig ?",20,$vScrHoehe-60,170,40)
    GUICtrlSetFont(-1,14,"","","Times New Roman")
    GUICtrlSetState($Auswahl,$GUI_DISABLE)

    $Start=GUICtrlCreateButton("Start",255,$vScrHoehe-60,100,40)
    GUICtrlSetFont(-1,16,"","","Times New Roman")
    GUICtrlSetState(-1,$GUI_HIDE)

    $Ende=GUICtrlCreateButton("Beenden",375,$vScrHoehe-60,100,40)
    GUICtrlSetFont(-1,12,"","","Times New Roman")

    GUISetState()

    GUICtrlSetData($Text,"Sortiere jetzt Deine dateien !"&@CR&"Einfach anklicken und an die richtige Stelle ziehen.")
    GUICtrlDelete($Auswahl)
    GUICtrlSetState($Start,$GUI_SHOW)

    ; eigentlich Funktion zum Befüllen von ListView per d&d - hier eine Schleife zum Befüllen mit 15 Werten

    For $vI= 0 to 14
    $vText=StringFormat("%03s",$vI+1)&".mp3"
    GUICtrlCreateListViewItem($vText&"|"&StringFormat("%.2f",($vI+1)*Random(1.3,2.9))&"MB", $Liste)
    _ArrayAdd($aDateien,$vText)
    Next
    ConsoleWrite("$iDropItem"&@CR&"Wert-$iDropItem""$aItem[0]"&@TAB&"Wert-$aItem[0]"&@CR)

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_PRIMARYUP
    _LVDrop()
    case $GUI_EVENT_PRIMARYDOWN
    _LVDrag()
    Case $GUI_EVENT_MOUSEMOVE
    _LVMove()
    Case $Start
    ExitLoop
    Case $GUI_EVENT_CLOSE, $Ende
    Exit
    EndSwitch
    WEnd

    Exit
    ;-----------------------------------------------------------------------------------------------------------------------------------------------
    ; LiestView sortieren mit d&d
    Func _LVDrop()
    Local $aItem = _GUICtrlListView_HitTest(GUICtrlGetHandle($Liste))
    ;_ArrayDisplay($aItem)

    ConsoleWrite(" "&$iDropItem&" ("&$aDateien[$iDropItem]&") verschieben auf: "&$aItem[0]&@TAB&_GUICtrlListView_GetItemText($Liste,$aItem[0])&@CR)

    If $aItem[0] <> $iDropItem Then

    If $aItem[0] >-1 And $iDropItem >-1 Then
    Local $vText=$aDateien[$iDropItem]
    If $aItem[0]=UBound($aDateien)-1 Then
    _ArrayAdd($aDateien,$aDateien[$iDropItem])
    _ArrayDelete($aDateien,$iDropItem)
    Elseif $iDropItem < $aItem[0] Then
    _ArrayInsert($aDateien,$aItem[0]+1,$aDateien[$iDropItem])
    _ArrayDisplay($aDateien,"nach Insert Quelle ist kleiner")
    _ArrayDelete($aDateien,$iDropItem)
    _ArrayDisplay($aDateien,"nach Insert kleiner")
    Elseif $iDropItem > $aItem[0] Then
    _ArrayInsert($aDateien,$aItem[0],$aDateien[$iDropItem])
    _ArrayDisplay($aDateien,"nach Insert Quelle ist größer")
    _ArrayDelete($aDateien,$iDropItem+1)
    _ArrayDisplay($aDateien,"nach Insert größer")
    EndIf
    ;_ArrayDelete($aDateien,$iDropItem)
    ;_ArrayDisplay($aDateien,"$aDateien")
    EndIf
    Local $aItemText = _GUICtrlListView_GetItemTextArray($Liste, $iDropItem)

    ;_ArrayDisplay($aItemText,"$aItemText")
    _GUICtrlListView_DeleteItem(GUICtrlGetHandle($Liste), $iDropItem)
    Local $InsItem = _GUICtrlListView_InsertItem($Liste, $aItemText[1], $aItem[0])
    _GUICtrlListView_SetItemText($Liste, $InsItem, $aItemText[2], 1)
    _GUICtrlListView_SetItemSelected($Liste, $InsItem)
    _GUICtrlListView_SetItemFocused($Liste, $InsItem)
    EndIf
    _ArrayDisplay($aDateien,"$aDateien")
    EndFunc ;==>_LVDrop

    Func _LVDrag()
    Local $aItem = _GUICtrlListView_HitTest(GUICtrlGetHandle($Liste))
    $iDropItem = $aItem[0] ;das angeklickte Item
    EndFunc ;==>_LVDrag

    Func _LVMove()
    Local $aInfo = GUIGetCursorInfo($h_Gui)
    If Not IsArray($aInfo) Then Return
    If $aInfo[2] Then
    Local $aItem = _GUICtrlListView_HitTest(GUICtrlGetHandle($Liste))
    _GUICtrlListView_SetItemSelected($Liste, -1, False)
    _GUICtrlListView_SetItemSelected($Liste, $aItem[0])
    EndIf
    EndFunc ;==>_LVMove

  • ListView Items mit drag&drop sortieren - arbeitet ungenau und gibt falsche Werte

    • De Rand Ere
    • 20. Februar 2014 um 22:34

    Hallo zusammen,

    ich habe in einem 2spaltigem ListView 15 MP3-Titel mit Größe dargestellt. Dies Einträge möchte ich mit drag&drop sortieren. Also nich alphabetisch. Da in der Liste nur der Titel selbst angezeigt wird, habe ich Pfad und Titel in einem Array gespeichert. Ich muß also bei einer Änderung im ListView diese in das Array übertragen.
    Dabei passiert nun folgendes:
    1. Ich ziehe Item1 (001.mp3) auf Item15(015.mp3) -> ListView klappt, Prüfung des Array - auch i.O.
    2. Ich ziehe Item1 (002.mp3) auf Item15(001.mp3) -> ListView klappt, Prüfung des Array - auch i.O
    3. Ich ziehe Item1 (003.mp3) auf Item14(001.mp3) -> ListView klappt manchmal, Prüfung des Array > Item1 ist nicht an Stelle von Item14, sondern auf Item13. Und manchmal nimmt er optisch das Item1, verschiebt aber dann das Item2

    Ich sitz nun schon ein paar Stunden an dem Problem und finde keine Lösung.

    Hier das Script zur Funktion ... lauffähig...

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GUIListView.au3>
    #include <Array.au3>

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

    Global $aDateien[0], $iDropItem

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

    $vScrHoehe=@DesktopHeight-100
    $h_GUI = GUICreate(" Der DateiZufäller - Sortieren",500,$vScrHoehe,@DesktopWidth-500,5,-1,$WS_EX_ACCEPTFILES)

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

    $Text=GUICtrlCreateLabel("Wähle die Dateien aus, die Du nutzen möchtest !"&@CR&"Ziehe sie einfach von Deiner Dateiverwaltung in die Tabelle.",20,10,660,50)
    GUICtrlSetFont(-1,14,"","","Times New Roman")
    GUICtrlSetColor(-1,0xFF0000)

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

    $Liste=GUICtrlCreateListView ("",20,60,460,$vScrHoehe-155,Default,BitOR($WS_EX_CLIENTEDGE,$LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER)) ;$LVS_EX_HEADERDRAGDROP
    GUICtrlSetFont(-1,14,"","","Times New Roman")

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

    _GUICtrlListView_AddColumn($Liste, "Musikdatei", 373) ; Spaltenkopf & Breite festlegen
    _GUICtrlListView_AddColumn($Liste, "Größe", 75)

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

    GUICtrlSendMsg($Liste, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES,$LVS_ICON-1)
    GUICtrlSetState($Liste, $GUI_DROPACCEPTED)
    GUICtrlSetState($Liste,$LVS_EX_TRACKSELECT)

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

    $Gesamt=GUICtrlCreateLabel("gesamt: ",20,830,52,20)
    GUICtrlSetFont(-1,14,"","","Times New Roman")
    $gesGB=GUICtrlCreateLabel("",250,830,145,30)
    GUICtrlSetFont(-1,14,"","","Times New Roman")

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

    $Auswahl=GUICtrlCreateButton("Auswahl vollständig ?",20,$vScrHoehe-60,170,40)
    GUICtrlSetFont(-1,14,"","","Times New Roman")
    GUICtrlSetState($Auswahl,$GUI_DISABLE)

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

    $Start=GUICtrlCreateButton("Start",255,$vScrHoehe-60,100,40)
    GUICtrlSetFont(-1,16,"","","Times New Roman")
    GUICtrlSetState(-1,$GUI_HIDE)

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

    $Ende=GUICtrlCreateButton("Beenden",375,$vScrHoehe-60,100,40)
    GUICtrlSetFont(-1,12,"","","Times New Roman")

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

    GUISetState()

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

    GUICtrlSetData($Text,"Sortiere jetzt Deine dateien !"&@CR&"Einfach anklicken und an die richtige Stelle ziehen.")
    GUICtrlDelete($Auswahl)
    GUICtrlSetState($Start,$GUI_SHOW)

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

    ; eigentlich Funktion zum Befüllen von ListView per d&d - hier eine Schleife zum Befüllen mit 15 Werten

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

    For $vI= 0 to 14
    $vText=StringFormat("%03s",$vI+1)&".mp3"
    GUICtrlCreateListViewItem($vText&"|"&StringFormat("%.2f",($vI+1)*Random(1.3,2.9))&"MB", $Liste)
    _ArrayAdd($aDateien,$vText)
    Next

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_PRIMARYUP
    _LVDrop()
    case $GUI_EVENT_PRIMARYDOWN
    _LVDrag()
    Case $GUI_EVENT_MOUSEMOVE
    _LVMove()
    Case $Start
    ExitLoop
    Case $GUI_EVENT_CLOSE, $Ende
    Exit
    EndSwitch
    WEnd

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

    Exit
    ;-----------------------------------------------------------------------------------------------------------------------------------------------
    ; LiestView sortieren mit d&d
    Func _LVDrop()
    Local $aItem = _GUICtrlListView_HitTest(GUICtrlGetHandle($Liste))
    ;_ArrayDisplay($aItem)
    If $aItem[0] <> $iDropItem Then

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

    If $aItem[0] >-1 And $iDropItem >-1 Then
    Local $vText=$aDateien[$iDropItem]
    If $aItem[0]=UBound($aDateien)-1 Then
    _ArrayAdd($aDateien,$aDateien[$iDropItem])
    Else
    _ArrayInsert($aDateien,$aItem[0],$aDateien[$iDropItem])
    EndIf
    _ArrayDelete($aDateien,$iDropItem)
    ;_ArrayDisplay($aDateien,"$aDateien")
    EndIf
    Local $aItemText = _GUICtrlListView_GetItemTextArray($Liste, $iDropItem)

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

    ;_ArrayDisplay($aItemText,"$aItemText")
    _GUICtrlListView_DeleteItem(GUICtrlGetHandle($Liste), $iDropItem)
    Local $InsItem = _GUICtrlListView_InsertItem($Liste, $aItemText[1], $aItem[0])
    _GUICtrlListView_SetItemText($Liste, $InsItem, $aItemText[2], 1)
    _GUICtrlListView_SetItemSelected($Liste, $InsItem)
    _GUICtrlListView_SetItemFocused($Liste, $InsItem)
    EndIf
    _ArrayDisplay($aDateien,"$aDateien")
    EndFunc ;==>_LVDrop

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

    Func _LVDrag()
    Local $aItem = _GUICtrlListView_HitTest(GUICtrlGetHandle($Liste))
    $iDropItem = $aItem[0] ;das angeklickte Item
    EndFunc ;==>_LVDrag

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

    Func _LVMove()
    Local $aInfo = GUIGetCursorInfo($h_Gui)
    If Not IsArray($aInfo) Then Return
    If $aInfo[2] Then
    Local $aItem = _GUICtrlListView_HitTest(GUICtrlGetHandle($Liste))
    _GUICtrlListView_SetItemSelected($Liste, -1, False)
    _GUICtrlListView_SetItemSelected($Liste, $aItem[0])
    EndIf
    EndFunc ;==>_LVMove

    [/autoit]

    Hat Jemand ne Idee, wo hier der Wurm drin ist ???

    Vorab schon mal Danke.....

  • Text im Button unterschiedlich formatieren

    • De Rand Ere
    • 16. Februar 2014 um 13:44

    misterspeed:

    Ja , das ist fast genau das, was ich gesucht habe. Danke !!!
    Eins ist mir noch unklar:

    In der Zeile: $TTTCompStart = GUICtrlCreateButton("Überschrift", 30, 190, 180, 90, 14, -1) setzt Du als Style den Wert "14". Im Normalfall wird der Style anders beschrieben, z.B. "$BS_MULTILINE ".

    Wo finde ich die Werte, die Du hier verwendest. Die Umrechnung des "Internen Wertes" hat nicht gefunzt ... oder ich habe's falsch umgerechnet.

  • Text im Button unterschiedlich formatieren

    • De Rand Ere
    • 15. Februar 2014 um 12:49

    Hallo susammen,

    ich dank Euch für die Anregungen. Werds mir Morgen mal zu Gemüte führen.

  • TuneUp Utilities PC Optimation Mode umschalten

    • De Rand Ere
    • 14. Februar 2014 um 17:13

    Hat "TuneUp Utilities" ein CLI ( CommandLineinterface) ?
    Falls ja, dann könntest Du das Programm über die DOS-Ebene umschalten.
    Also mit RUN oder RUNWAIT

  • Text im Button unterschiedlich formatieren

    • De Rand Ere
    • 14. Februar 2014 um 15:59

    Hallo zusammen,

    die letzten 2 Stunden hab ich versucht hier was zum Thema zu finden. Leider ohne Erfolg. Meine eigen Versuche haben mich nur bedingt weitergebarcht.

    Ich möchte also in einem Button den mehrzeiligen Text verschieden formatieren.
    Ungefähr so:

    +-------------------------------------------------------------------------------------------------------------------------------+
    | Überschrift im Button

    | Da drunter soll dann ein Text kommen, der dem Anwender erkärt, was passiert,
    | wenn man auf diesen Button klickt. Dieser Text soll ca. zwei bis drei Zeilen
    | hoch sein.
    +------------------------------------------------------------------------------------------------------+

    Den Text linksbündig darzustellen klapp zwar. Sieht aber doof aus, weil er dann direkt an der linken Seite dranklebt.
    Könnte ich mit Leerzeichen ausgleichen.
    Was ich aber nicht hinbekomme ist die Formatierung der Überschrift.

    Hat einer 'ne Idee ???

    Vorab schon mal Danke.....

  • Ordner per Drag & Drop in ListView einfügen...

    • De Rand Ere
    • 2. Februar 2014 um 14:59

    Vielen Dank für Deine Zeilen.
    Kam leider erst Heute dazu hier reinzuschauen. Werde das gleich mal einarbeiten.

    Kann ich den die Methode GUIOnEventMode und GUIGetMsg miteinander kombinieren? Alle bisherigen Fensteraktionen habe ich mit GUIOnEventMode realisiert.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™