GDI+ Text verändern

  • eine direkte funktion gibt es so viel ich weis nicht
    eine art mit leichter hintergrund farb veränderung da ich den standard windows fenster argb wert nicht weis ist bei dieser variante

    Spoiler anzeigen
    [autoit]


    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>

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

    Opt('MustDeclareVars', 1)
    HotKeySet("{ESC}","_func")

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

    Local $hGUI, $hWnd, $hGraphic

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

    ; Erstellt eine GUI
    $hGUI = GUICreate("GDI+", 400, 300)
    $hWnd = WinGetHandle("GDI+")
    GUISetState()

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

    ; Zeichnet eine Zeichenkette
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    _GDIPlus_GraphicsDrawString($hGraphic, "Hallo Welt", 140, 110)

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

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

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

    ; Ressourcen freigeben
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()

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

    Func _func()
    Local $graphic
    _GDIPlus_GraphicsClear($hGraphic,0xFFFFFFFF)
    _GDIPlus_GraphicsDrawString($hGraphic, "Hallo", 140, 110)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • @pee
    gibt es eine function um ganz $hGraphic in meinem Beispiel zu entfernen denn ohne sowas wird es wohl nicht möglich sein es genau so nur mit anderem text zu erstellen

  • @simon
    Um die ursprüngliche Stelle, an der du jetzt "drübergemalt" hast wiederherzustellen, musst du vorher den ursprünglichen Bildausschnitt sichern und (wenn du den Text z.B. ändern willst) diesen dann wieder herstellen.

  • Andy
    aber mit der Clear function wird ein hintergrund gesetzt also das andere unsichtbar da er darüberkommt und dann wird an der gleichen stelle wieder ein string gezeichnet
    meine frage aber ist wie ich die vorherigen elemente mit einer funktion löschen kann also das vorherige ganze $hGraphic aus meinem Bsp

  • so?

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>

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

    Opt('MustDeclareVars', 1)
    HotKeySet("{ESC}","_func")
    HotKeySet("{F1}","_del")

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

    Local $hGUI, $hWnd, $hGraphic

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

    ; Erstellt eine GUI
    $hGUI = GUICreate("GDI+", 400, 300)
    $hWnd = WinGetHandle("GDI+")

    GUICtrlCreateLabel("F1 drücken um den Text zu löschen",10,10,200,30)

    GUISetState()

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

    ; Zeichnet eine Zeichenkette
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    _GDIPlus_GraphicsDrawString($hGraphic, "Hallo Welt", 140, 110)

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

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

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

    ; Ressourcen freigeben
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()

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

    Func _func()
    Local $graphic
    _GDIPlus_GraphicsClear($hGraphic,0xFFFFFFFF)
    _GDIPlus_GraphicsDrawString($hGraphic, "Hallo", 140, 110)
    EndFunc

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

    func _del()
    _WinAPI_RedrawWindow($hgui)

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

    endfunc

    [/autoit]
  • Nun ja, vielleicht hilf dir das weiter:

    Spoiler anzeigen
    [autoit]


    ;Coded by UEZ 2009
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GDIPlus.au3>

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

    Global Const $width = 640
    Global Const $height = 480
    Global Const $pi_div_180 = 4 * ATan(1) / 180
    Global $graphics, $backbuffer, $bitmap, $Pen, $arrTxt1, $arrTxt2, $fontsize_txt1, $fontsize_txt2
    Global $hBrush, $hFamily1, $hFamily2, $hFont1, $hFont2, $hFormat, $tLayout1, $tLayout2
    Global $x1, $x2, $y1, $y2, $a, $b
    Global $i = 0, $j = 360, $m = 0, $n = 0
    Global $radius_x, $radius_y
    Global $title = "GDI+ Beispiel"

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

    Opt("GUIOnEventMode", 1)
    $hwnd = GUICreate($title, $width, $height, -1, -1, BitOR($WS_SYSMENU,$WS_DLGFRAME,$WS_POPUP))
    GUISetOnEvent($GUI_EVENT_CLOSE, "Close")
    GUISetState()

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

    _GDIPlus_Startup()
    $graphics = _GDIPlus_GraphicsCreateFromHWND($hwnd)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $graphics)
    $backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
    _GDIPlus_GraphicsSetSmoothingMode($backbuffer, 2)

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

    $hBrush = _GDIPlus_BrushCreateSolid(0)
    _GDIPlus_BrushSetSolidColor($hBrush, 0xFFF0F0F0)

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

    $fontsize_txt1 = 48
    $fontsize_txt2 = 24

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

    $radius_x1 = ($width * 0.45) * 0.95
    $radius_y1 = ($height * 0.45) * 0.95
    $radius_x2 = ($width * 0.45) * 0.45
    $radius_y2 = ($height * 0.45) * 0.45
    $text1 = " Rotating Letters"
    $text2 = " By UEZ ;-)"
    $arrTxt1 = StringSplit($text1, "")
    $arrTxt2 = StringSplit($text2, "")
    Dim $arrX1[UBound($arrTxt1)]
    Dim $arrY1[UBound($arrTxt1)]
    Dim $arrX2[UBound($arrTxt2)]
    Dim $arrY2[UBound($arrTxt2)]

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

    $hFormat = _GDIPlus_StringFormatCreate()
    $hFamily1 = _GDIPlus_FontFamilyCreate("Arial")
    $hFamily2 = _GDIPlus_FontFamilyCreate("Comic Sans MS")
    $hFont1 = _GDIPlus_FontCreate($hFamily1, $fontsize_txt1, 2)
    $hFont2 = _GDIPlus_FontCreate($hFamily2, $fontsize_txt2, 2)
    $tLayout1 = _GDIPlus_RectFCreate(0, 0)
    $tLayout2 = _GDIPlus_RectFCreate(0, 0)
    $a = 360 / (UBound($arrTxt1) - 1)
    $b = 360 / (UBound($arrTxt2) - 1)

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

    Do
    _GDIPlus_GraphicsClear($backbuffer, 0x90000000)
    For $x = 1 To UBound($arrTxt1) - 1
    $x1 = $width * 0.45 + Cos(($i + $m) * $pi_div_180) * $radius_x1
    $y1 = $height * 0.45 + Sin(($i + $m) * $pi_div_180) * $radius_y1 - $fontsize_txt1 / 4
    $arrX1[$x] = $x1
    $arrY1[$x] = $y1
    DllStructSetData($tLayout1, "x", $arrX1[$x])
    DllStructSetData($tLayout1, "y", $arrY1[$x])
    _GDIPlus_GraphicsDrawStringEx($backbuffer, $arrTxt1[$x], $hFont1, $tLayout1, $hFormat, $hBrush)
    $m += $a
    Next

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

    For $x = 1 To UBound($arrTxt2) - 1
    $x2 = $width * 0.45 + Cos(($j + $n) * $pi_div_180) * $radius_x2
    $y2 = $height * 0.45 + Sin(($j + $n) * $pi_div_180) * $radius_y2 - $fontsize_txt2 / 4
    $arrX2[$x] = $x2
    $arrY2[$x] = $y2
    DllStructSetData($tLayout2, "x", $arrX2[$x])
    DllStructSetData($tLayout2, "y", $arrY2[$x])
    _GDIPlus_GraphicsDrawStringEx($backbuffer, $arrTxt2[$x], $hFont2, $tLayout2, $hFormat, $hBrush)
    $n += $b
    Next

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

    _GDIPlus_GraphicsDrawImageRect($graphics, $bitmap, 0, 0, $width, $height)
    $i += 1
    If $i >= 360 Then
    $i = 0
    $m = 0
    EndIf
    $j -= 2
    If $j <= 0 Then
    $j = 360
    $n = 0
    EndIf
    Until False * Not Sleep(30)

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

    Func _GDIPlus_BrushSetSolidColor($hBrush, $iARGB = 0xFF000000)
    Local $aResult
    $aResult = DllCall($ghGDIPDll, "int", "GdipSetSolidFillColor", "hwnd", $hBrush, "int", $iARGB)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, $aResult[0] = 0)
    EndFunc ;==>_GDIPlus_BrushSetSolidColor

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

    Func Close()
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_FontDispose($hFont1)
    _GDIPlus_FontDispose($hFont2)
    _GDIPlus_FontFamilyDispose($hFamily1)
    _GDIPlus_FontFamilyDispose($hFamily2)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_GraphicsDispose($backbuffer)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_GraphicsDispose($graphics)
    _GDIPlus_Shutdown()
    WinClose($hwnd)
    Exit
    EndFunc

    [/autoit]

    Gruß,
    UEZ :whistling:

    PS: habe ich auf die schnelle zusammen gecodet! ;)

  • wenn ich das script so starte, gibts das altbekannte geflacker und die buchstaben bewegen sich nicht
    ändere ich in zeile 58 aber in _GDIPlus_GraphicsClear($backbuffer, 0xff900000) gehts wunderbar....

  • wenn ich das script so starte, gibts das altbekannte geflacker und die buchstaben bewegen sich nicht
    ändere ich in zeile 58 aber in _GDIPlus_GraphicsClear($backbuffer, 0xff900000) gehts wunderbar....

    Nach der Aktualisierung der nVidia Grafiktreiber auf v6.14.11.8618 (10.06.2009) laufen die GDI+ Codes sauber unter WinXP!

    Komisch...Lag doch an den Treibern.

    03:52 gepostet. Konntest wohl nicht schlafen... :D

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Habe eine ATI Radeon Graka und bisher absolut keine Probleme damit gehabt. Wobei man auch im Blick behalten sollte, daß wir hier über Funktionen reden, die spätestens seit der Release von XP im System sitzen. Bis dato wären da sicher schwerwiegende Fehler aufgefallen....

    Zitat

    Nach der Aktualisierung der nVidia Grafiktreiber auf v6.14.11.8618 (10.06.2009) laufen die GDI+ Codes sauber unter WinXP!

    Glaubst du, das nVidea mit Absicht einen GDI+"Bug" mit dieser Treiberversion gefixt hat?

  • Habe eine ATI Radeon Graka und bisher absolut keine Probleme damit gehabt. Wobei man auch im Blick behalten sollte, daß wir hier über Funktionen reden, die spätestens seit der Release von XP im System sitzen. Bis dato wären da sicher schwerwiegende Fehler aufgefallen....

    Glaubst du, das nVidea mit Absicht einen GDI+"Bug" mit dieser Treiberversion gefixt hat?

    Ich weiß nicht, woran es wirklich liegt. Ich habe am Wochenende einfach die GDI+ Sachen auf meiner XP Büchse laufen lassen und musste feststellen, dass die Probleme nicht mehr existieren!

    Woran das jetzt im Detail liegt, kann ich nicht sagen. Vielleicht ist ja eine Kombination aus Treibern und GDI+ DLLs! Letztendlich gibt es ja die Probleme.

    Interessant wäre es mal zu testen, ob mit anderen Programmierensprachen (z.B. VB) und GDI+ auf XP Kisten der selbe Fehler auftritt!

    Ich glaube nicht, dass nVidia weiß, dass es solche Probleme mit GDI+ unter XP gibt, zumal das Problem auch auf AMD/ATI Grafikkarten existiert.

    Wer Probleme auf XP mit _GDIPlus_GraphicsClear($backbuffer, 0x90000000) hat, einfach den Wert auf FF ändern -> _GDIPlus_GraphicsClear($backbuffer, 0xFF000000).


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    • Offizieller Beitrag

    Kann man nur einen Text neu zeichnen?

    Stell dir das in etwa so vor:
    - Grafik-Handle ist eine Tafel
    - Pen-Handle ist die Kreide
    - Bitmap- oder Text-Handle ist das, was mit Kreide aufgemalt wird
    Du kannst mit der Kreide munter über die alten Inhalte malen. Aber du kannst nicht einen speziellen Kreidestrich entfernen, ohne dass davon der Rest betroffen wird.
    Wenn du zum Bsp. 3 Texte nacheinander 'malen' willst und Nr. 2 entfernen, mußt du halt die Tafel abwischen und Text 1 und 3 nochmal 'malen'.

  • Andy Danke genau das Habe ich gesucht habs jetzt eingebaut und es funktioniert

    optisch wird nur noch der Test geändert

    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>

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

    HotKeySet("{ESC}","_func")

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

    $hGUI = GUICreate("GDI+", 400, 300)
    $hWnd = WinGetHandle("GDI+")
    GUISetState()
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    _GDIPlus_GraphicsDrawString($hGraphic, "Hallo Welt", 140, 110)

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

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

    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()

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

    Func _func()
    _WinAPI_RedrawWindow($hgui)
    _GDIPlus_GraphicsDrawString($hGraphic, "Hallo", 140, 110)
    EndFunc

    [/autoit]