Gdi+ Tutorial [Part 5]

    • Gdi+ Tutorial [Part 5]

      PROLOG

      Hallo und Herzlich Wilkommen zu diesem Tutorial.

      In diesem Tutorial geht es um die Gdi+ au3 einer Udf die bei AutoIt mitgeliefert ist.
      Ihr bindet sie mit

      AutoIt

      1. #include <GdiPlus.au3>

      ein.

      Diese Funktionen kann man z.B. benutzen um
      • Spiele zu erstellen
      • Guis einen eigenen Stil zu geben
      • Animationen zu erstellen
      • Bilder zu verändern
      • Bilder per Gdi Stift "zeichnen"
      all diese Funktionen werden in diesem Tutorial angesprochen und anhand von Beispielen erklärt.

      Hinweis: In diesem tutorial könnt ihr die Hilfe zu jedem Befehl der genannt ist mit einem klick auf den Befehl aufrufen.



      Kapitel 1:
      Die Grundlagen


      Um GdiPlus zu benutzen braucht ihr erst ein mal den Befehl

      AutoIt

      1. _GDIPlus_Startup()


      Diese Resourcen müsst danch wieder mit

      AutoIt

      1. _GDIPlus_Shutdown()

      wieder freigeben.

      Desweiteren kann es passieren das man die Ressourcen einzelner funktionen auch einzenln wieder freigeben muss.
      Wenn dem so ist wird das aber hier im Tutorial vermerkt.


      Kapitel 2:
      Die ersten Funktionen

      Die erste Funktion die wir uns aneignen wollen ist die Funktion die wohl am häufigsten gebraucht wird und die Funktion von GdiPlus wohl am besten verdeutlicht.

      AutoIt

      1. _GDIPlus_GraphicsDrawImage($hGraphics, $hImage, $iX, $iY)


      Als erstes zeichenen wir uns eine Gui

      AutoIt

      1. #include <GuiConstants.au3>
      2. $Gui = GUICreate("Beispiel", 179, 163, 100,100)
      3. GUISetState(@SW_SHOW)
      4. While 1
      5. Switch GUIGetMsg()
      6. Case $GUI_EVENT_CLOSE
      7. Exit
      8. EndSwitch
      9. WEnd
      Alles anzeigen



      Danach fügen wir die GdiPlus Elemente hinzu:

      AutoIt

      1. #include <GuiConstants.au3>
      2. #include <GdiPlus.au3>;das include
      3. OnAutoItExitRegister("_end") ; die Funktion _end am Ende des Scriptes ausführen
      4. $Gui = GUICreate("Beispiel", 179, 163, 100,100)
      5. GUISetState(@SW_SHOW)
      6. _GDIPlus_Startup() ;Gdi starten
      7. While 1
      8. Switch GUIGetMsg()
      9. Case $GUI_EVENT_CLOSE
      10. Exit
      11. EndSwitch
      12. WEnd
      13. Func _end();die Exit funktion
      14. _GDIPlus_Shutdown()
      15. EndFunc
      Alles anzeigen


      Jetzt wo wir unsere Grundvorrausetzungen haben wollen wir uns doch mal die Parameter von

      AutoIt

      1. _GDIPlus_GraphicsDrawImage($hGraphics, $hImage, $iX, $iY)

      angucken:


      AutoIt

      1. $hGraphics ;die Graphic die vorher erstellt wurde
      2. $hImage ; ein geladenes Bild
      3. $iX ; die X Koordinate
      4. $iY ; die Y Koordinate


      Für die ersten beiden Parameter brauchen wir noch eine zusätzliche Vorbereitung:

      AutoIt

      1. _GDIPlus_ImageLoadFromFile
      2. _GDIPlus_GraphicsCreateFromHWND


      Für ersteres brauchen wir erst mal ein Bild, welches ihr zusammen mit dem aktuellen Script

      Hilfe schrieb:

      Befehl englischer Name deutscher Name
      25 --------- LEFT ARROW key -------- Pfeiltaste nach links
      26 --------- UP ARROW key ----------- Pfeiltaste nach oben
      27 --------- RIGHT ARROW key ------ Pfeiltaste nach rechts
      28 --------- DOWN ARROW key ------ Pfeiltaste nach unten Die Figur bewegen wir indem wir sie immer an den Variablen $x und $y zeichnen lassen und die Variable bei einem Tastendruck ensprechen verändern.

      Dazu benutzen wir eine Select Schleife:

      AutoIt

      1. Select
      2. Case _IsPressed(25)
      3. $x -= 1
      4. Case _IsPressed(26)
      5. $y -= 1
      6. Case _IsPressed(27)
      7. $x += 1
      8. Case _IsPressed(28)
      9. $y += 1
      10. EndSelect
      11. _GDIPlus_GraphicsDrawImageRect($graphic,$figur,$x,$y,20,20 * $verhaelnis) ;die Figur wird an der neuen Position gezeichnet
      Alles anzeigen

      X und Y Achse

      Hinweis:
      zur x und y Achse hier eine verdeutlichung




      Das heisst nach links auf dem Bildschirm nimmt die Zahl der X Achse zu und nach unten nimmt die Zahl der Y Achse zu.


      Der Code sieht dann so aus:

      AutoIt

      1. #include <GuiConstants.au3>
      2. #include <GdiPlus.au3>;das include
      3. #include <Misc.au3>
      4. OnAutoItExitRegister("_end") ; die Funktion _end am Ende des Scriptes ausführen
      5. $x = 0;x und y deklarieren
      6. $y = 0
      7. $Gui = GUICreate("Beispiel", 179, 163, 100, 100)
      8. GUISetState(@SW_SHOW)
      9. _GDIPlus_Startup() ;Gdi starten
      10. $figur = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\figur.gif")
      11. $height = _GDIPlus_ImageGetHeight($figur)
      12. $width = _GDIPlus_ImageGetWidth($figur)
      13. $verhaelnis = $height / $width
      14. $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
      15. While 1
      16. Switch GUIGetMsg()
      17. Case $GUI_EVENT_CLOSE
      18. Exit
      19. EndSwitch
      20. Select
      21. Case _IsPressed(25)
      22. $x -= 1
      23. Case _IsPressed(26)
      24. $y -= 1
      25. Case _IsPressed(27)
      26. $x += 1
      27. Case _IsPressed(28)
      28. $y += 1
      29. EndSelect
      30. _GDIPlus_GraphicsDrawImageRect($graphic, $figur, $x, $y, 20, 20 * $verhaelnis) ;die Figur wird an der neuen Position gezeichnet
      31. WEnd
      32. Func _end();die Exit funktion
      33. _GDIPlus_GraphicsDispose($graphic);Grafik Objekt freigeben
      34. _GDIPlus_ImageDispose($figur);Bild Objekt freigeben
      35. _GDIPlus_Shutdown();Ressourcen freigeben
      36. EndFunc ;==>_end
      Alles anzeigen


      Uns fallen zwei Sachen auf:
      1. Die Figur wird zwar neu gezeichnet die alte Figur bleibt aber an der Stelle bestehen
      2. Man kann mit der Figur ausserhalb des Bildes gehen.

      Zu1:
      Das liegt daran das wir das Bild nicht löschen.
      Wir zeichnen es nur neu.

      Also fügen wir ein Hintegrundbild hinzu.

      Dies könnt ihr euch zusammen mit dem Funktionierenden Code hierdownloaden.

      Leider flackert das Bild immer noch.
      Deswegen benötigen wie einen Buffer.

      Zum buffer haben ich und name22 ein Beispiel geschrieben.
      Ihr könnt euch einmal selbst testen indem versucht den Code ohne Kommentare zu verstehen.
      Nur die Befehle

      AutoIt

      1. $hBitmap = _GDIPlus_BitmapCreateFromGraphics(400, 400, $hGraphic)
      2. $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

      sind neu.

      Sie werden weiter unten erklärt.
      Code umkommentiert

      AutoIt

      1. #include < GUIConstants.au3 >
      2. #include <GDIPlus.au3>
      3. Opt("GUIOnEventMode", 1)
      4. $iX = 50
      5. $iY = 50
      6. $vX = 2
      7. $vY = 1
      8. $iSleep = 10
      9. $bBuffering = True
      10. $hWnd = GUICreate("Buffer", 400, 440)
      11. $cBuffering = GUICtrlCreateCheckbox("Buffering", 5, 355)
      12. $cLabel = GUICtrlCreateLabel("Wartezeit zwischen den Frames: " & $iSleep, 5, 390)
      13. $cFramerate = GUICtrlCreateSlider(5, 410, 200, 20)
      14. $cApply = GUICtrlCreateButton("OK", 220, 400)
      15. GUICtrlSetLimit($cFramerate, 100, 10)
      16. GUICtrlSetState($cBuffering, $GUI_CHECKED)
      17. GUISetState()
      18. _GDIPlus_Startup()
      19. $kreis = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\kreis.png")
      20. $weiss = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\weiss.jpg")
      21. $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
      22. $hBitmap = _GDIPlus_BitmapCreateFromGraphics(400, 400, $hGraphic)
      23. $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
      24. GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
      25. OnAutoItExitRegister("_Exit")
      26. GUICtrlSetOnEvent($cBuffering, "_Buffering")
      27. GUICtrlSetOnEvent($cApply, "_ApplySettings")
      28. While Sleep($iSleep)
      29. $iX += $vX
      30. $iY += $vY
      31. If $iX >= 380 Or $iX <= 0 Then $vX *= -1
      32. If $iY >= 325 Or $iY <= 0 Then $vY *= -1
      33. Switch $bBuffering
      34. Case True
      35. _GDIPlus_GraphicsDrawImageRect($hBuffer, $weiss, 0, 0, 400, 350)
      36. _GDIPlus_GraphicsDrawImageRect($hBuffer, $kreis, $iX, $iY, 20, 20)
      37. _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, 400, 400)
      38. Case False
      39. _GDIPlus_GraphicsDrawImageRect($hGraphic, $weiss, 0, 0, 400, 350)
      40. _GDIPlus_GraphicsDrawImageRect($hGraphic, $kreis, $iX, $iY, 20, 20)
      41. EndSwitch
      42. WEnd
      43. Func _Buffering()
      44. $bBuffering = Not $bBuffering
      45. EndFunc ;==>_Buffering
      46. Func _ApplySettings()
      47. $iSleep = GUICtrlRead($cFramerate)
      48. GUICtrlSetData($cLabel, "Wartezeit zwischen den Frames: " & $iSleep)
      49. EndFunc ;==>_ApplySettings
      50. Func _Exit()
      51. _GDIPlus_GraphicsDispose($hGraphic)
      52. _GDIPlus_GraphicsDispose($hBuffer)
      53. _GDIPlus_BitmapDispose($hBitmap)
      54. _GDIPlus_Shutdown()
      55. Exit
      56. EndFunc ;==>_Exit
      Alles anzeigen


      Code kommentiert

      AutoIt

      1. #include <GUIConstants.au3>
      2. #include <GDIPlus.au3>
      3. Opt("GUIOnEventMode", 1)
      4. $iX = 50
      5. $iY = 50
      6. $vX = 2
      7. $vY = 1
      8. $iSleep = 10
      9. $bBuffering = True
      10. $hWnd = GUICreate("Buffer", 400, 440)
      11. $cBuffering = GUICtrlCreateCheckbox("Buffering", 5, 355)
      12. $cLabel = GUICtrlCreateLabel("Wartezeit zwischen den Frames: " & $iSleep, 5, 390)
      13. $cFramerate = GUICtrlCreateSlider(5, 410, 200, 20)
      14. $cApply = GUICtrlCreateButton("OK", 220, 400)
      15. GUICtrlSetLimit($cFramerate, 100, 10)
      16. GUICtrlSetState($cBuffering, $GUI_CHECKED)
      17. GUISetState()
      18. _GDIPlus_Startup()
      19. $kreis = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\kreis.png")
      20. $weiss = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\weiss.jpg")
      21. $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd);noramle Grafik erstellen
      22. $hBitmap = _GDIPlus_BitmapCreateFromGraphics(400, 400, $hGraphic);Buffer erstellen Schritt 1...
      23. $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap);...und 2
      24. GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
      25. OnAutoItExitRegister("_Exit")
      26. GUICtrlSetOnEvent($cBuffering, "_Buffering")
      27. GUICtrlSetOnEvent($cApply, "_ApplySettings")
      28. While Sleep($iSleep)
      29. $iX += $vX
      30. $iY += $vY
      31. If $iX >= 380 Or $iX <= 0 Then $vX *= -1
      32. If $iY >= 325 Or $iY <= 0 Then $vY *= -1
      33. Switch $bBuffering
      34. Case True
      35. _GDIPlus_GraphicsDrawImageRect($hBuffer, $weiss, 0, 0, 400, 350);mit Buffer
      36. _GDIPlus_GraphicsDrawImageRect($hBuffer, $kreis, $iX, $iY, 20, 20)
      37. _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, 400, 400)
      38. Case False
      39. _GDIPlus_GraphicsDrawImageRect($hGraphic, $weiss, 0, 0, 400, 350);ohne Buffer
      40. _GDIPlus_GraphicsDrawImageRect($hGraphic, $kreis, $iX, $iY, 20, 20)
      41. EndSwitch
      42. WEnd
      43. Func _Buffering()
      44. $bBuffering = Not $bBuffering ;wenn der hacken angeklickt wurde kehrt dieser Befehl die Variable ins Gegenteil
      45. EndFunc ;==>_Buffering
      46. Func _ApplySettings()
      47. $iSleep = GUICtrlRead($cFramerate)
      48. GUICtrlSetData($cLabel, "Wartezeit zwischen den Frames: " & $iSleep)
      49. EndFunc ;==>_ApplySettings
      50. Func _Exit()
      51. _GDIPlus_GraphicsDispose($hGraphic)
      52. _GDIPlus_GraphicsDispose($hBuffer)
      53. _GDIPlus_BitmapDispose($hBitmap)
      54. _GDIPlus_Shutdown()
      55. Exit
      56. EndFunc ;==>_Exit
      Alles anzeigen


      Code Download (mit Bildern :!: )


      Zur Funktion des Buffers

      Wie man unschwer erraten kann erstellt die Funktion _GDIPlus_BitmapCreateFromGraphics ein Bitmap Objekt aus einem erstellten Grafik Objekt.
      Damit auf dieses erstellte Bitmap etwas gezeichnet werden kann brauchen wir den "Kontext" der Grafik.
      Dazu benutzen wir _GDIPlus_ImageGetGraphicsContext.
      Jetzt können wir auf das Bitmap wie auf unser Grafik Objekt zugreifen und Bilder/Formen etc. darauf zeichnen.
      Nur müssen wir das Bitmap selber dann noch an das Grafk Objekt weitergeben.
      Dies geschiet im Code hier:

      AutoIt

      1. _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, 400, 400)



      Welchen Vorteil hat nun diese Befehlsreihe:

      AutoIt

      1. _GDIPlus_GraphicsDrawImageRect($hBuffer,$weiss, 0, 0, 400,350)
      2. _GDIPlus_GraphicsDrawImageRect($hBuffer,$kreis,$iX,$iY,20,20)
      3. _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, 400, 400)


      Gegenüber der:

      AutoIt

      1. _GDIPlus_GraphicsDrawImageRect($hGraphic,$weiss, 0, 0, 400,350)
      2. _GDIPlus_GraphicsDrawImageRect($hGraphic,$kreis,$iX,$iY,20,20)


      Wir brauchen nicht ständig auf das Grafik Objekt und damit auf das Fenster zugreifen.
      Dadurch wird der Code schneller und das Bild flackert nicht.


      Nun können wir den Buffer auch auf unser kleines Beispiel anwenden:
      (Wenn du willst kannst du es einmal selbst versuchen bevor du den Code kopierst)

      Code

      AutoIt

      1. #include <GuiConstants.au3>
      2. #include <GdiPlus.au3>;das include
      3. #include <Misc.au3>
      4. OnAutoItExitRegister("_end") ; die Funktion _end am Ende des Scriptes ausführen
      5. $x = 0;x und y deklarieren
      6. $y = 0
      7. $Gui = GUICreate("Beispiel", 179, 163, 100, 100)
      8. GUISetState(@SW_SHOW)
      9. _GDIPlus_Startup() ;Gdi starten
      10. $figur = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\figur.gif")
      11. $bk = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\bk.jpg")
      12. $height = _GDIPlus_ImageGetHeight($figur)
      13. $width = _GDIPlus_ImageGetWidth($figur)
      14. $verhaelnis = $height / $width
      15. $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
      16. $bitmap = _GDIPlus_BitmapCreateFromGraphics(179, 163, $graphic);----------------- geändert ----------------------
      17. $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap);----------------- geändert ----------------------
      18. While 1
      19. Switch GUIGetMsg()
      20. Case $GUI_EVENT_CLOSE
      21. Exit
      22. EndSwitch
      23. Select
      24. Case _IsPressed(25)
      25. $x -= 3
      26. Case _IsPressed(26)
      27. $y -= 3
      28. Case _IsPressed(27)
      29. $x += 3
      30. Case _IsPressed(28)
      31. $y += 3
      32. EndSelect
      33. _GDIPlus_GraphicsDrawImageRect($buffer, $bk, 0, 0, 179, 163);----------------- geändert ----------------------
      34. _GDIPlus_GraphicsDrawImageRect($buffer, $figur, $x, $y, 20, 20 * $verhaelnis);----------------- geändert ----------------------
      35. _GDIPlus_GraphicsDrawImage($graphic, $bitmap, 0, 0);----------------- geändert ----------------------
      36. Sleep(30)
      37. WEnd
      38. Func _end();die Exit funktion
      39. _GDIPlus_GraphicsDispose($graphic);Grafik Objekt freigeben
      40. _GDIPlus_GraphicsDispose($buffer);----------------- geändert ----------------------
      41. _GDIPlus_BitmapDispose($bitmap);----------------- geändert ----------------------
      42. _GDIPlus_ImageDispose($figur);Bild Objekt 1 freigeben
      43. _GDIPlus_ImageDispose($bk);Bild Objekt 2 freigeben
      44. _GDIPlus_Shutdown();Ressourcen freigeben
      45. EndFunc ;==>_end
      Alles anzeigen


      Nun könnten wir unser spiel noch weiter verbessern indem wir logische beschränkungen einbauen.

      Wie es z.B. im Beispiel zu Buffern gemacht wurde.

      AutoIt

      1. $iX += $vX
      2. $iY += $vY
      3. If $iX >= 380 Or $iX <= 0 Then $vX *= -1
      4. If $iY >= 325 Or $iY <= 0 Then $vY *= -1


      Ich habe noch einmal hinzugefügt das man nicht über den Fensterrand hinaus kann.

      AutoIt

      1. #include <GuiConstants.au3>
      2. #include <GdiPlus.au3>;das include
      3. #include <Misc.au3>
      4. OnAutoItExitRegister("_end") ; die Funktion _end am Ende des Scriptes ausführen
      5. $x = 0;x und y deklarieren
      6. $y = 0
      7. $Gui = GUICreate("Beispiel", 179, 163, 100, 100)
      8. GUISetState(@SW_SHOW)
      9. _GDIPlus_Startup() ;Gdi starten
      10. $figur = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\figur.gif")
      11. $bk = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\bk.jpg")
      12. $height = _GDIPlus_ImageGetHeight($figur)
      13. $width = _GDIPlus_ImageGetWidth($figur)
      14. $verhaelnis = $height / $width
      15. $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
      16. $bitmap = _GDIPlus_BitmapCreateFromGraphics(179, 163, $graphic)
      17. $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
      18. While 1
      19. Switch GUIGetMsg()
      20. Case $GUI_EVENT_CLOSE
      21. Exit
      22. EndSwitch
      23. Select
      24. Case _IsPressed(25) And Not $x <= 0; ------------- geändert -------------
      25. $x -= 3
      26. Case _IsPressed(26) And Not $y <= 0; ------------- geändert -------------
      27. $y -= 3
      28. Case _IsPressed(27) And $x <= 160; ------------- geändert -------------
      29. $x += 3
      30. Case _IsPressed(28) And $y <= 125; ------------- geändert -------------
      31. $y += 3
      32. EndSelect
      33. _GDIPlus_GraphicsDrawImageRect($buffer, $bk, 0, 0, 179, 163)
      34. _GDIPlus_GraphicsDrawImageRect($buffer, $figur, $x, $y, 20, 20 * $verhaelnis)
      35. _GDIPlus_GraphicsDrawImage($graphic, $bitmap, 0, 0)
      36. Sleep(30)
      37. WEnd
      38. Func _end();die Exit funktion
      39. _GDIPlus_GraphicsDispose($graphic);Grafik Objekt freigeben
      40. _GDIPlus_GraphicsDispose($buffer)
      41. _GDIPlus_BitmapDispose($bitmap)
      42. _GDIPlus_ImageDispose($figur);Bild Objekt 1 freigeben
      43. _GDIPlus_ImageDispose($bk);Bild Objekt 2 freigeben
      44. _GDIPlus_Shutdown();Ressourcen freigeben
      45. EndFunc ;==>_end
      Alles anzeigen


      Wenn euch das noch nicht so klar ist schaut euch evtl. noch mal die veranschaulichung zur X und Y Achse an.


      Der Rest liegt bei euch.

      Dies ist noch nicht das Ende der Eindührung in die Spieleentwicklung Fortgeschrittenere Beispiele werden folgen...

      Kapitel 3:
      Guis in Gdi+


      Zuerst ein kleiner Ausblick, was ich damit meine:
      Dowload Pc Info Tool

      Diese Gui ...
      • ist Scrollbar
      • hat Buttons die angeklickt werden können und einen sogenannten Hover effekt haben (d.h. sie können "eingedrückt" werden )
      • hat "Labels" die verändert werden können (halt je nach dem auf welchem Pc das Tool ausgeführt wird)
      • sieht klasse aus :thumbup: (man erkennt nicht das sie mit AutoIt gemacht wurde)

      Das wollen wir nun auch schritt für schritt lernen.
      Zum erstellen eigener Individueller Guis sollte man ein Grafikprogramm beherschen. (z.B. GIMP oder Photoshop)
      In diesem Tutorial nehme ich euch jedoch diese Arbeit ab.

      Der GdiPlus teil des oben gezeigten Programmes setzt sich grössten teils aus Befehlen zusammen die wir bereits kennen.
      Es werden nämlich die Bilder (im Ordner Images zu finden, schaut sie euch mal an) auf die Gui gezeichnet.

      Eine Technik die wir noch nicht kennen ist jedoch das zeichnen von Strings mit denen die "Labels" erstellt wurden.
      Natürlich kann man auch mit einem Grafikprogramm eine Schrift erstellen diese ist jedoch nicht einfach anpassbar und erfüllt nicht die Funktion die ein Label oft hat, nämlich Ergebnisse drastellen die im Script ermittelt wurden.

      Das sehen wir auch im Script, denn die texte die sich nicht von Pc zu Pc verändern wurden mit einem Grafikprogramm direkt auf den Hintergrund der Gui gezeichnet:



      Dieses Bild wird einfach mit

      AutoIt

      1. _GDIPlus_GraphicsDrawImageRect($hBuffer, $hImageBG, 0, $iY, $iGUIWidth, $iGUIHeight) ;ohne änderung aus dem Script übernommen

      auf die Gui gezeichnet.
      Die ermittelten Infomationen des Pc's werden danach per

      AutoIt

      1. For $i = 1 To 12
      2. _GDIPlus_GraphicsDrawStringEx($hBuffer, $aPCInformation[$i][0], $hFont, $aPCInformation[$i][2], $hFormat, $hBrushText)
      3. Next
      4. ;ohne änderung aus dem Script übernommen und deshalb sehr fortgeschritten und recht kompliziert

      auf das Bild gezeichnet.

      So weit zum theoretischen.

      Wir beginnen mal wieder mit unserer Beispiel Gui:

      AutoIt

      1. #include <GuiConstants.au3>
      2. #include <GdiPlus.au3>
      3. OnAutoItExitRegister("_end")
      4. $Gui = GUICreate("Beispiel", 179, 163, 100,100)
      5. GUISetState(@SW_SHOW)
      6. _GDIPlus_Startup()
      7. $hGraphics = _GDIPlus_GraphicsCreateFromHWND($Gui) ; erstellt eine Graphic aus dem Fenster $Gui
      8. $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Image.gif") ; Lädt das Bild Image.gif aus dem ScriptDir Ordner
      9. _GDIPlus_GraphicsDrawImage($hGraphics, $hImage, 10, 30) ; Zeichnet das geladene Bild $hImage auf die Graphic $hGraphics mit den Kooardinaten $iX = 10 und $iY = 30
      10. While 1
      11. Switch GUIGetMsg()
      12. Case $GUI_EVENT_CLOSE
      13. Exit
      14. EndSwitch
      15. WEnd
      16. Func _end();die Exit funktion
      17. _GDIPlus_GraphicsDispose($hGraphics)
      18. _GDIPlus_Shutdown()
      19. EndFunc
      Alles anzeigen


      Jetzt wollen wir noch einen String darauf zeichnen.
      Dafür benötigen wir die Funktion.

      AutoIt

      1. _GDIPlus_GraphicsDrawString($hGraphics, $sString, $iX, $iY[, $sFont = "Arial"[, $fSize = 10[, $iFormat = 0]]])

      unbedingt benötigte Parameter:

      AutoIt

      1. $hGraphics ; die bereits erstellte Graphic
      2. $sString ; der String der gezeichnet werden soll (entweder als Variable oder in Anführungszeichen)
      3. $iX ; die X Kooradinate
      4. $iY ; die Y Kooradinate


      die Zusatzparameter sind

      AutoIt

      1. $sFont ; die Schriftart des gezeichneten Strings (Standart: Arial)
      2. $fSize ; die Schriftgröße (Standart: 10 px)
      3. $iFormat ; die Formatflags siehe hier *link zu _GDIPlus_GraphicsDrawString* (Standart: 0)

      Doch die Zusatzparameter lassen wir erst ein mal ausser acht und malen mit unseren kenntnissen einen einfachen String auf die Gui:
      (bitte auf Kommentare achten.)

      AutoIt

      1. #include <GuiConstants.au3>
      2. #include <GdiPlus.au3>
      3. OnAutoItExitRegister("_end")
      4. $Gui = GUICreate("Beispiel", 179, 163, 100,100)
      5. GUISetState(@SW_SHOW)
      6. _GDIPlus_Startup()
      7. $hGraphics = _GDIPlus_GraphicsCreateFromHWND($Gui);Das kennen wir ja schon (erstellen eines Grafik Objektes)
      8. _GDIPlus_GraphicsDrawString($hGraphics, "Hallo Welt!", 50, 10) ;Zeichnet den String "Hallo Welt!" mit den Kooardinaten $iX = 50 und $iY = 10
      9. ;(wir sehen das die Grundparameter die gleichen sind wie bei _GDIPlus_GraphicsDrawImage nur das statt einem Bildobjekt ein String angegeben wird
      10. While 1
      11. Switch GUIGetMsg()
      12. Case $GUI_EVENT_CLOSE
      13. Exit
      14. EndSwitch
      15. WEnd
      16. Func _end();die Exit funktion
      17. _GDIPlus_GraphicsDispose($hGraphics)
      18. _GDIPlus_Shutdown()
      19. EndFunc
      Alles anzeigen


      Wie ihr seht, kennen wir dieses Prinzip schon von _GDIPlus_GraphicsDrawImage.
      Es sollte uns also keine großen Probleme machen ;)


      Bald geht es weiter ........


      mfg Ubuntu


      Danksagungen

      Danke an name22 für sein umfangreiches Buffer Beispiel
      Danke an yxyx an sein kleines Tut über Strings.

      Dieser Beitrag wurde bereits 25 mal editiert, zuletzt von Ubuntu ()

    • Na also, geht doch :P
      Ich freu mich auf die Fortsetzung :D
      Spoiler anzeigen
      Grundkenntnisse in: HTML, XML, C++, Lite-c, JavaScript
      Sehr gute Kenntnisse: PHP, JAVA, Joomla, TYPO3 und näturlich AutoIt

      Klaviatur, South Park - Downloader, Anhang UDF, GDI+ Mühle
      Wer Hilfe braucht:
      Skype-->Cartan16
      -Fan ^^
      "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
      möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"
    • Cartan12 schrieb:

      Ich freu mich auf die Fortsetzung :D
      Ich auch, vielleicht lern ich ja noch was dazu :)
      MfG ClezZ

      Meine bisher veröffentlichten GDI+ Werke :D :
      Exp. Wachstum Würfeln Laserschwert Maler 3D Tisch PartikelexplosionMatrix/Falling Code

      Computer
      sind unglaublich dumme Geräte,
      die unglaublich intelligente Sachen können.
      Programmierer sind unglaublich intelligente Leute,
      die unglaublich dumme Sachen produzieren.
    • Ich glaub du hast vergessen in der Exit Funktion die Ressourcen der Graphik mit

      AutoIt

      1. _GDIPlus_GraphicsDispose()
      freizugeben und das geladene Bild mit

      AutoIt

      1. _GDIPlus_ImageDispose()
      freizugeben.
      MfG ClezZ

      Meine bisher veröffentlichten GDI+ Werke :D :
      Exp. Wachstum Würfeln Laserschwert Maler 3D Tisch PartikelexplosionMatrix/Falling Code

      Computer
      sind unglaublich dumme Geräte,
      die unglaublich intelligente Sachen können.
      Programmierer sind unglaublich intelligente Leute,
      die unglaublich dumme Sachen produzieren.
    Webutation