GDI+ String ändern

  • Aktuell benutze ich diesen Code

    Spoiler anzeigen
    [autoit]

    #include <GDIplus.au3>
    #include <ScreenCapture.au3>

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

    Global Const $GDIP_BLUREFFECT = "{633C80A4-1843-482b-9EF2-BE2834C5FDD4}"
    Global Const $GDIP_SHARPENEFFECT = "{63CBF3EE-C526-402c-8F71-62C540BF5142}"
    Global Const $GDIP_COLORMATRIXEFFECT = "{718F2615-7933-40e3-A511-5F68FE14DD74}"
    Global Const $GDIP_COLORLUTEFFECT = "{A7CE72A9-0F7F-40d7-B3CC-D0C02D5C3212}"
    Global Const $GDIP_BRIGHTNESSCONTRASTEFFECT = "{D3A1DBE1-8EC4-4c17-9F4C-EA97AD1C343D}"
    Global Const $GDIP_HUESATURATIONLIGHTNESSEFFECT = "{8B2DD6C3-EB07-4d87-A5F0-7108E26A9C5F}"
    Global Const $GDIP_LEVELSEFFECT = "{99C354EC-2A31-4f3a-8C34-17A803B33A25}"
    Global Const $GDIP_TINTEFFECT = "{1077AF00-2848-4441-9489-44AD4C2D7A2C}"
    Global Const $GDIP_COLORBALANCEEFFECT = "{537E597D-251E-48da-9664-29CA496B70F8}"
    Global Const $GDIP_REDEYECORRECTIONEFFECT = "{74D29D05-69A4-4266-9549-3CC52836B632}"
    Global Const $GDIP_COLORCURVEEFFECT = "{DD6A0022-58E4-4a67-9D9B-D48EB881A53D}"

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

    _GDIPlus11_Startup()
    If @error Then Exit MsgBox(0x10, "Error", "GDIPlus v1.1 is not installed")

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

    Local $hGUI, $hGraphics, $hImage, $hBlurredImage, $hEffect, $file
    FileDelete(@TempDir & "\screen.jpg")
    _ScreenCapture_Capture(@TempDir & "\screen.jpg", 0,0, -1,-1, False)
    $file = @TempDir & "\screen.jpg"
    If @error Then Exit
    $hImage = _GDIPlus_ImageLoadFromFile($file)

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

    $hGUI = GUICreate("GDI+ v1.1 Demo Blur", _GDIPlus_ImageGetWidth($hImage), _GDIPlus_ImageGetHeight($hImage))
    GUISetState()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hEffect = _GDIPlus_EffectCreate($GDIP_BLUREFFECT)
    $hBlurredImage = _GDIPlus_BitmapCreateWithEffect($hImage, $hEffect)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBlurredImage, 0, 0)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(_GDIPlus_ImageGetWidth($hImage), _GDIPlus_ImageGetHeight($hImage), $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    Local $count = 0
    $donebut = GUICtrlCreatePic(@ScriptDir & "\erledigt2.gif",(@DesktopWidth/2)-200,@DesktopHeight/2+300,355,197)
    GUISetState()
    Do
    $count += 1
    _GDIPlus_GraphicsDrawString($hGraphics,"testring #" & $count,(@DesktopWidth/2)-300,@DesktopHeight/2)
    GUISetState()
    Sleep(1000)
    Until GUIGetMsg() = -3

    [/autoit]


    was aber logischerweise nicht funktioniert, weil die Strings sich immer überschreiben (überlappen) und dadurch unleserlich werden.

    Nun ist meine Frage, wie ich denn einen mit _GDIPlus_GraphicsDrawString erstellten String entferne oder ändere,
    ohne die ganze GDI+ Umgebung mitzulöschen (was die bisherigen Befehle getan haben), wie z.bsp. der verschwommene Screenshot in meinem Skript.

    mfg,
    Dankeschön

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

    Einmal editiert, zuletzt von Dankeschön (18. Dezember 2010 um 14:16)

  • Man kann mit GDI+ keine Werte ändern wie bei GGUI Controls mit GUICtrlsetdata, sondern du must es, wie du schon erkannt hast, neu malen.
    Wenn du nicht willst das alles drumherum übermalt wird, dann zeichne es neu, oder nur den Bereisch der geändert wird.
    mit _GDIPlus_GraphicsClear($hGraphics[, $iARGB = 0xFF000000])

    kannst du alles schwarz übermalen (oder die Farbe die du angibst). Wenn du ein Hintergrundbild hast nehm das als "löscher" und bau dann darauf auf.

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Ja, die Frage ist ja grade, wie ich diesen String wieder löschen kann,
    da es wohl zu ressourcenfressend wäre, den Blur-Effekt jede sekunde neu zu berechnen...

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

  • Hui, GDI+ sieht immer so verdammt komplex aus...

    Wenn ich richtig geguckt habe besteht das Kernstück aus dieser Funktion:

    [autoit]

    Func Print_Bitmap_Font($hWnd, $Msg, $wParam, $lParam)
    Local $fw = 16, $fh = 16, $size = 1, $dx = 9.5 * $size
    Local $chk

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

    $chk = BitAND($wParam, 0x0000FFFF)
    Switch $chk
    Case $Input
    $inp = GUICtrlRead($Input)
    $inp_len = StringLen($inp)
    If $inp_len < Ceiling($width / $dx - 2) Then
    $aInp = StringSplit($inp, "", 2)
    _GDIPlus_GraphicsClear($hBackbuffer, "0xFF" & $bgc)
    For $i = 0 To $inp_len - 1
    $x = Mod(Asc($aInp[$i])-32, 32)
    $y = Floor((Asc($aInp[$i])-32) / 32)
    _GDIPlus_GraphicsDrawImageRectRect($hBackbuffer, $hImage, $x * $fw, $y * $fh, $fw -1, $fh -1, $fw + $i * $dx, $gfx_h / 2 - ($fh * $size / 2), $fw * $size, $fh * $size)
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, $heigth * $factor2, $gfx_w, $gfx_h)
    EndIf
    EndSwitch

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

    Return "GUI_RUNDEFMSG"
    EndFunc

    [/autoit]

    Leider sagen mir diese Berechnungen nichts.
    Es wäre also schön,wenn mir jemand den Stups in die richtige Richtung geben könnte, und mir die wichtige Zeile markieren könnte, oder/und mir sagen könnte, wie UEz´s System theoretisch funktioniert... :)

    Beim zweiten Blick auf den Code sehe ich auch hier eine Färbung des Hintergrunds, also auch nur eine Art "Übermalen",
    was wiederum den Blur-Screenshot zerstört...

    dankeschön im vorraus :)

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

  • Zeichne einfach deinen verschwommenen Screenshot nochmal über alles drüber und dann nochmal den neuen Text darauf ;). Anders geht es nicht mit GDI+. Falls dein Hintergrund besonders aufwendig zu zeichnen ist, solltest du ihn in eine Bitmap speichern und einfach diese immer zum "übermalen" benutzen.

  • Das Beispiel von mir geht teilweise nur die Richtung, da es die Buchstaben aus der Bitmap liest und sie in die GUI schreibt (war eine Frage im engl. Forum).

    Wenn ich Zeit habe, code ich was für dich.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • name22:
    Leider soll sich die Schrift sekündlich aktualisieren (Zeit-Countdown),
    da wird alles sehr aufwendig...

    Also einfachn neuen Screenshot vom verschwommenem Bild machen und immer neusetzen ?

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

  • Gefunden :)

    Ja, sowas wollte ich (auch wenn ich das langsame Verwischen und die Laufschrift nicht brauche, und ich den ganzen Bildschirm verpixel).
    Ich schau´s mir mal an...

    //edit: Blicke nicht ganz durch...
    Kannst du mir ein Beispiel machen, wo ein String an einer fixen Position von 5 auf 1 runtergezählt wird, oder wo einfach nur der String überschrieben wird.
    Bei soviel Code ist es schwer, das wichtige rauszufiltern, wenn man wie ich keine AHnung von GDI+ hat...

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

    Einmal editiert, zuletzt von Dankeschön (17. Dezember 2010 um 16:12)

  • So müsste es doch funktionieren...

    Spoiler anzeigen
    [autoit]

    #include <GDIplus.au3>
    #include <ScreenCapture.au3>

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

    Global Const $GDIP_BLUREFFECT = "{633C80A4-1843-482b-9EF2-BE2834C5FDD4}"
    Global Const $GDIP_SHARPENEFFECT = "{63CBF3EE-C526-402c-8F71-62C540BF5142}"
    Global Const $GDIP_COLORMATRIXEFFECT = "{718F2615-7933-40e3-A511-5F68FE14DD74}"
    Global Const $GDIP_COLORLUTEFFECT = "{A7CE72A9-0F7F-40d7-B3CC-D0C02D5C3212}"
    Global Const $GDIP_BRIGHTNESSCONTRASTEFFECT = "{D3A1DBE1-8EC4-4c17-9F4C-EA97AD1C343D}"
    Global Const $GDIP_HUESATURATIONLIGHTNESSEFFECT = "{8B2DD6C3-EB07-4d87-A5F0-7108E26A9C5F}"
    Global Const $GDIP_LEVELSEFFECT = "{99C354EC-2A31-4f3a-8C34-17A803B33A25}"
    Global Const $GDIP_TINTEFFECT = "{1077AF00-2848-4441-9489-44AD4C2D7A2C}"
    Global Const $GDIP_COLORBALANCEEFFECT = "{537E597D-251E-48da-9664-29CA496B70F8}"
    Global Const $GDIP_REDEYECORRECTIONEFFECT = "{74D29D05-69A4-4266-9549-3CC52836B632}"
    Global Const $GDIP_COLORCURVEEFFECT = "{DD6A0022-58E4-4a67-9D9B-D48EB881A53D}"

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

    _GDIPlus11_Startup()
    If @error Then Exit MsgBox(0x10, "Error", "GDIPlus v1.1 is not installed")

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

    Local $hGUI, $hGraphics, $hImage, $hBlurredImage, $hEffect, $file
    FileDelete(@TempDir & "\screen.jpg")
    _ScreenCapture_Capture(@TempDir & "\screen.jpg", 0,0, -1,-1, False)
    $file = @TempDir & "\screen.jpg"
    If @error Then Exit
    $hImage = _GDIPlus_ImageLoadFromFile($file)
    $iWidth = _GDIPlus_ImageGetWidth($hImage)
    $iHeight = _GDIPlus_ImageGetHeight($hImage)

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

    $hGUI = GUICreate("GDI+ v1.1 Demo Blur", $iWidth, $iHeight)
    GUISetState()

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

    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    $hEffect = _GDIPlus_EffectCreate($GDIP_BLUREFFECT)
    $hBlurredImage = _GDIPlus_BitmapCreateWithEffect($hImage, $hEffect)

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

    _GDIPlus_GraphicsDrawImageRect($hBuffer, $hBlurredImage, 0, 0, $iWidth, $iHeight)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $iWidth, $iHeight)

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

    Local $count = 0
    $donebut = GUICtrlCreatePic(@ScriptDir & "\erledigt2.gif",(@DesktopWidth/2)-200,@DesktopHeight/2+300,355,197)
    GUISetState()
    Do
    $count += 1
    _GDIPlus_GraphicsDrawImage($hBuffer, $hBlurredImage, 0, 0)
    _GDIPlus_GraphicsDrawString($hBuffer,"testring #" & $count,(@DesktopWidth/2)-300,@DesktopHeight/2)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $iWidth, $iHeight)
    GUISetState()
    Sleep(1000)
    Until GUIGetMsg() = -3

    [/autoit]


    Jeder baut einen Backbuffer ein, aber nur wenige verwenden ihn... :rolleyes:

  • Und das tut es :)

    Wenn ichs richtig sehe,
    zeichnest du einfach vor dem String das Hintergrund immer neu,
    berechnest es aber nicht neu und überschreibst damit die vorherige Schrift.
    Richtig ?

    Danke auf jeden Fall,
    sehr großen Dank auch euch allen :)

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön