In vielen Teard´s zu GDI+ wird eine Doppelbufferung verwendet. Kann mir das bitte mal jemand erklären.
GDI+ Doppelbufferung
-
- [ gelöst ]
-
Magnus -
4. November 2009 um 17:56 -
Geschlossen -
Erledigt
-
-
-
Und wie programmiert man das?
-
Wie du schon richtig bemerkt hast verwenden viele GDI+Beispiele eine Doppelbufferung.
Diese hier z.B.: GDI+ Beispiel: Drehende Dreiecke + Drehende Quadrate -
In vielen Teard´s zu GDI+ wird eine Doppelbufferung verwendet. Kann mir das bitte mal jemand erklären.
Double buffering ist nicht anderes als das Bild vollständig im Buffer zu zeichnen und anschließend in den sichtbaren Bereich (GUI) zu kopieren. Dadurch wird vermieden, dass die Darstellung bei Bewegungen "ruckelt".Schaue dir doch mal die GDI+ Beispiele z.B. in Skripte an!
Gruß,
UEZ -
Danke!
-
Ich habe leider doch noch ein Problem , nach dem das 1. Mal neugezeichnet wird, wird der Hintergrund schwarz !
Hier mein Script:
Spoiler anzeigen
[autoit]#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#Include <Misc.au3>Global Const $AC_SRC_ALPHA = 1
[/autoit] [autoit][/autoit] [autoit]HotKeySet("{F9}", "_exit")
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]Global $List1, $TeilermerGUI, $Indgrid = 0, $SOSBild, $SOSGUI, $Aus = 0, $Ende = 0
[/autoit] [autoit][/autoit] [autoit]
Dim $TeilnemerUser[8] = [0, 0, 0, 0, 0, 0, 0, 0]
Global $AktuellerSpieler = 1, $PfadZuFragen = @ScriptDir & "\Fragen.ini"
Global $StiftBlauDike8, $StiftGrunDike12, $StiftGrunDike8, $StiftLilaDike12, $StiftRotDike8
Dim $SpielerAntworten[3] = [0, 0, 0], $SpielerPunkte[3] = [0, 0, 0], $SpielerName[3] = ["Name1", "Name2", "Name3"]Dim $FragenDaten[10] = [1, IniRead($PfadZuFragen, 1, 1, ""), IniRead($PfadZuFragen, 1, 2, ""), IniRead($PfadZuFragen, 1, 3, ""), IniRead($PfadZuFragen, 1, 4, ""), IniRead($PfadZuFragen, 1, 5, ""), IniRead($PfadZuFragen, 1, 6, ""), IniRead($PfadZuFragen, 1, 7, ""), IniRead($PfadZuFragen, 1, 8, ""), IniRead($PfadZuFragen, "Anzahl", "Anzahl", 1)]
[/autoit] [autoit][/autoit] [autoit]$QuizFenster = GUICreate("QuizFenster", @DesktopWidth, @DesktopHeight, 0, 0, 0x80000000, BitOR(0x00000080, 0x00000008))
[/autoit] [autoit][/autoit] [autoit]
GUISetBkColor(0xFFFF00, $QuizFenster)
GUISetState(@SW_SHOW)$EchtesQuizGraphicobjekt = _GDIPlus_GraphicsCreateFromHWND($QuizFenster)
[/autoit] [autoit][/autoit] [autoit]
$bitmap = _GDIPlus_BitmapCreateFromGraphics(@DesktopWidth, @DesktopHeight, $EchtesQuizGraphicobjekt)
$QuizGraphikobjekt = _GDIPlus_ImageGetGraphicsContext($bitmap)_ZeigeNamen()
[/autoit] [autoit][/autoit] [autoit]
_Zeichne()HotKeySet("{NUMPAD1}", "_antwort_1")
[/autoit] [autoit][/autoit] [autoit]
HotKeySet("{NUMPAD2}", "_antwort_2")
HotKeySet("{NUMPAD3}", "_antwort_3")
HotKeySet("{NUMPAD4}", "_antwort_4")While 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(250)
WEndFunc _ZeigeNamen()
[/autoit] [autoit][/autoit] [autoit]
$StiftRotDike20 = _GDIPlus_PenCreate(0xFFFF0000, 20)
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 90, 90, 1450, 200, $StiftRotDike20)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, "Der 1. Teilnehmer:", 100, 100, "Arial Black", 100)
_GDIPlus_PenDispose($StiftRotDike20)
_GDIPlus_GraphicsDrawImageRect($EchtesQuizGraphicobjekt, $bitmap, 0, 0, @DesktopWidth, @DesktopHeight)
Sleep(2000)
_GDIPlus_GraphicsClear($QuizGraphikobjekt)
$StiftRotDike20 = _GDIPlus_PenCreate(0xFFFF0000, 20)
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 90, 90, 1450, 200, $StiftRotDike20)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, "Der 1. Teilnehmer:", 100, 100, "Arial Black", 100)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, $SpielerName[0], 100, 500, "Arial Black", 100)
_GDIPlus_PenDispose($StiftRotDike20)
_GDIPlus_GraphicsDrawImageRect($EchtesQuizGraphicobjekt, $bitmap, 0, 0, @DesktopWidth, @DesktopHeight)Do
[/autoit] [autoit][/autoit] [autoit]
Sleep(10)
Until _IsPressed(20)_GDIPlus_GraphicsClear($QuizGraphikobjekt)
[/autoit] [autoit][/autoit] [autoit]
$StiftRotDike20 = _GDIPlus_PenCreate(0xFFFF0000, 20)
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 90, 90, 1450, 200, $StiftRotDike20)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, "Der 2. Teilnehmer:", 100, 100, "Arial Black", 100)
_GDIPlus_PenDispose($StiftRotDike20)
_GDIPlus_GraphicsDrawImageRect($EchtesQuizGraphicobjekt, $bitmap, 0, 0, @DesktopWidth, @DesktopHeight)
Sleep(2000)
_GDIPlus_GraphicsClear($QuizGraphikobjekt)
$StiftRotDike20 = _GDIPlus_PenCreate(0xFFFF0000, 20)
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 90, 90, 1450, 200, $StiftRotDike20)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, "Der 2. Teilnehmer:", 100, 100, "Arial Black", 100)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, $SpielerName[1], 100, 500, "Arial Black", 100)
_GDIPlus_PenDispose($StiftRotDike20)
_GDIPlus_GraphicsDrawImageRect($EchtesQuizGraphicobjekt, $bitmap, 0, 0, @DesktopWidth, @DesktopHeight)Do
[/autoit] [autoit][/autoit] [autoit]
Sleep(10)
Until _IsPressed(20)_GDIPlus_GraphicsClear($QuizGraphikobjekt)
[/autoit] [autoit][/autoit] [autoit]
$StiftRotDike20 = _GDIPlus_PenCreate(0xFFFF0000, 20)
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 90, 90, 1450, 200, $StiftRotDike20)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, "Der 3. Teilnehmer:", 100, 100, "Arial Black", 100)
_GDIPlus_PenDispose($StiftRotDike20)
_GDIPlus_GraphicsDrawImageRect($EchtesQuizGraphicobjekt, $bitmap, 0, 0, @DesktopWidth, @DesktopHeight)
Sleep(2000)
_GDIPlus_GraphicsClear($QuizGraphikobjekt)
$StiftRotDike20 = _GDIPlus_PenCreate(0xFFFF0000, 20)
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 90, 90, 1450, 200, $StiftRotDike20)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, "Der 3. Teilnehmer:", 100, 100, "Arial Black", 100)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, $SpielerName[2], 100, 500, "Arial Black", 100)
_GDIPlus_PenDispose($StiftRotDike20)
_GDIPlus_GraphicsDrawImageRect($EchtesQuizGraphicobjekt, $bitmap, 0, 0, @DesktopWidth, @DesktopHeight)Do
[/autoit] [autoit][/autoit] [autoit]
Sleep(10)
Until _IsPressed(20)
EndFunc ;==>_ZeigeNamenFunc _Zeichne()
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsClear($QuizGraphikobjekt)$StiftRotDike8 = _GDIPlus_PenCreate(0xFFFF0000,
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 10, 10, 800, 70, $StiftRotDike8)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, "Kategorie: <-------------->", 10, 0, "Arial Black", 50)$StiftGrunDike8 = _GDIPlus_PenCreate(0xFF00FF00,
[/autoit] [autoit][/autoit] [autoit]
$StiftBlauDike8 = _GDIPlus_PenCreate(0xFF0000FF,
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 1080, 0, 530, 250, $StiftBlauDike8)
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 1090, 10, 500, 70, $StiftGrunDike8)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, $SpielerName[0] & ": " & $SpielerPunkte[0] & " P.", 1090, 0, "Arial Black", 50)
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 1090, 90, 500, 70, $StiftGrunDike8)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, $SpielerName[1] & ": " & $SpielerPunkte[1] & " P.", 1090, 80, "Arial Black", 50)
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 1090, 170, 500, 70, $StiftGrunDike8)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, $SpielerName[2] & ": " & $SpielerPunkte[2] & " P.", 1090, 160, "Arial Black", 50)$StiftLilaDike12 = _GDIPlus_PenCreate(0xFFFF00FF, 12)
[/autoit] [autoit][/autoit] [autoit]
$StiftGrunDike12 = _GDIPlus_PenCreate(0xFF00FF00, 12)
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 10, 250, 1070, 640, $StiftLilaDike12)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, $FragenDaten[3], 15, 240, "Arial Black", 50)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, $FragenDaten[4], 15, 300, "Arial Black", 50)
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 10, 450, 1070, 80, $StiftGrunDike12)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, $FragenDaten[5], 15, 440, "Arial Black", 50)
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 10, 560, 1070, 80, $StiftGrunDike12)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, $FragenDaten[6], 15, 550, "Arial Black", 50)
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 10, 670, 1070, 80, $StiftGrunDike12)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, $FragenDaten[7], 15, 660, "Arial Black", 50)
_GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 10, 780, 1070, 80, $StiftGrunDike12)
_GDIPlus_GraphicsDrawString($QuizGraphikobjekt, $FragenDaten[8], 15, 770, "Arial Black", 50)_GDIPlus_GraphicsDrawImageRect($EchtesQuizGraphicobjekt, $bitmap, 0, 0, @DesktopWidth, @DesktopHeight)
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_PenDispose($StiftRotDike8)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_PenDispose($StiftGrunDike8)
_GDIPlus_PenDispose($StiftBlauDike8)
_GDIPlus_PenDispose($StiftLilaDike12)
_GDIPlus_PenDispose($StiftGrunDike12)
EndFunc ;==>_ZeichneFunc _VergebePunkte()
[/autoit] [autoit][/autoit] [autoit]
If $SpielerAntworten[0] = $FragenDaten[1] Then $SpielerPunkte[0] = $SpielerPunkte[0] + $FragenDaten[2]
If $SpielerAntworten[1] = $FragenDaten[1] Then $SpielerPunkte[1] = $SpielerPunkte[1] + $FragenDaten[2]
If $SpielerAntworten[2] = $FragenDaten[1] Then $SpielerPunkte[2] = $SpielerPunkte[2] + $FragenDaten[2]
EndFunc ;==>_VergebePunkteFunc _NachsteFrage()
[/autoit] [autoit][/autoit] [autoit]
Dim $SpielerAntworten[3] = [0, 0, 0]
Local $LetzteFrage = $FragenDaten[0]
Global $AktuellerSpieler = 1
Dim $FragenDaten[10]
$FragenDaten[0] = $LetzteFrage + 1
$FragenDaten[1] = IniRead($PfadZuFragen, $FragenDaten[0], 1, "")
$FragenDaten[2] = IniRead($PfadZuFragen, $FragenDaten[0], 2, "")
$FragenDaten[3] = IniRead($PfadZuFragen, $FragenDaten[0], 3, "")
$FragenDaten[4] = IniRead($PfadZuFragen, $FragenDaten[0], 4, "")
$FragenDaten[5] = IniRead($PfadZuFragen, $FragenDaten[0], 5, "")
$FragenDaten[6] = IniRead($PfadZuFragen, $FragenDaten[0], 6, "")
$FragenDaten[7] = IniRead($PfadZuFragen, $FragenDaten[0], 7, "")
$FragenDaten[8] = IniRead($PfadZuFragen, $FragenDaten[0], 8, "")
$FragenDaten[9] = IniRead($PfadZuFragen, "Anzahl", "Anzahl", 1)_Zeichne()
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_NachsteFrageFunc _antwort_1()
[/autoit] [autoit][/autoit] [autoit]
$SpielerAntworten[$AktuellerSpieler - 1] = 1
If $AktuellerSpieler = 3 Then
_VergebePunkte()
_NachsteFrage()
Else
$AktuellerSpieler += 1
EndIf
EndFunc ;==>_antwort_1Func _antwort_2()
[/autoit] [autoit][/autoit] [autoit]
$SpielerAntworten[$AktuellerSpieler - 1] = 2
If $AktuellerSpieler = 3 Then
_VergebePunkte()
_NachsteFrage()
Else
$AktuellerSpieler += 1
EndIf
EndFunc ;==>_antwort_2Func _antwort_3()
[/autoit] [autoit][/autoit] [autoit]
$SpielerAntworten[$AktuellerSpieler - 1] = 3
If $AktuellerSpieler = 3 Then
_VergebePunkte()
_NachsteFrage()
Else
$AktuellerSpieler += 1
EndIf
EndFunc ;==>_antwort_3Func _antwort_4()
[/autoit] [autoit][/autoit] [autoit]
$SpielerAntworten[$AktuellerSpieler - 1] = 4
If $AktuellerSpieler = 3 Then
_VergebePunkte()
_NachsteFrage()
Else
$AktuellerSpieler += 1
EndIf
EndFunc ;==>_antwort_4Func _exit()
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDispose($QuizGraphikobjekt)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>_exitFunc SetBitmap($hGUI, $hImage, $iOpacity)
[/autoit] [autoit][/autoit] [autoit]
Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend$hScrDC = _WinAPI_GetDC(0)
[/autoit]
$hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize)
DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, "Alpha", $iOpacity)
DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
_WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
_WinAPI_ReleaseDC(0, $hScrDC)
_WinAPI_SelectObject($hMemDC, $hOld)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteDC($hMemDC)
EndFunc ;==>SetBitmap -
Hab es selbst gelöst!
[autoit]_GDIPlus_GraphicsClear($backbuffer, Farbe)
[/autoit]