Schöne Version von Desktop-Basketball^^
Beiträge von Mars
-
-
Noch ein Paar Kleinigkeiten habe ich entdeckt.
In Zeile 79 setzt du den Smoothingmode für das Fenster, aber nicht für den Puffer auf den du eigentlich zeichnest.
einfach ein _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2) daraus machen, und schon ist alles ganz glattIn Zeile 192 wird auch ein Sleep(10) benötigt. Sonst überprüft das Skript im Eiltempo alle paar ns die Mausposition.
Sleep(1) ist in AutoIt das gleiche wie Sleep(10).
Der Sleep Befehl funktioniert leider nur in 10er schritten. (10, 20, ...)lg
M -
Sehr schön
In Zeile 115 (in die While Schleife) aber bitte ein Sleep(10) einsetzen.
Dann geht die CPU Last herunter und die Wartezeit verändert sich nicht.lg
M -
Ist das nicht so ein Teil, mit dem man z.B. einen Gameboy "etwas" aufmöbeln kann ?
-
- Je höher die Qualität des Bildes was man beilegt ist, desto besser.
- Für Computergrafiken ist PNG das beste Bildformat (wenn Transparenz, Farbverläufe, Flächen und Linien vorherschend sind).
- Bilder (Wie man sie mit einer Digitalkamera macht) sollten in eine anständige Größe gebracht werden und als jpg gespeichert werden. (Qualität kann man einstellen wie man es braucht)
- Der Interpolationsmodus ( DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "hwnd", $hGFX, "int", 7) ) ist zum Skalieren am besten geeignet (wenn man es denn im Skript noch skalieren will...)
- Gimp liefert gute Möglichkeiten als png/jpg (mit vielen Einstellungen) zu speichern und mit guten Algorithmen zu skalieren (Sinc)
- Ein Skriptbeispiel (incl Bild) ist für jeden ambitionierten hilfsbereiten User hier im Forum das wichtigste um den Fehler zu finden.lg
M -
Das vorschnelle beenden kommt daher, weil ich den leichten Weg gewählt habe um "aufzuräumen", bis ich auf eine bessere Idee komme.
Der "leichte aber schlechte Weg" ist einfach: Nach 100 Frames die ein Partikel zurückgelegt hat werden ALLE Partikel per ReDim entfernt.
Das klappt super bei einer einzigen Explosion.
Sobald man aber eine weitere Zeitversetzt startet wird mittendrin ein Partikel der 1sten die 100 erreichen und alles löschen.Ich habe auch schon eine Idee, wie man das ganze etwas besser machen kann und evtl auch Partikel einzeln löschen kann.
Dann würde es aber eine Feste Partikelmaximalanzahl geben. (macht bei AutoIt eh sinn glaub ich^^). Zu Testzwecken ist dann bei z.B. 1000 Partikeln Schluss. In einem Spiel/Anderen Programm müsste dieser Wert bei ca. 100 liegen um die Performance nicht zu sehr zu drücken.Die Idee ist: Ein Festes Array was Platz für z.B. 100 Partikel bietet.
Wird ein Partikel nicht mehr gebraucht wird sein Vx Wert auf 0 gesetzt und dementsprechend in der schleife übersprungen. (mache ich jetzt auch schon aus Performancegründen, nur etwas anderst)
Bei einer neuen Explosion werden die 50 Partikel auf die nächsten 50 Freien Plätze gesetzt. Das ist minimaler mehraufwand und es muss nichts mehr gelöscht werden.Wenn man das jetzt noch in ASM macht ist nicht bei 100 sondern bei 10.000 schluss
Der Richtige 3D Effekt kann so glaube ich nicht entstehen, da nur 2D Grafiken genutzt werden.
So sieht ein Partikel von allen Seiten gleich aus.
Das 2te Problem ist die Bewegungsunschärfe. (die wird mit einem Halbtransparenten Clear gemacht) Bei den Partikeln die nach Vorne fliegen stimmt somit alles, die die nach hinten fliegen müssten aber an der anderen Seite des "schweifs" sein. Daher sieht es nicht sehr realistisch aus...Besser als nix aber allemal
Hab aber jetzt nicht so viel Zeit. Mathe/Chemie - Abi geht vor
lg
M -
Hab jetzt nochmal etwas daran rumgebastelt.
Mit dem Strahlensatz bekomm ich nun auch die Skalierung ordentlich. Es sieht aber iwie immernoch nicht überzeugend aus^^
Jetzt ist es eher so eine "Krimskramsexplosion". (Daher auch das .zip Archiv in dem die Bilder liegen).
Sieht nicht schlecht aus. Vermutlich ist es aber eh nicht nutzbar, weil man zum gezielten Löschen aller ungenutzen Partikel (solche die zu klein/groß sind, oder das Bild verlassen haben) jedes Mal das Array neu einrichten muss mit ArraySort und Redim, oder mit ArrayDelete. Dieser Vorgang dauert aber leider unzumutbar lange (da das Array ja entpsrechend groß wird bei vielen Partikeln).
also mehr zum Spaß das ganze hier...
lg
M -
Moin,
Es gibt ja schon einige Partikelexplosionen hier im Forum.
Die habe ich mir auch alle schon brav angesehen und habe feststellen müssen, dass alle mangelhaft sind^^
Fast alle nutzen ein Rechteck als Partikelgrenze (Kommt von der 2Dimensionalen Berechnung ohne Sinus oder Vektorbeträge)Ich möchte eine Partikelexplosion in (pseudo) 3D haben. (Es ginge auch echtes 3D. Da weiß ich aber nicht wie das richtig funktioniert. Dazu muss man lineare Gleichungssysteme lösen oder so^^)
-> Partikel haben x, y und z Koord und Geschwindigkeit
-> usw usw.Das Problem ist: Ich bekomme es nicht hin, dass es so aussieht als würden die Partikel tatsächlich "nach hinten" fliegen...
Voluminös sieht die Explosion schon aus. Man sieht aber immer nur eine "Halbkugel" als Begrenzung.Die Anzahl Partikel habe ich mal auf 200 gestellt, damit man schön alles sieht.
In Zeile 127/128 kann man sich die nach vorne bewegenden Partikel oder die, die sich nach hinten bewegen anzeigen lassen.
Dann erkennt man, dass die, die nach hinten gehen auch kleiner werden, die nach vorne größer usw.
Ich bekomm die Perspektive aber nicht gebacken^^PS: Man kann eine lustige optische Täuschung sehen, wenn man so ca. 10 Explosionen anschaut. Anschließend klickt man während einer Explosion auf die Titelleiste um das Bild einzufrieren. Jetzt sieht es so aus als würde sich das bild zusammenziehen^^
Spoiler anzeigen
[autoit][/autoit] [autoit][/autoit] [autoit]#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <Misc.au3>Opt('GUICloseOnESC', 0)
[/autoit] [autoit][/autoit] [autoit]
Opt('GUIOnEventMode', 1)
Opt('MustDeclareVars', 1)
Opt('MouseCoordMode', 2)Global Const $iB = 400, $iH = 400
[/autoit] [autoit][/autoit] [autoit]
Global $hGFX, $hBMP, $hBUF, $hGUI, $Partikel[1][10], $hBrush[256], $L_Klick, $L_Tmp, $mPos[2]OnAutoItExitRegister('_Release')
[/autoit] [autoit][/autoit] [autoit]_Main()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _Main()
[/autoit] [autoit][/autoit] [autoit]$hGUI = GUICreate('Explosion', $iB, $iH)
[/autoit] [autoit][/autoit] [autoit]
WinSetTrans($hGUI, '', 255)
GUISetBkColor(0xFF0000, $hGUI)
GUISetOnEvent(-3, '_Exit', $hGUI)_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hGFX = _GDIPlus_GraphicsCreateFromHWND($hGUI)
[/autoit] [autoit][/autoit] [autoit]
$hBMP = _GDIPlus_BitmapCreateFromGraphics($iB, $iH, $hGFX)
$hBUF = _GDIPlus_ImageGetGraphicsContext($hBMP)$hBrush = __GDIPlus_BrushCreateSolid('FF6800')
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_GraphicsSetSmoothingMode($hBUF, 4)
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg(0xF, 'WM_PAINT')
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW, $hGUI)
[/autoit] [autoit][/autoit] [autoit]_AddExplosion($iB / 2, $iH / 2)
[/autoit] [autoit][/autoit] [autoit]While Sleep(20)
[/autoit] [autoit][/autoit] [autoit]
$mPos = MouseGetPos()
$L_Tmp = _IsPressed('01')
If $L_Klick And Not $L_Tmp Then _AddExplosion($mPos[0], $mPos[1])
$L_Klick = $L_Tmp
_GDIPlus_GraphicsClear($hBUF, 0x40000000)
_DrawPartikel()
WM_PAINT()
WEndEndFunc ;==>_Main
[/autoit] [autoit][/autoit] [autoit]Func _AddExplosion($x, $y, $D = 4, $n = 200)
[/autoit] [autoit][/autoit] [autoit]; Partikel
[/autoit] [autoit][/autoit] [autoit]
; 0 - x
; 1 - y
; 2 - z
; 3 - Vx
; 4 - Vy
; 5 - Vz
; 6 - CounterLocal $u = UBound($Partikel, 1)
[/autoit] [autoit][/autoit] [autoit]
ReDim $Partikel[$u + $n + 1][UBound($Partikel, 2)]For $i = $u To $u + $n Step 1
[/autoit] [autoit][/autoit] [autoit]
$Partikel[$i][0] = $x
$Partikel[$i][1] = $y
$Partikel[$i][2] = 0 ; z = 0 - In der Ebene
$Partikel[$i][3] = Random(0, 1)
$Partikel[$i][4] = Random(0, (1 - $Partikel[$i][3]) ^ 0.5)
$Partikel[$i][5] = (1 - $Partikel[$i][3] ^ 2 - $Partikel[$i][4] ^ 2) ^ 0.5
$Partikel[$i][6] = 0
$Partikel[$i][7] = $D ; Durchmesser
$Partikel[$i][8] = $x
$Partikel[$i][9] = $y$Partikel[$i][3] = _PN($Partikel[$i][3])
[/autoit] [autoit][/autoit] [autoit]
$Partikel[$i][4] = _PN($Partikel[$i][4])
$Partikel[$i][5] = _PN($Partikel[$i][5])If Random(0, 1, 1) Then _Swap($Partikel[$i][3], $Partikel[$i][4])
[/autoit] [autoit][/autoit] [autoit]
If Random(0, 1, 1) Then _Swap($Partikel[$i][5], $Partikel[$i][4])
If Random(0, 1, 1) Then _Swap($Partikel[$i][3], $Partikel[$i][5])Next
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_AddExplosion
[/autoit] [autoit][/autoit] [autoit]Func _Swap(ByRef $a, ByRef $b)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Local $c = $a
$a = $b
$b = $c
EndFunc ;==>_SwapFunc _PN($a)
[/autoit] [autoit][/autoit] [autoit]
If Random(0, 1, 1) Then Return $a
Return -$a
EndFunc ;==>_PNFunc _DrawPartikel()
[/autoit] [autoit][/autoit] [autoit]Local $u = UBound($Partikel), $D, $K[$u], $T, $x, $y
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To $u - 1 Step 1
[/autoit] [autoit][/autoit] [autoit]$D = (9 + $Partikel[$i][2] / 30)
[/autoit] [autoit][/autoit] [autoit]
If $D < 0 Then ContinueLoop$T = Int(256 - ($Partikel[$i][6] / $Partikel[$i][7] * 25.5)) * 0.9 - 20 / $D
[/autoit] [autoit][/autoit] [autoit]If $T < -5 Then
[/autoit] [autoit][/autoit] [autoit]
ReDim $Partikel[$i][UBound($Partikel, 2)]
ExitLoop
EndIfIf $T <= 0 Then
[/autoit] [autoit][/autoit] [autoit]
$Partikel[$i][2] += $Partikel[$i][5] * $Partikel[$i][7]
$Partikel[$i][6] += 1
ContinueLoop
EndIf$x = $Partikel[$i][3] * $Partikel[$i][6] * $Partikel[$i][7] + $Partikel[$i][8] - $D / 2
[/autoit] [autoit][/autoit] [autoit]
$y = $Partikel[$i][4] * $Partikel[$i][6] * $Partikel[$i][7] + $Partikel[$i][9] - $D / 2If $Partikel[$i][2] < 0 Then _GDIPlus_GraphicsFillEllipse($hBUF, $x, $y, $D, $D, $hBrush[$T - 1]) ; Hintere Halbkugel - Partikel werden kleiner
[/autoit] [autoit][/autoit] [autoit]
;~ If $Partikel[$i][2] > 0 Then _GDIPlus_GraphicsFillEllipse($hBUF, $x, $y, $D, $D, $hBrush[$T - 1]) ; Vordere Halbkugel - Partikel werden größer$Partikel[$i][2] += $Partikel[$i][5] * $Partikel[$i][7]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$Partikel[$i][6] += 1Next
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_DrawPartikel
[/autoit] [autoit][/autoit] [autoit]Func __GDIPlus_BrushCreateSolid($c)
[/autoit] [autoit][/autoit] [autoit]Local $a[256]
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To 255 Step 1
[/autoit] [autoit][/autoit] [autoit]
$a[$i] = _GDIPlus_BrushCreateSolid('0x' & Hex($i, 2) & $c)
NextReturn $a
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>__GDIPlus_BrushCreateSolid
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func WM_PAINT()
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawImage($hGFX, $hBMP, 0, 0)
EndFunc ;==>WM_PAINTFunc _Exit()
[/autoit] [autoit][/autoit] [autoit]
Exit
EndFunc ;==>_ExitFunc _Release()
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To 255 Step 1
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_BrushDispose($hBrush[$i])
Next_GDIPlus_GraphicsDispose($hBUF)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_BitmapDispose($hBMP)
_GDIPlus_GraphicsDispose($hGFX)_GDIPlus_Shutdown()
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_Release
[/autoit]lg
M -
Jop. In der höchsten Einstellung packt man bis zu 30%.
Ähnlich viel möchte ich auch erreichen, wobei dadurch bei den mir möglichen Verfahren die Codelänge auf ca. 300% steigen würde. (um beliebige 30% wieder herstellen zu können). Der QR Code ist bei 30% aber nicht 3Mal größer als der Ursprungscode. Deshalb brauche ich ein "relativ" effektives Fehlerkorrekturverfahren.
RS habe ich mir abgeschminkt, da ich trotz intensiver Suche nirgens eine ordentliche Anleitung mit ausführlichen Beispielen finde.
Auf Wikipedia bei der Fehlerkorrekturseite ist z.B. die Fehlerkorrektur mittels Hamming Distanz erläutert. Ganz ohne unverständliche komische Begriffe, sondern einfach und simpel. So wie es ein einfältiger Programmierer braucht.Mir würde auch eine Dll (die man includen kann) reichen, die die RS-Berechnung durchführt. Ansonsten wird kein RS genutzt. Das scheint ja wirklich kompliziert zu sein...
Der von mir Entworfene Grafische Code soll "schön" anzusehen sein. Kein hässliches Viereck mit dicken Markierungen, damit es gelesen werden kann.
Ich dachte an sowas: Klick Michlg
M -
_Button_Set_Ani_Speed kann bei nicht animierten Buttons weg gelassen werden.
Das macht nur Sinn, wenn jeder Zustand mehr als ein Bild besitzt.lg
M -
Der QR-Code ist zumindest insofern fehlertolerant, dass pro Bit mehrere Pixel verwendet werden, beim Abfotografieren hat man wieder mehrere Pixel pro Bit.Das stimmt. Wenn man den Code im Bild findet und anschließend ein Gitter darüberlegt kann man jeweils den Mittelwert aller pixel pro "kästchen" bilden. Diese Mittelwerte setzt man in Relation zu den benachbarten Mittelwerten (so kann man auch über bzw unterbelichtete Bilder richtig zuordnen) und kann damit flächendeckend Fehler vermeiden. Das hilft aber nur bei kontinuierlichem Rauschen. Ist auf dem Code irgendwo ein Fleck, oder ist Dreck auf der Linse oder Irgendwas anderes hindert die Kamera jedes "kästchen" zu erfassen, so ist der Code aufgrund der Kompression nichtmal teilweise verwendbar. (unkomprimiert würden so nur einzelne Buchstaben/Wörter kaputt gehen. Was eine internetadresse z.B. aber schon zerstört).
Daher wird eine Methode zur Wiederherstellung zwingend nötig. Und da habe ich nachgeforscht. Der RS-Code scheint dafür am effektivsten zu sein. Zur Not könnte man auch einen leichter zu programmierenden nutzen, um aber dann an die gleiche Wiederherstellungsrate zu kommen muss der Code viel länger werden, was sich negativ auf die Maße auswirkt.
Ich schau mir mal die Links von BB an. Mal schauen, ob ich mit meinem beschränkten Mathematischen Wissen da durch blicke. Mathe LK 13, aber nix nützliches gelernt^^
lg
M//Edit:
Habe mich nochmal nach Alternativen umgesehen. Dabei ist mir Interleaving aufgefallen, da es ein entscheidendes Problem beseitigen müsste. Und zwar Burstfehler (Fachbegriff :D).
Ich möchte ja keinen QR-Code nachbauen, sondern einen ganz eigenen Code entwickeln (im Prinzip möchte ich etwas rundes mit schönen Flächen usw. Mal schauen wie man in geometrischen Formen Daten verpacken kann).Durch Interleaving würden Fehlergruppen aufgeteilt werden, sodass im Regelfall trotz dicker Flecken nur Einzelbitfehler auftauchen dürften. Diese kann man mit einfacheren Verfahren gut beseitigen.
Ich habe nun eine Funktion gebastelt, die einen Text per Interleaving neu ordnet. Leider traue ich meiner Programmierkunst nicht zu 100%. Denn nur, weil man keinen Fehler gefunden hat heißt das nicht, dass keiner da ist
Daher bitte ich jemanden der evtl eine Referenzfunktion hat mal drüberzuschauen.
Wenn das Verpacken schonmal klappt kann ich mich ans Entpacken machen. (vorher mache ich nix. Das ist nachher vergebene Liebesmüh^^)Spoiler anzeigen
[autoit][/autoit] [autoit][/autoit] [autoit]; s = String
[/autoit] [autoit][/autoit] [autoit]
; i = Interleaving FaktorLocal $t, $s = 'aaaabbbbccccddddeeeeffffgggg', $i = 7, $r
[/autoit] [autoit][/autoit] [autoit]
$t = TimerInit()
$r = _Interleaving_Encode($s, $i)
$t = TimerDiff($t)ConsoleWrite('String: ' & $s & @CRLF & 'Interl: ' & $r & @CRLF & 'Time : ' & Round($t, 2) & ' ms' & @CRLF)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _Interleaving_Encode($s, $i)
[/autoit] [autoit][/autoit] [autoit]If $i = 0 Or Not IsInt($i) Then Return 'i muss einen Integerwert haben !'
[/autoit] [autoit][/autoit] [autoit]Local $l = StringLen($s), $a = _Split($s, $i), $m = _Maxlen($a), $r, $u = UBound($a)
[/autoit] [autoit][/autoit] [autoit]If Not $m Then Return 'es ist ein Fehler aufgetreten... a ist kein Array !'
[/autoit] [autoit][/autoit] [autoit]For $e = 1 To $m Step 1
[/autoit] [autoit][/autoit] [autoit]
For $o = 0 To $u - 1 Step 1
$r &= StringMid($a[$o], $e, 1)
Next
NextReturn $r
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit]Func _Maxlen($a) ; ermittelt die maximale Länge eines Strings im gegebenen Array
[/autoit] [autoit][/autoit] [autoit]
If Not IsArray($a) Then Return
Local $l = StringLen($a[0])
For $i = 0 To UBound($a) - 1 Step 1
If StringLen($a[$i]) > $l Then $l = StringLen($a[$i])
Next
Return $l
EndFuncFunc _Split($s, $i, $a = 0) ; s = String der zerteilt werden soll, i = Anzahl Teile | ret: Array mit geteiltem String
[/autoit] [autoit][/autoit] [autoit]Local $l = StringLen($s) ; Stringlänge des Inputstrings
[/autoit] [autoit][/autoit] [autoit]
$i -= Int($i / $l - 0.1) * $l ; wenn $i zu groß ist wird es erniedrigt. Es wird IMMER abgerundet, daher Int(bla -0.1)
Local $z = Ceiling($l / $i) ; Länge die links abgetrennt wird.If Not IsArray($a) Then
[/autoit] [autoit][/autoit] [autoit]
Local $b[1] = [StringLeft($s, $z)]
$a = $b
Else
Local $u = UBound($a)
ReDim $a[$u + 1]
$a[$u] = StringLeft($s, $z)
EndIfIf $i = 1 Then Return $a
[/autoit] [autoit][/autoit] [autoit]
$a = _Split(StringTrimLeft($s, $z), $i - 1, $a)Return $a
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit]lg
M -
Moin,
Das liegt daran, dass du in einem Event (was eigentlich schnellstmöglich erledigt sein sollte) eine Hauptschleife einbaust.
In einem Event funktionieren keine anderen Events.Daher kann man in der Hauptschleife eine Selektion durchführen, die festlegt auf welchem Bildschirm man sich gerade befindet. Mit dem Event wird dann nur eine Zahl geändert. (das geht sehr schnell).
Bissl dran rumgebastelt:
Spoiler anzeigen
[autoit]#include <WindowsConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstants.au3>
#include <WinAPI.au3>
#include <GDIPlus.au3>
#include 'Buttons.au3'Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]
Opt("MouseCoordMode", 2) ;Damit die Koords der Maus auf dem Button korrekt erkannt werden._GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$Title = "HTC Desire HD"
[/autoit] [autoit][/autoit] [autoit]
$Width = 300
$Height = 500
$pics = @ScriptDir & "\images\"; Konstanten
[/autoit] [autoit][/autoit] [autoit]
Global Const $BgColorTitle = 0x000000
Global Const $BgColor = 0x464646; Handyrahmen aussen
[/autoit] [autoit][/autoit] [autoit]
$hWnd_Main = GUICreate($Title, $Width, $Height, -1, -1, $WS_POPUP)
GUISetBkColor($BgColor)
$Close = GUICtrlCreatePic($pics & "close.bmp", $Width - 16, 7, 9, 9)
GUICtrlSetOnEvent($Close, "_Exit")
$TitleBar = GUICtrlCreateLabel("", 6, 4, $Width - 42, 17, -1, $GUI_WS_EX_PARENTDRAG)
GUICtrlCreatePic($pics & "HTC-Lautsprecher.bmp", 65, 6, 180, 10)GUISetState()
[/autoit] [autoit][/autoit] [autoit]; Handydisplay erstellen
[/autoit] [autoit][/autoit] [autoit]
$hWnd_Child1 = GUICreate("", 290, 475, 5, 20, $WS_POPUP)
GUISetBkColor(0xFFFFFF, $hWnd_Child1);~ GUICtrlCreatePic($pics & "HTC-Brilliant.bmp", 15, 130, 260, 165)
[/autoit] [autoit][/autoit] [autoit]
Global $hImg_HTC_Brilliant = _GDIPlus_ImageLoadFromFile($pics & "HTC-Brilliant.bmp")$home_button = GUICtrlCreatePic($pics & "menu1.bmp", 15, 410, 51, 38)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetOnEvent($home_button, "_home_button")
$menu_button = GUICtrlCreatePic($pics & "menu2.bmp", 66, 410, 82, 38)
GUICtrlSetOnEvent($menu_button, "_menu_button")
GUICtrlCreatePic($pics & "menu3.bmp", 148, 410, 76, 38)
GUICtrlCreatePic($pics & "menu4.bmp", 224, 410, 49, 38)
GUICtrlCreatePic($pics & "HTC-Logo.bmp", 120, 445, 55, 20)Global Const $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd_Child1)
[/autoit] [autoit][/autoit] [autoit]
Global Const $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Width, 410, $hGraphic)
Global Const $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap); Hintergrund/Rahmen des Handydisplays
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateGraphic(0, 0, 330, 12)
GUICtrlSetBkColor(-1, $BgColorTitle)
GUICtrlCreateGraphic(0, 0, 10, $Height)
GUICtrlSetBkColor(-1, $BgColorTitle)
GUICtrlCreateGraphic(0, 410, $Width, 80)
GUICtrlSetBkColor(-1, $BgColorTitle)
GUICtrlCreateGraphic(280, 0, 20, $Height)
GUICtrlSetBkColor(-1, $BgColorTitle); Menü
[/autoit] [autoit][/autoit] [autoit]
Global $hButton1 = _Button_Init(20, 30, 45, 45, 1)
_Button_Set_Pic($hButton1, 0, $pics & 'home1.bmp')
_Button_Set_Pic($hButton1, 1, $pics & 'home2.bmp')
_Button_Set_Pic($hButton1, 2, $pics & 'home3.bmp')
_Button_Set_Ani_Speed($hButton1, 30, 14, 7)Global $hButton2 = _Button_Init(120, 30, 45, 45, 2)
[/autoit] [autoit][/autoit] [autoit]
_Button_Set_Pic($hButton2, 0, $pics & 'info1.bmp')
_Button_Set_Pic($hButton2, 1, $pics & 'info2.bmp')
_Button_Set_Pic($hButton2, 2, $pics & 'info3.bmp')
_Button_Set_Ani_Speed($hButton2, 30, 14, 7)Global $hButton3 = _Button_Init(220, 30, 45, 45, 3)
[/autoit] [autoit][/autoit] [autoit]
_Button_Set_Pic($hButton3, 0, $pics & 'alben1.bmp')
_Button_Set_Pic($hButton3, 1, $pics & 'alben2.bmp')
_Button_Set_Pic($hButton3, 2, $pics & 'alben3.bmp')
_Button_Set_Ani_Speed($hButton3, 30, 14, 7)Global $hButton4 = _Button_Init(20, 100, 45, 45, 4)
[/autoit] [autoit][/autoit] [autoit]
_Button_Set_Pic($hButton4, 0, $pics & 'media1.bmp')
_Button_Set_Pic($hButton4, 1, $pics & 'media2.bmp')
_Button_Set_Pic($hButton4, 2, $pics & 'media3.bmp')
_Button_Set_Ani_Speed($hButton4, 30, 14, 7)Global $hButton5 = _Button_Init(120, 100, 45, 45, 5)
[/autoit] [autoit][/autoit] [autoit]
_Button_Set_Pic($hButton5, 0, $pics & 'kamera1.bmp')
_Button_Set_Pic($hButton5, 1, $pics & 'kamera2.bmp')
_Button_Set_Pic($hButton5, 2, $pics & 'kamera3.bmp')
_Button_Set_Ani_Speed($hButton5, 30, 14, 7)Global $hButton6 = _Button_Init(220, 100, 45, 45, 6)
[/autoit] [autoit][/autoit] [autoit]
_Button_Set_Pic($hButton6, 0, $pics & 'nachrichten1.bmp')
_Button_Set_Pic($hButton6, 1, $pics & 'nachrichten2.bmp')
_Button_Set_Pic($hButton6, 2, $pics & 'nachrichten3.bmp')
_Button_Set_Ani_Speed($hButton6, 30, 14, 7)Global $hButton7 = _Button_Init(20, 170, 45, 45, 7)
[/autoit] [autoit][/autoit] [autoit]
_Button_Set_Pic($hButton7, 0, $pics & 'home1.bmp')
_Button_Set_Pic($hButton7, 1, $pics & 'home2.bmp')
_Button_Set_Pic($hButton7, 2, $pics & 'home3.bmp')
_Button_Set_Ani_Speed($hButton7, 30, 14, 7)Global $hButton8 = _Button_Init(120, 170, 45, 45,
[/autoit] [autoit][/autoit] [autoit]
_Button_Set_Pic($hButton8, 0, $pics & 'home1.bmp')
_Button_Set_Pic($hButton8, 1, $pics & 'home2.bmp')
_Button_Set_Pic($hButton8, 2, $pics & 'home3.bmp')
_Button_Set_Ani_Speed($hButton8, 30, 14, 7)Global $hButton9 = _Button_Init(220, 170, 45, 45, "test")
[/autoit] [autoit][/autoit] [autoit]
_Button_Set_Pic($hButton9, 0, $pics & 'home1.bmp')
_Button_Set_Pic($hButton9, 1, $pics & 'home2.bmp')
_Button_Set_Pic($hButton9, 2, $pics & 'home3.bmp')
_Button_Set_Ani_Speed($hButton9, 30, 14, 7)Global $Btn_msg
[/autoit] [autoit][/autoit] [autoit]
Global $pos, $klick
Global $Temp
Global $Anzeige = 0 ; 0 = home, 1 = Menu, usw...
Local $t = TimerInit(); Display an Handyrahmen "koppeln"
[/autoit] [autoit][/autoit] [autoit]
_SetParent($hWnd_Main, $hWnd_Child1); Gui einblenden
[/autoit] [autoit][/autoit] [autoit]
GuiRoundCorners($hWnd_Main, 0, 0, 20, 20)
GuiRoundCorners($hWnd_Child1, 0, 0, 20, 20)
WinSetTrans($hWnd_Main, "", 0)
WinSetTrans($hWnd_Child1, "", 0)
GUISetState(@SW_SHOW, $hWnd_Main)
GUISetState(@SW_SHOW, $hWnd_Child1)
FadeIn($hWnd_Main)While Sleep(20)
[/autoit] [autoit][/autoit] [autoit]Switch $Anzeige
[/autoit] [autoit][/autoit] [autoit]
Case 0 ; Home
_home()
Case 1 ; Menu
_menu()
EndSwitchWEnd
[/autoit] [autoit][/autoit] [autoit]; Funktionen
[/autoit] [autoit][/autoit] [autoit]
Func _SetParent($hWnd_Parent, $hWnd_Child)
$nExStyle = DllCall("user32.dll", "int", "GetWindowLong", "hwnd", $hWnd_Child, "int", 0xEC)
DllCall("user32.dll", "int", "SetWindowLong", "hwnd", $hWnd_Child, "int", 0xEC, "int", BitOR($nExStyle[0], $WS_EX_MDICHILD))
DllCall("user32.dll", "int", "SetParent", "hwnd", $hWnd_Child, "hwnd", $hWnd_Parent)
GUISwitch($hWnd_Parent)
EndFunc ;==> _SetParentFunc GuiRoundCorners($h_win, $i_x1, $i_y1, $i_x3, $i_y3)
[/autoit] [autoit][/autoit] [autoit]
$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 ;==>GuiRoundCornersFunc FadeIn($h)
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To 255 Step 15
Sleep(10)
WinSetTrans($h, "", $i)
Next
EndFunc ;==>FadeInFunc FadeOut($h)
[/autoit] [autoit][/autoit] [autoit]
For $i = 255 To 0 Step -15
Sleep(10)
WinSetTrans($h, "", $i)
Next
EndFunc ;==>FadeOutFunc _Exit()
[/autoit] [autoit][/autoit] [autoit]
FadeOut($hWnd_Main)
GUIDelete($hWnd_Child1)_Button_Dispose($hButton1)
[/autoit] [autoit][/autoit] [autoit]
_Button_Dispose($hButton2)
_Button_Dispose($hButton3)
_Button_Dispose($hButton4)
_Button_Dispose($hButton5)
_Button_Dispose($hButton6)
_Button_Dispose($hButton7)
_Button_Dispose($hButton8)
_Button_Dispose($hButton9)_GDIPlus_GraphicsDispose($hBackbuffer)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>_ExitFunc _menu()
[/autoit] [autoit][/autoit] [autoit]
;~ While Sleep(10)
_GDIPlus_GraphicsClear($hBackbuffer, 0xFF000000)
$Btn_msg = _Button_Get_Pressed()
_Button_Draw($hBackbuffer, $hButton1)
_Button_Draw($hBackbuffer, $hButton2)
_Button_Draw($hBackbuffer, $hButton3)
_Button_Draw($hBackbuffer, $hButton4)
_Button_Draw($hBackbuffer, $hButton5)
_Button_Draw($hBackbuffer, $hButton6)
_Button_Draw($hBackbuffer, $hButton7)
_Button_Draw($hBackbuffer, $hButton8)
_Button_Draw($hBackbuffer, $hButton9)
_GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, 0)
If $Btn_msg Then ToolTip('ButtonID: ' & $Btn_msg)
;Exitloop
;~ WEnd
EndFuncFunc _menu_button() ; Eventfunktion... schnell abwickeln !
[/autoit] [autoit][/autoit] [autoit]
$Anzeige = 1 ; ab ins Menu !
EndFuncFunc _home_button() ; Eventfunktion... schnell abwickeln !
[/autoit] [autoit][/autoit] [autoit]
$Anzeige = 0 ; Home
EndFunc ;==>_home_buttonFunc _home()
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_GraphicsClear($hBackbuffer, 0xFFFFFFFF)
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hImg_HTC_Brilliant, 15, 130, 260, 165)
[/autoit] [autoit][/autoit] [autoit]; Hier was auch immer du willst...
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, 0)
[/autoit] [autoit][/autoit] [autoit];~ GUISetBkColor(0xFFFFFF, $hWnd_Child1)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;~ GUICtrlCreatePic($pics & "HTC-Brilliant.bmp", 15, 130, 260, 165)EndFunc
[/autoit]
lg
M -
Moin,
inzwischen kennt ja (fast) jeder die QR-Codes oder andere Sachen in der Art.
So etwas ähnliches möchte ich auch mal basteln. Allerdings fehlt mir dazu die Möglichkeit das ganze Fehlertolerant zu gestalten.
Wenn man die Grafiken mit dem PC verschickt ist das nicht nötig, aber sobald man schon ein jpg-Bild nutzt, oder womöglich noch den eigentlichen Verwendungszweck, das fotografieren mit einem Handy praktizieren will, kommt man so nicht weit.Nach wenigen Nachforschungen habe ich herausgefunden, dass die scheinbar beste Darstellung der Daten die Umwandlung in RS (Reed Solomon) Code ist.
Den Algorithmus möchte ich aber in AutoIt schreiben, und hier sitzt mein Problem.Sämtliche bisher gefundenen C (ähnlichen) Algorithmen sagen mit überhaupt nix oder sind viel zu komplex.
Daher die Frage: Gibt es eine übersichtliche Möglichkeit den Spaß in AutoIt zu implementieren ?
lg
M -
Adlib sollte man in größeren Skripten nicht einsetzen.
Adlib "mogelt" den registrierten Code unter den eigentlich gerade laufenden Code.
Der verantwortungsbewusste Programmierer weiß aber genau wo und wann etwas ausgeführt wird.
Man kann also einfach einen Static timer in eine Funktion einbauen und diese nur ausführen lassen, wenn eine gewisse Zeit überschritten ist (z.B. 200ms). Ansonsten gibts nen direkten return. Das hält das Skript im Prinzip nicht großartig auf und lässt die Funktion immer im gleichen Programmteil ablaufen.Beispiel
[autoit][/autoit] [autoit][/autoit] [autoit]_Main()
[/autoit] [autoit][/autoit] [autoit]Func _Main()
[/autoit] [autoit][/autoit] [autoit]Local $i
[/autoit] [autoit][/autoit] [autoit]While Sleep(10) ; Die Schleife läuft ziemlich schnell...
[/autoit] [autoit][/autoit] [autoit]
$i = _TimerFunc(Random(2, 4), Random(2, 4), Random(2, 4)) ; i hat aber nur ca. jede Sekunde einen Wert.
If $i Then ConsoleWrite($i & @CRLF) ; hat i mal einen Wert wollen wir den auch wissen !
WEndEndFunc ;==>_Main
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _TimerFunc($a, $b, $c)
[/autoit] [autoit][/autoit] [autoit]
Local Static $Timer = TimerInit() ; Timer deklarieren
If TimerDiff($Timer) < 1000 Then Return ; Wenn die Zeit noch nicht erreicht ist -> Return -> Kaum Zeitverlust durch den unnötigen Funktionsaufruf;### Funktion
[/autoit] [autoit][/autoit] [autoit]
Local $iRet = 0$iRet = $a ^ 3
[/autoit] [autoit][/autoit] [autoit]
$iRet *= $b
$iRet += $c
$iRet = Int($iRet ^ 0.5); usw. Was auch immer man will...
[/autoit] [autoit][/autoit] [autoit]
;###$Timer = TimerInit() ; Vor dem Return den Timer neu einstellen
[/autoit]
Return $iRet
EndFunc ;==>_TimerFunc
Das ist natürlich nur meine subjektive Einstellung zu der Sache. Es kann sein, dass jemand etwas weiß, was ich nicht weiß und eine wesentlich effektivere Lösung hat.lg
M -
Obfuscator kannst du abhaken, wenn du etwas Tempo brauchst.
Denn der verwurschtelt alles etwas, sodass AutoIt mehr Operationen ausführen muss als üblicherweise um das gleiche zu erreichen.Bei großen Skripten passiert es auch schonmal, dass man enorme Startzeiten hat, oder das Skript danach garnicht mehr startet.
Alles in AutoIt geschriebene kann ohne weiteres wiederhergestellt werden.
Möglichkeiten die ich kenne sind nur:
- InlineASM: Jeder der davon keine Ahnung hat wird nix damit anfangen können. Die die das selbst mal gemacht haben sind aber vermutlich in der Lage den Code zu lesen. Verstehen ist je nach Komplexität so eine Sache^^
- Dlls includen. Man bastelt sich einige Funktionen (die man schützen will) in C++ und ruft sie per Dllcall auf. Die Dll kann man als HexString/Base64 einbauen. Damit hat man glaube ich die höchste Sicherheit... 100% wird sie aber nie erreichen.lg
M -
Obwohl ich ein sehr humoröser Mensch bin und gerne, oft und viel Spaß habe, finde ich Fasching nicht wirklich berauschend.
Auf Kommando lustig sein kann ich nicht. In gewisser Weise beneide ich die Leute, die schon leicht angetrunken am sinnentleerten Rumspringen freude finden und den ganzen Tag lang in einer lässigen Verkleidung die Aufsehen Sorgen, ohne sich dabei zu schämen.Ich kann sowas garnicht. Selbst volltrunken würde ich nicht hüpfend und singend (Gott bewahre) umhertorkeln ohne mir dabei so peinlich vorzukommen, dass mir jede Lust vergeht.
Ähnlich verhält es sich mit dem Fußball.
Nationalstolz ist nur an der EM oder WM erlaubt, dort aber in großem Maße. (man darf plötzlich voller Stolz den Namen seines Vaterlandes aussprechen, ohne dafür geächtet zu werden)
Nichts gegen Fußballliebhaber, aber wenn man sich nie für Fußball interessiert und dann auf ein Mal DER Fan ist, kommt mir das schon Spanisch vor.lg
M -
[autoit]
$k * 100 - 80 + ($k = 1 Or $k = 3 Or $k = 5) * 20
[/autoit]
Wusste garnicht, dass das überhaupt geht^^
In einer Rechenoperation noch Logische Abfragen unterbringen.. geil !Das würde fast alle Skripte von mir um 20% reduzieren...^^
(Normal regel ich sowas mit If. Da dann aber ein Else gebraucht wird oder ne Variable braucht man min. 3-5 statt eine Zeile).Wenn noch jemand so "Tricks" drauf hat, nur her damit^^
Ich war damals schon beeindruckt, dass man Logische Operationen per Return verarbeiten kann
(Kollisionsprüfung zweier Körper in einem Einzeiler)lg
M -
Fehler gefunden:
Unter XP wird das Fenster nicht automatisch sichtbar, wenn man ein Layered Window erzeugt. Daher:
WinSetTrans($hWnd, '', 255)UpdateLayeredwindow klappt auch nicht wie gewünscht.
ersetzen durch:
_WinAPI_BitBlt($hDC_Window, 0, 0, $iWidth, $iHeight, $hDC_Bitmap, 0, 0, $SRCCOPY)
_WinAPI_BitBlt($hDC_Bitmap, 0, 0, $iWidth, $iHeight, 0, 0, 0, $BLACKNESS)Läuft !
Spoiler anzeigen
[autoit]#NoTrayIcon
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]$iWidth = 115
[/autoit] [autoit][/autoit] [autoit]
$iHeight = 50
$iX_Pos = @DesktopWidth / 2 - 56
$iY_Pos = @DesktopHeight / 2 - 25#region -DLLStruct
[/autoit] [autoit][/autoit] [autoit]
$tPoint = DllStructCreate($tagPOINT)
DllStructSetData($tPoint, "X", 0)
DllStructSetData($tPoint, "Y", 0)
$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize)
DllStructSetData($tSize, "X", $iWidth)
DllStructSetData($tSize, "Y", $iHeight)
$tDest = DllStructCreate($tagPOINT)
$pDest = DllStructGetPtr($tDest)
DllStructSetData($tDest, "X", $iX_Pos)
DllStructSetData($tDest, "Y", $iY_Pos)
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, "Alpha", 255)
DllStructSetData($tBlend, "Format", 1)
#endregion -DLLStruct$hWnd = GUICreate("Clock", $iWidth, $iHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOOLWINDOW))
[/autoit] [autoit][/autoit] [autoit]
WinSetTrans($hWnd, '', 255)
GUISetState(@SW_SHOW, $hWnd)$hDC_Window = _WinAPI_GetDC($hWnd)
[/autoit] [autoit][/autoit] [autoit]
$hDC_Bitmap = _WinAPI_CreateCompatibleDC($hDC_Window)
$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC_Window, $iWidth, $iHeight)
_WinAPI_SelectObject($hDC_Bitmap, $hBitmap)_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hGraphics = _GDIPlus_GraphicsCreateFromHDC($hDC_Bitmap)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsSetSmoothingMode($hGraphics, 2)
_GDIPlus_GraphicsSetTextRenderingHint($hGraphics, 3)$hFormat = _GDIPlus_StringFormatCreate()
[/autoit] [autoit][/autoit] [autoit]
$hFamily = _GDIPlus_FontFamilyCreate("arial")
$hFont = _GDIPlus_FontCreate($hFamily, 20)$tLayout_HourX10 = _GDIPlus_RectFCreate(0)
[/autoit] [autoit][/autoit] [autoit]
$tLayout_HourX1 = _GDIPlus_RectFCreate(16)
$tLayout_Colon1 = _GDIPlus_RectFCreate(34, $iHeight / 2 - 15)
$tLayout_MinX10 = _GDIPlus_RectFCreate(40)
$tLayout_MinX1 = _GDIPlus_RectFCreate(56)
$tLayout_Colon2 = _GDIPlus_RectFCreate(74, $iHeight / 2 - 15)
$tLayout_SecX10 = _GDIPlus_RectFCreate(80)
$tLayout_SecX1 = _GDIPlus_RectFCreate(96)$hBrush_Numbers = _GetBrush()
[/autoit] [autoit][/autoit] [autoit]OnAutoItExitRegister("_Shutdown")
[/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit", $hWnd)While Sleep(30)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsClear($hGraphics, 0)$iSecX1 = Mod(@SEC, 10)
[/autoit] [autoit][/autoit] [autoit]
$iSecX10 = Floor(@SEC / 10)
$iMinX1 = Mod(@MIN, 10)
$iMinX10 = Floor(@MIN / 10)
$iHourX1 = Mod(@HOUR, 10)
$iHourX10 = Floor(@HOUR / 10)$iY_SecX1 = @MSEC / 1000 * $iHeight / 3 - 9
[/autoit] [autoit][/autoit] [autoit]
If $iSecX1 = 0 Then
$iY_SecX10 = $iY_SecX1
Else
$iY_SecX10 = $iHeight / 3 - 9
EndIf
If @SEC = 0 Then
$iY_MinX1 = $iY_SecX1
Else
$iY_MinX1 = $iHeight / 3 - 9
EndIf
If $iMinX1 = 0 And @SEC = 0 Then
$iY_MinX10 = $iY_SecX1
Else
$iY_MinX10 = $iHeight / 3 - 9
EndIf
If @MIN = 0 And @SEC = 0 Then
$iY_HourX1 = $iY_SecX1
Else
$iY_HourX1 = $iHeight / 3 - 9
EndIf
If $iHourX1 = 0 And @MIN = 0 And @SEC = 0 Then
$iY_HourX10 = $iY_SecX1
Else
$iY_HourX10 = $iHeight / 3 - 9
EndIf#region -Hours
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tLayout_HourX1, "Y", $iHeight - $iY_HourX1 - 15)
If ($iHourX1 = 3 And $iHourX10 = 2) Or $iHourX1 = 9 Then
_GDIPlus_GraphicsDrawStringEx($hGraphics, 0, $hFont, $tLayout_HourX1, $hFormat, $hBrush_Numbers)
Else
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iHourX1 + 1, $hFont, $tLayout_HourX1, $hFormat, $hBrush_Numbers)
EndIfDllStructSetData($tLayout_HourX1, "Y", $iHeight / 3 * 2 - $iY_HourX1 - 15)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iHourX1, $hFont, $tLayout_HourX1, $hFormat, $hBrush_Numbers)DllStructSetData($tLayout_HourX1, "Y", $iHeight / 3 - $iY_HourX1 - 15)
[/autoit] [autoit][/autoit] [autoit]
If $iHourX1 = 0 Then
_GDIPlus_GraphicsDrawStringEx($hGraphics, 9, $hFont, $tLayout_HourX1, $hFormat, $hBrush_Numbers)
Else
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iHourX1 - 1, $hFont, $tLayout_HourX1, $hFormat, $hBrush_Numbers)
EndIfDllStructSetData($tLayout_HourX10, "Y", $iHeight - $iY_HourX10 - 15)
[/autoit] [autoit][/autoit] [autoit]
If $iHourX10 = 2 Then
_GDIPlus_GraphicsDrawStringEx($hGraphics, 0, $hFont, $tLayout_HourX10, $hFormat, $hBrush_Numbers)
Else
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iHourX10 + 1, $hFont, $tLayout_HourX10, $hFormat, $hBrush_Numbers)
EndIfDllStructSetData($tLayout_HourX10, "Y", $iHeight / 3 * 2 - $iY_HourX10 - 15)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iHourX10, $hFont, $tLayout_HourX10, $hFormat, $hBrush_Numbers)DllStructSetData($tLayout_HourX10, "Y", $iHeight / 3 - $iY_HourX10 - 15)
[/autoit] [autoit][/autoit] [autoit]
If $iHourX10 = 0 Then
_GDIPlus_GraphicsDrawStringEx($hGraphics, 2, $hFont, $tLayout_HourX10, $hFormat, $hBrush_Numbers)
Else
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iHourX10 - 1, $hFont, $tLayout_HourX10, $hFormat, $hBrush_Numbers)
EndIf
#endregion -Hours#region -Minutes
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tLayout_MinX1, "Y", $iHeight - $iY_MinX1 - 15)
If $iMinX1 = 9 Then
_GDIPlus_GraphicsDrawStringEx($hGraphics, 0, $hFont, $tLayout_MinX1, $hFormat, $hBrush_Numbers)
Else
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iMinX1 + 1, $hFont, $tLayout_MinX1, $hFormat, $hBrush_Numbers)
EndIfDllStructSetData($tLayout_MinX1, "Y", $iHeight / 3 * 2 - $iY_MinX1 - 15)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iMinX1, $hFont, $tLayout_MinX1, $hFormat, $hBrush_Numbers)DllStructSetData($tLayout_MinX1, "Y", $iHeight / 3 - $iY_MinX1 - 15)
[/autoit] [autoit][/autoit] [autoit]
If $iMinX1 = 0 Then
_GDIPlus_GraphicsDrawStringEx($hGraphics, 9, $hFont, $tLayout_MinX1, $hFormat, $hBrush_Numbers)
Else
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iMinX1 - 1, $hFont, $tLayout_MinX1, $hFormat, $hBrush_Numbers)
EndIfDllStructSetData($tLayout_MinX10, "Y", $iHeight - $iY_MinX10 - 15)
[/autoit] [autoit][/autoit] [autoit]
If $iMinX10 = 5 Then
_GDIPlus_GraphicsDrawStringEx($hGraphics, 0, $hFont, $tLayout_MinX10, $hFormat, $hBrush_Numbers)
Else
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iMinX10 + 1, $hFont, $tLayout_MinX10, $hFormat, $hBrush_Numbers)
EndIfDllStructSetData($tLayout_MinX10, "Y", $iHeight / 3 * 2 - $iY_MinX10 - 15)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iMinX10, $hFont, $tLayout_MinX10, $hFormat, $hBrush_Numbers)DllStructSetData($tLayout_MinX10, "Y", $iHeight / 3 - $iY_MinX10 - 15)
[/autoit] [autoit][/autoit] [autoit]
If $iMinX10 = 0 Then
_GDIPlus_GraphicsDrawStringEx($hGraphics, 5, $hFont, $tLayout_MinX10, $hFormat, $hBrush_Numbers)
Else
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iMinX10 - 1, $hFont, $tLayout_MinX10, $hFormat, $hBrush_Numbers)
EndIf
#endregion -Minutes#region -Seconds
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tLayout_SecX1, "Y", $iHeight - $iY_SecX1 - 15)
If $iSecX1 = 9 Then
_GDIPlus_GraphicsDrawStringEx($hGraphics, 0, $hFont, $tLayout_SecX1, $hFormat, $hBrush_Numbers)
Else
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iSecX1 + 1, $hFont, $tLayout_SecX1, $hFormat, $hBrush_Numbers)
EndIfDllStructSetData($tLayout_SecX1, "Y", $iHeight / 3 * 2 - $iY_SecX1 - 15)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iSecX1, $hFont, $tLayout_SecX1, $hFormat, $hBrush_Numbers)DllStructSetData($tLayout_SecX1, "Y", $iHeight / 3 - $iY_SecX1 - 15)
[/autoit] [autoit][/autoit] [autoit]
If $iSecX1 = 0 Then
_GDIPlus_GraphicsDrawStringEx($hGraphics, 9, $hFont, $tLayout_SecX1, $hFormat, $hBrush_Numbers)
Else
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iSecX1 - 1, $hFont, $tLayout_SecX1, $hFormat, $hBrush_Numbers)
EndIfDllStructSetData($tLayout_SecX10, "Y", $iHeight - $iY_SecX10 - 15)
[/autoit] [autoit][/autoit] [autoit]
If $iSecX10 = 5 Then
_GDIPlus_GraphicsDrawStringEx($hGraphics, 0, $hFont, $tLayout_SecX10, $hFormat, $hBrush_Numbers)
Else
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iSecX10 + 1, $hFont, $tLayout_SecX10, $hFormat, $hBrush_Numbers)
EndIfDllStructSetData($tLayout_SecX10, "Y", $iHeight / 3 * 2 - $iY_SecX10 - 15)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iSecX10, $hFont, $tLayout_SecX10, $hFormat, $hBrush_Numbers)DllStructSetData($tLayout_SecX10, "Y", $iHeight / 3 - $iY_SecX10 - 15)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
If $iSecX10 = 0 Then
_GDIPlus_GraphicsDrawStringEx($hGraphics, 5, $hFont, $tLayout_SecX10, $hFormat, $hBrush_Numbers)
Else
_GDIPlus_GraphicsDrawStringEx($hGraphics, $iSecX10 - 1, $hFont, $tLayout_SecX10, $hFormat, $hBrush_Numbers)
EndIf
#endregion -Seconds_GDIPlus_GraphicsDrawStringEx($hGraphics, ":", $hFont, $tLayout_Colon1, $hFormat, $hBrush_Numbers)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawStringEx($hGraphics, ":", $hFont, $tLayout_Colon2, $hFormat, $hBrush_Numbers);~ _WinAPI_UpdateLayeredWindow($hWnd, $hDC_Window, $pDest, $pSize, $hDC_Bitmap, $pSource, 0, $pBlend, $ULW_ALPHA)
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_BitBlt($hDC_Window, 0, 0, $iWidth, $iHeight, $hDC_Bitmap, 0, 0, $SRCCOPY)
_WinAPI_BitBlt($hDC_Bitmap, 0, 0, $iWidth, $iHeight, 0, 0, 0, $BLACKNESS)
WEndFunc _GetBrush()
[/autoit] [autoit][/autoit] [autoit]
$hBitmapTmp = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
$hGraphicsTmp = _GDIPlus_ImageGetGraphicsContext($hBitmapTmp)
$hBrushTmp1 = _GDIPlus_LineBrushCreate(0, $iHeight / 2 - 17, 0, $iHeight / 2, 0, 0xD0A0A0A0)
$hBrushTmp2 = _GDIPlus_LineBrushCreate(0, $iHeight / 2, 0, $iHeight / 2 + 17, 0xD0A0A0A0, 0)_GDIPlus_GraphicsFillRect($hGraphicsTmp, 0, $iHeight / 2 - 17, $iWidth, 17, $hBrushTmp1)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsFillRect($hGraphicsTmp, 0, $iHeight / 2, $iWidth, 17, $hBrushTmp2)
$hReturn = _GDIPlus_TextureCreate($hBitmapTmp, 4)_GDIPlus_GraphicsDispose($hGraphicsTmp)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_BitmapDispose($hBitmapTmp)
_GDIPlus_BrushDispose($hBrushTmp1)
_GDIPlus_BrushDispose($hBrushTmp2)Return $hReturn
[/autoit] [autoit][/autoit] [autoit]
EndFuncFunc _Exit()
[/autoit] [autoit][/autoit] [autoit]
Exit
EndFunc ;==>_ExitFunc _Shutdown()
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_ReleaseDC($hWnd, $hDC_Window)
_WinAPI_DeleteDC($hDC_Bitmap)
_WinAPI_DeleteObject($hBitmap)_GDIPlus_GraphicsDispose($hGraphics)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_BrushDispose($hBrush_Numbers)
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_FontDispose($hFont)
_GDIPlus_Shutdown()
EndFunc ;==>_Shutdown#region GDIP Functions
[/autoit] [autoit][/autoit] [autoit]
Func _GDIPlus_GraphicsSetTextRenderingHint($hGraphics, $iTextRenderingHint)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "hwnd", $hGraphics, "int", $iTextRenderingHint)If @error Then Return SetError(@error, @extended, False)
[/autoit] [autoit][/autoit] [autoit]
$GDIP_STATUS = $aResult[0]
Return $aResult[0] = 0
EndFunc ;==>_GDIPlus_GraphicsSetTextRenderingHintFunc _GDIPlus_LineBrushCreate($nX1, $nY1, $nX2, $nY2, $iARGBClr1, $iARGBClr2, $iWrapMode = 0)
[/autoit] [autoit][/autoit] [autoit]
Local $tPointF1, $pPointF1
Local $tPointF2, $pPointF2
Local $aResult$tPointF1 = DllStructCreate("float;float")
[/autoit] [autoit][/autoit] [autoit]
$pPointF1 = DllStructGetPtr($tPointF1)
$tPointF2 = DllStructCreate("float;float")
$pPointF2 = DllStructGetPtr($tPointF2)DllStructSetData($tPointF1, 1, $nX1)
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tPointF1, 2, $nY1)
DllStructSetData($tPointF2, 1, $nX2)
DllStructSetData($tPointF2, 2, $nY2)$aResult = DllCall($ghGDIPDll, "uint", "GdipCreateLineBrush", "ptr", $pPointF1, "ptr", $pPointF2, "uint", $iARGBClr1, "uint", $iARGBClr2, "int", $iWrapMode, "int*", 0)
[/autoit] [autoit][/autoit] [autoit]If @error Then Return SetError(@error, @extended, 0)
[/autoit] [autoit][/autoit] [autoit]
$GDIP_STATUS = $aResult[0]
Return $aResult[6]
EndFunc ;==>_GDIPlus_LineBrushCreateFunc _GDIPlus_TextureCreate($hImage, $iWrapMode = 0)
[/autoit] [autoit][/autoit] [autoit]
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateTexture", "hwnd", $hImage, "int", $iWrapMode, "int*", 0)If @error Then Return SetError(@error, @extended, 0)
[/autoit]
$GDIP_STATUS = $aResult[0]
Return $aResult[3]
EndFunc ;==>_GDIPlus_TextureCreate
#endregion GDIP Functions
Kann jemand das mal auf Win7 Testen, ob das genau so aussieht, wie die originalvariante ?
(Bei mir hat die Uhr einen schwarzen Rand, die Animation ist aber schön )lg
M -
In welcher Klasse gings denn zurück ?
-
Ich binde Bilder immer als Hexstring über ein Include ein.
#include <res.au3>Dann kann ich per Res(5) z.B. Ressource nr. 5 Aufrufen.
So kann man so ziemlich alles includen was man will.
Da man bilder auch ohne Tempdateien direkt laden kann bietet sich das an finde ich, da man so nur eine einzige Datei für das gesamte Spiel braucht.Iwann hab ich dann mal Base64 entdeckt und hab angefangen das zu nutzen. Das Prinzip hat sich aber nicht verändert.
Über ein Großes .png Bild ist es aber vermutlich am flexibelsten. Bis man erstmal iwelche Bilder in Includes getauscht hat vergeht schon etwas Zeit.
In einem Bild kann man aber relativ schnell alles verändern.Aus dem Sammelbild den kleinkram auszuschneiden dürfte extrem schnell gehen.
(dazu nutze ich natürlich die imageudf Die Funktion braucht nur wenige zehntel ms)Spoiler anzeigen
[autoit]Func _Image_CopyArea($vImg, $iX, $iY, $iB, $iH)
[/autoit]
Local $vRet = _Image_Create($iB, $iH)
DllCall($__avDLL[$__MSIMG32], 'int', 'AlphaBlend', 'ptr', DllStructGetData($vRet, 1, 1), 'int', 0, 'int', 0, 'int', $iB, 'int', $iH, 'ptr', DllStructGetData($vImg, 1, 1), 'int', $iX, 'int', $iY, 'int', $iB, 'int', $iH, 'dword', $__avBlendFunction[255])
Return $vRet
EndFunc ;==>_Image_CopyArealg
M