GDI+ Doppelbufferung

  • 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

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ich habe leider doch noch ein Problem ;( , nach dem das 1. Mal neugezeichnet wird, wird der Hintergrund schwarz ! :cursing:

    Hier mein Script:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <Array.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #Include <Misc.au3>

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

    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
    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"]

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

    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))
    GUISetBkColor(0xFFFF00, $QuizFenster)
    GUISetState(@SW_SHOW)

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

    $EchtesQuizGraphicobjekt = _GDIPlus_GraphicsCreateFromHWND($QuizFenster)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(@DesktopWidth, @DesktopHeight, $EchtesQuizGraphicobjekt)
    $QuizGraphikobjekt = _GDIPlus_ImageGetGraphicsContext($bitmap)

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

    _ZeigeNamen()
    _Zeichne()

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

    HotKeySet("{NUMPAD1}", "_antwort_1")
    HotKeySet("{NUMPAD2}", "_antwort_2")
    HotKeySet("{NUMPAD3}", "_antwort_3")
    HotKeySet("{NUMPAD4}", "_antwort_4")

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

    While 1
    Sleep(250)
    WEnd

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

    Func _ZeigeNamen()
    $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)

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

    Do
    Sleep(10)
    Until _IsPressed(20)

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

    _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_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)

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

    Do
    Sleep(10)
    Until _IsPressed(20)

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

    _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_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)

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

    Do
    Sleep(10)
    Until _IsPressed(20)
    EndFunc ;==>_ZeigeNamen

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

    Func _Zeichne()
    _GDIPlus_GraphicsClear($QuizGraphikobjekt)

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

    $StiftRotDike8 = _GDIPlus_PenCreate(0xFFFF0000, 8)
    _GDIPlus_GraphicsDrawRect($QuizGraphikobjekt, 10, 10, 800, 70, $StiftRotDike8)
    _GDIPlus_GraphicsDrawString($QuizGraphikobjekt, "Kategorie: <-------------->", 10, 0, "Arial Black", 50)

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

    $StiftGrunDike8 = _GDIPlus_PenCreate(0xFF00FF00, 8)
    $StiftBlauDike8 = _GDIPlus_PenCreate(0xFF0000FF, 8)
    _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)

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

    $StiftLilaDike12 = _GDIPlus_PenCreate(0xFFFF00FF, 12)
    $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)

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

    _GDIPlus_GraphicsDrawImageRect($EchtesQuizGraphicobjekt, $bitmap, 0, 0, @DesktopWidth, @DesktopHeight)

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

    _GDIPlus_PenDispose($StiftRotDike8)
    _GDIPlus_PenDispose($StiftGrunDike8)
    _GDIPlus_PenDispose($StiftBlauDike8)
    _GDIPlus_PenDispose($StiftLilaDike12)
    _GDIPlus_PenDispose($StiftGrunDike12)
    EndFunc ;==>_Zeichne

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

    Func _VergebePunkte()
    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 ;==>_VergebePunkte

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

    Func _NachsteFrage()
    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)

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

    _Zeichne()
    EndFunc ;==>_NachsteFrage

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

    Func _antwort_1()
    $SpielerAntworten[$AktuellerSpieler - 1] = 1
    If $AktuellerSpieler = 3 Then
    _VergebePunkte()
    _NachsteFrage()
    Else
    $AktuellerSpieler += 1
    EndIf
    EndFunc ;==>_antwort_1

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

    Func _antwort_2()
    $SpielerAntworten[$AktuellerSpieler - 1] = 2
    If $AktuellerSpieler = 3 Then
    _VergebePunkte()
    _NachsteFrage()
    Else
    $AktuellerSpieler += 1
    EndIf
    EndFunc ;==>_antwort_2

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

    Func _antwort_3()
    $SpielerAntworten[$AktuellerSpieler - 1] = 3
    If $AktuellerSpieler = 3 Then
    _VergebePunkte()
    _NachsteFrage()
    Else
    $AktuellerSpieler += 1
    EndIf
    EndFunc ;==>_antwort_3

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

    Func _antwort_4()
    $SpielerAntworten[$AktuellerSpieler - 1] = 4
    If $AktuellerSpieler = 3 Then
    _VergebePunkte()
    _NachsteFrage()
    Else
    $AktuellerSpieler += 1
    EndIf
    EndFunc ;==>_antwort_4

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

    Func _exit()
    _GDIPlus_GraphicsDispose($QuizGraphikobjekt)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_exit

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

    Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

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

    $hScrDC = _WinAPI_GetDC(0)
    $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

    [/autoit]

    Magnus