GDI + Backbuffer ???

  • Hallo,

    ich möchte , dass bei meinem Skript "Test1" gezeichnet wird und wenn man auf den Button mit der Aufschrift " Neu zeichnen " geht, dann soll der alte String " Test 1 " verschwinden und " Test2 " gezeichnet werden.

    Das mit dem verschwinden des alten String bekomme ich nicht hin ;/

    Skript :

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    _GDIPlus_Startup()
    $TestGUI = GUICreate("Test", 615, 438, 192, 124)
    $NeuZeichnen = GUICtrlCreateButton("Neu zeichnen", 424, 48, 75, 25)
    GUISetState(@SW_SHOW)
    $Grafik = _GDIPlus_GraphicsCreateFromHWND ($TestGUI)
    _GDIPlus_GraphicsDrawString($Grafik, "Test1", 170, 110)
    $Buffer = _GDIPlus_ImageGetGraphicsContext($Grafik)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _GDIPlus_GraphicsDispose($Buffer)
    _GDIPlus_GraphicsDispose($Grafik)
    _GDIPlus_Shutdown()
    Exit
    Case $NeuZeichnen
    _GDIPlus_GraphicsDispose($Buffer)
    _GDIPlus_GraphicsDrawString($Grafik, "Test2", 170, 110)
    $Buffer = _GDIPlus_ImageGetGraphicsContext($Grafik)
    EndSwitch
    WEnd

    [/autoit]

    Könnte mir mal bitte jemand helfen?

  • Wenn ich das Skript starte schmiert es direkt ab.
    Du hast leider einige schwerwiegende Fehler drinnen...

    So müsste es klappen.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>

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

    _GDIPlus_Startup()

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

    $Breite = 600
    $Hoehe = 400

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

    $TestGUI = GUICreate("Test", $Breite, $Hoehe, 192, 124)
    $NeuZeichnen = GUICtrlCreateButton("Neu zeichnen", 424, 48, 75, 25)
    GUISetState(@SW_SHOW)

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

    $Grafik = _GDIPlus_GraphicsCreateFromHWND($TestGUI)
    _GDIPlus_GraphicsDrawString($Grafik, "Test1", 170, 110)
    $Bitmap = _GDIPlus_BitmapCreateFromGraphics($Breite/2, $Hoehe, $Grafik)
    $Buffer = _GDIPlus_ImageGetGraphicsContext($Bitmap)

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

    While Sleep(10)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _GDIPlus_GraphicsDispose($Buffer)
    _GDIPlus_BitmapDispose($Bitmap)
    _GDIPlus_GraphicsDispose($Grafik)
    _GDIPlus_Shutdown()
    Exit
    Case $NeuZeichnen
    _GDIPlus_GraphicsClear($Buffer, 0xFFE0E0E0)
    _GDIPlus_GraphicsDrawString($Buffer, "Test2", 170, 110)
    _GDIPlus_GraphicsDrawImage($Grafik, $Bitmap, 0, 0)
    EndSwitch
    WEnd

    [/autoit]

    Das wird dir aber nicht viel weiter helfen. Schau mal, ob du ein paar Tutorials (GDI+/GDI) machen kannst.
    Dann geht dir sowas leicher von der Hand :)

    lg
    M

  • Ehm, nun ändert er den ganzen Hintergrund, das soll er eigtl nicht, da ich davor nachher noch Bilder mache und diese sollen dann so bleiben, wie sie sind.

    Schon einmal danke für deine bisherige Hilfe.

    Mit freundlichen Grüßen,

    Julien

  • Es kommt darauf an, was du genau machen willst! Wenn du "nur" Test1 löschen und Test2 schreiben möchtest, dann mache das lieber mit GUICtrlCreateLabel().

    Probiere es mal damit:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>

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

    _GDIPlus_Startup()

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

    $Breite = 600
    $Hoehe = 400

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

    $TestGUI = GUICreate("Test", $Breite, $Hoehe, 192, 124)
    $NeuZeichnen = GUICtrlCreateButton("Neu zeichnen", 424, 48, 75, 25)
    GUISetState(@SW_SHOW)
    $iRGB = "0xFF" & _WinAPI_GetGUIBkColor($TestGUI)

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

    $Grafik = _GDIPlus_GraphicsCreateFromHWND($TestGUI)
    $Bitmap = _GDIPlus_BitmapCreateFromGraphics($Breite/2, $Hoehe, $Grafik)
    $Buffer = _GDIPlus_ImageGetGraphicsContext($Bitmap)
    _GDIPlus_GraphicsClear($Buffer, $iRGB)
    _GDIPlus_GraphicsDrawString($Buffer, "Test1", 170, 110)
    _GDIPlus_GraphicsDrawImage($Grafik, $Bitmap, 0, 0)

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

    $i = 2

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

    While Sleep(10)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _GDIPlus_GraphicsDispose($Buffer)
    _GDIPlus_BitmapDispose($Bitmap)
    _GDIPlus_GraphicsDispose($Grafik)
    _GDIPlus_Shutdown()
    Exit
    Case $NeuZeichnen
    _GDIPlus_GraphicsClear($Buffer, $iRGB)
    _GDIPlus_GraphicsDrawString($Buffer, "Test" & $i, 170, 110)
    _GDIPlus_GraphicsDrawImage($Grafik, $Bitmap, 0, 0)
    $i +=1
    EndSwitch
    WEnd

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

    Func _WinAPI_GetGUIBkColor($hWnd) ;taken from WinAPIEx.au3
    Local $hDC = _WinAPI_GetDC($hWnd)
    If Not $hDC Then Return SetError(1, 0, 0)
    Local $bgcolor = DllCall("GDI32.dll", "int", "GetBkColor", "hwnd", $hDC)
    If @error Or $bgcolor[0] = -1 Then Return SetError(2, 0, 0)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    $bgcolor = $bgcolor[0] ;BGR
    $bgcolor = Hex(BitOR(BitAND($bgcolor, 0x00FF00), BitShift(BitAND($bgcolor, 0x0000FF), -16), BitShift(BitAND($bgcolor, 0xFF0000), 16)), 6) ;convert to RGB
    Return $bgcolor ;return RGB
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • UEZ : erstmal danke für das Skript, jedoch möchte ich später ein Bild davor haben und es soll anschließend immer neu auf dieses Bild gezeichnet werden. Das ist eben das Problem.
    Mit GuiCtrlCreateLabel flackert es, wenn ein Hintergrund dahinter ist und es zu schnell abläuft und es läuft nun einmal schnell ab.

    Naja, könntest du mir vielleicht ein Beispiel für einen Backbuffer geben für ein Png? Das mit dem Backbuffer für ein Png ist mir etwas wichtiger. Vor diesem Png wird es allerdings auch noch ein Png geben, das heißt, dass nur genau das Png weggezeichnet werden soll es also rückgänig gemacht werden soll.

    Könntest du dies vielleicht bei diesem Skript für mich machen, falls du Zeit hast ?

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    _GDIPlus_Startup()
    $Form1 = GUICreate("Test", 271, 240, 192, 124)
    $Label1 = GUICtrlCreateLabel("Pfad", 8, 8, 44, 17)
    $Input1 = GUICtrlCreateInput("", 56, 8, 121, 21)
    $Button1 = GUICtrlCreateButton("...", 184, 8, 75, 25)
    $Pic1 = GUICtrlCreatePic("", 8, 48, 252, 180)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _GDIPlus_Shutdown()
    Exit
    Case $Button1
    $Pfad = FileOpenDialog("Bild auswählen","C:\","Alles (*.*)")
    If Not @error Then DisplayImage($Pic1, $Pfad)
    EndSwitch
    WEnd

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

    Func DisplayImage($id, $file)
    Local Const $IMAGE_BITMAP = 0
    Local Const $STM_SETIMAGE = 0x0172
    Local $hImage = _GDIPlus_ImageLoadFromFile($file)
    If @error Then Return SetError(1, 0, 0)
    $aPos = ControlGetPos("", "", $id)
    If @error Then Return SetError(2, 0, 0)
    Local Const $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $aPos[2], "int", $aPos[3], "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    Local Const $hBitmap = $aResult[6]
    Local Const $hCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hCtxt, "int", 7)
    _GDIPlus_GraphicsDrawImageRect($hCtxt, $hImage, 0, 0, $aPos[2], $aPos[3])
    Local $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hCtxt)
    _WinAPI_DeleteObject(GUICtrlSendMsg($id, $STM_SETIMAGE, $IMAGE_BITMAP, $hHBitmap))
    _WinAPI_DeleteObject($hHBitmap)
    EndFunc

    [/autoit]

    Habe es schon selber versucht auch mit dem Tutorial aber meine Ergebnisse lassen zu wünschen übrig. ;/

  • Sorry, ich verstehe nicht ganz was du machen willst.

    Hilft dir das hier weiter?

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>

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

    _GDIPlus_Startup()

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

    $Breite = 600
    $Hoehe = 400
    $y = 110

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

    $TestGUI = GUICreate("Test", $Breite, $Hoehe, 192, 124)
    $NeuZeichnen = GUICtrlCreateButton("Neu zeichnen", 424, 48, 75, 25)
    GUISetState(@SW_SHOW)
    $iRGB = "0xFF" & _WinAPI_GetGUIBkColor($TestGUI)
    Global $sFile = StringReplace(@AutoItExe, "autoit3.exe", "Examples\GUI\Torus.png")
    $Grafik = _GDIPlus_GraphicsCreateFromHWND($TestGUI)
    $Bitmap = _GDIPlus_BitmapCreateFromGraphics($Breite/2, $Hoehe, $Grafik)
    $Buffer = _GDIPlus_ImageGetGraphicsContext($Bitmap)
    $hHintergrund = _GDIPlus_ImageLoadFromFile($sFile)
    _GDIPlus_GraphicsClear($Buffer, $iRGB)
    _GDIPlus_GraphicsDrawImage($Buffer, $hHintergrund, 0, 50)
    _GDIPlus_GraphicsDrawString($Buffer, "Test1", 70, 110)
    _GDIPlus_GraphicsDrawImage($Grafik, $Bitmap, 0, 0)

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

    AdlibRegister("Scroll", 50)
    $i = 2
    While Sleep(10)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    AdlibUnRegister("Scroll")
    _GDIPlus_ImageDispose($hHintergrund)
    _GDIPlus_GraphicsDispose($Buffer)
    _GDIPlus_BitmapDispose($Bitmap)
    _GDIPlus_GraphicsDispose($Grafik)
    _GDIPlus_Shutdown()
    Exit
    Case $NeuZeichnen
    $i += 1
    EndSwitch
    WEnd

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

    Func Scroll()
    _GDIPlus_GraphicsClear($Buffer, $iRGB)
    _GDIPlus_GraphicsDrawImage($Buffer, $hHintergrund, 0, 50)
    _GDIPlus_GraphicsDrawString($Buffer, "Test" & $i, 70, $y)
    _GDIPlus_GraphicsDrawImage($Grafik, $Bitmap, 0, 0)
    If $y = -10 Then $y = $Hoehe
    $y -= 1
    EndFunc

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

    Func _WinAPI_GetGUIBkColor($hWnd) ;taken from WinAPIEx.au3
    Local $hDC = _WinAPI_GetDC($hWnd)
    If Not $hDC Then Return SetError(1, 0, 0)
    Local $bgcolor = DllCall("GDI32.dll", "int", "GetBkColor", "hwnd", $hDC)
    If @error Or $bgcolor[0] = -1 Then Return SetError(2, 0, 0)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    $bgcolor = $bgcolor[0] ;BGR
    $bgcolor = Hex(BitOR(BitAND($bgcolor, 0x00FF00), BitShift(BitAND($bgcolor, 0x0000FF), -16), BitShift(BitAND($bgcolor, 0xFF0000), 16)), 6) ;convert to RGB
    Return $bgcolor ;return RGB
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (23. Februar 2012 um 22:19)

  • Schon, aber bei meinem Skript sind es etwas mehr Label und so komme ich vollkomen durcheinander , da ich bei GDI + sowieso nicht ganz durchsteige.

    Gibt es sonst vielt eine UDF dafür?

    z.B. GuiCtrlCreateGDILabel und GuiCtrlSetGDILabel und GuiCtrlDeleteGDILabel ?