gdiplus

  • hi,

    hab wieder mal probleme mit gdiplus.

    Erste Frage:
    Ich hab ein bild das ich strecken will,
    da es nur 1 pixel breit ist. Jedoch beim
    strecken verläuft das bild in den hintergrund, das ich nicht möchte,
    wenn ich die breite des streckens jedoch auf 100000 pixel stell funktioniert es.
    Aber das kann doch nicht sein wie kann ich den verlauf verhindern.

    Zweite Frage:
    Ich will ein text mit gdiplus zeichnen lassen und zwar mittig mit dem befehl
    _GDIPlus_StringFormatSetLineAlign($Format,1) aus der GDIP-UDF.
    Das funzt auch. nur muss ich jetzt noch wissen wie lang der text in pixeln ist
    wenn es gezeichnet ist. geht des au irgendwie mit der gdip-udf.

  • Zur ersten Frage:

    Ich hatte das Problem bei meinem Spiel auch, dass die Grafiken am Rand transparent wurden.
    Mattthias hat mir da zwei Funktionen gegeben, die das verhindern.
    Hab dein Script mal angepasst:

    Spoiler anzeigen
    [autoit]

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

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

    $GUI = GUICreate("Test", 800, 600)

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

    GUISetState(@SW_SHOW)

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

    _GDIPlus_Startup()

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

    $hBitmap = _GDIPlus_BitmapCreateFromFile(".\file.png")
    $Graphic = _GDIPlus_GraphicsCreateFromHWND ($GUI)
    _GDIPlus_GraphicsSetPixelOffsetMode($Graphic, 2)
    _GDIPlus_GraphicsSetInterpolationMode($Graphic, 5)
    _GDIPlus_GraphicsDrawImageRect($Graphic, $hBitmap, 0, 0, 800, 121)

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

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd

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

    ; // Danke Mattthias für den Code :D
    Func _GDIPlus_GraphicsSetInterpolationMode($hBuffers, $iInterpolationMode)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "hwnd", $hBuffers, "int", $iInterpolationMode)
    If @error Then Return SetError(@error, @extended, False)
    Return $aResult[0] = 0
    EndFunc ;==>_GDIPlus_GraphicsSetInterpolationMode
    Func _GDIPlus_GraphicsSetPixelOffsetMode($hBuffers, $iPixelOffsetMode)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetPixelOffsetMode", "hwnd", $hBuffers, "int", $iPixelOffsetMode)

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

    If @error Then Return SetError(@error, @extended, False)
    $GDIP_STATUS = $aResult[0]
    Return $aResult[0] = 0
    EndFunc ;==>_GDIPlus_GraphicsSetPixelOffsetMode
    ; // ENDE von dem Code von Mattthias

    [/autoit]

    Zur zweiten Frage:

    Wie genau das mit GDIPlus gehen könnte weiß ich nicht, aber du kannst ja die Anzahl der Zeichen rausfinden und dem entsprechend pro Zeichen eine gewisse Anzahl an Pixel einrechnen, diese Gesamtanzahl durch 2 und du hast die Mitte. Mit "Courier New" dürfte das ganz gut gehen, ich weiß aber nicht wie gut es mit "Arial" oder "Times New Roman" geht.

    mfg
    Hauke

  • Die einfachste Methode um einen String zu messen ist: _GDIPlus_GraphicsMeasureString
    Ist auch bei der standard-Include dabei.
    Allerdings ist diese Methode nicht 100% Pixelgenau

    Es gibt noch die Möglichkeit den String als Path zu erstellen.
    Damit hat man die Größe dan Pixelgenau

    Funktioniert in etwa so:

    [autoit]

    Local $hFormat = _GDIPlus_StringFormatCreate()
    Local $hFamily = _GDIPlus_FontFamilyCreate("Courier New")
    Local $tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
    _GDIPlus_PathAddString($hPath, "Test", $tLayout, $hFamily, 1, 50, $hFormat)
    Global $aBounds=_GDIPlus_PathGetWorldBounds($hPath)

    [/autoit]


    Benötigt GDIp.au3

    Edit: Ach ja, zuerst muss der Pfad natürlich erstellt werden: $hPath=_GDIPlus_PathCreate()
    Und via _GDIPlus_GraphicsDrawPath bzw. _GDIPlus_GraphicsFillPath kann er dann gezeichnet werden.
    _GDIPlus_PathDispose nicht vergessen
    _GDIPlus_PathReset um den Pfad wieder zu leeren, falls dieser schon Grafiken enthält...


    E