GDIPlus Grafik in mm/pt?

  • Servus,

    Ich möchte für ein Tool eine Erweiterung schreiben.
    Es soll eine Rechnung durchgeführt und diese auch grafisch dargestellt werden.

    Die Rechnung ist kein Problem.
    Zum erstellen der Grafik verwende ich die GDIPlus-Engine...

    Die Grafik ist leider teilweise schon ein Problem, da ich auch eine Druck-Funktion verwende und es daher vorteilhaft wäre, wenn die Grafik in einem 1:1 Maßstab gedruckt werden würde. D.h.: Ich müsste die Grafik auch 1:1 Zeichnen. Allerdings nicht in Pixel sondern in z.B. mm...

    Könnte man das ganze einfach in "pt" speichern? (pt = Points = standard Einheit für Drucker)

    In anderen Programmiersprachen gibt es ja die Möglichkeit, jede Grafik des GUI's in eine Art Chache zu speichern und beliebig aufzurufen bzw. eben auch zu DRUCKEN....

    Hat jemand eine Ahnung wie man das umsetzen könnte?

    Hier ein Link zu einer Beispiel-Grafik:
    Segment Beispiel - IMG-UP.net - Your Free Image Hoster

    Die Formel lautet:
    r = (1/2) • { [(s/2)² / h] +h }

    Wobei gilt:
    r = Radius
    s = Sehne
    h = Segmenthöhe

    Der wichtige Teil ist der Kreissektor der die drei Punkte verbindet, d.h. es muss bei dem A4-Druck nicht ein Kreis mit 50cm Durchmesser draufpassen.....

    For Example:

    Würd mich freuen, stehe schon seit 3Tagen auf der Leitung....


    Grüße Stoani

    mfg, Stoani

    Einmal editiert, zuletzt von Stoani (6. Oktober 2011 um 22:47) aus folgendem Grund: Gelöst! Danke @autoit.de

  • Hi

    Zunächst mal benötigst du GDIp.au3: http://www.autoitscript.com/forum/topic/106021-gdipau3/
    Darin findest du die Funktion _GDIPlus_GraphicsSetPageUnit.

    Ich würde es in etwa so machen:
    Ein Backbuffer in der Größe des Fensters in Pixel Units
    Eine eigene Grafik in Milimeter Units zum zeichnen

    Spoiler anzeigen
    [autoit]

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

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

    Opt("GUIOnEventMode", 1)

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

    _GDIPlus_Startup()

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

    $hGui = GUICreate("A4", 210, 297)
    GUISetOnEvent(-3, "_Exit")

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

    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics(210, 297, $hGraphics) ;Backbuffer verhindert flackern
    $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)

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

    $aSize = _CalcBitmapSize(210, 297) ;Wie groß ist das in Pixel?
    ConsoleWrite($aSize[0] & " " & $aSize[1] & @CRLF)
    $hBmpMilimeter = _GDIPlus_BitmapCreateFromGraphics($aSize[0], $aSize[1], $hGraphics)
    $hGfxMilimeter = _GDIPlus_ImageGetGraphicsContext($hBmpMilimeter)
    _GDIPlus_GraphicsSetPageUnit($hGfxMilimeter, 6)
    _GDIPlus_GraphicsClear($hGfxMilimeter, 0xFFFFFFFF)

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

    $hPen = _GDIPlus_PenCreate(0xFF000000, 4)
    _GDIPlus_GraphicsDrawRect($hGfxMilimeter, 1, 1, 208, 295, $hPen) ;Zeichnen in Millimeter

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

    _GDIPlus_ImageSaveToFile($hBmpMilimeter, @ScriptDir & "\A4.bmp") ;Speichern - Zieldatei sollte A4 Größe haben

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

    _GDIPlus_GraphicsDrawImageRect($hGfxBuffer, $hBmpMilimeter, 0, 0, 210, 297) ;zeichne Milimetergrafik verkleinert auf Backbuffer

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUISetState()

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

    While 1
    Sleep(100)
    WEnd

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

    Func _CalcBitmapSize($iW, $iH)
    Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
    Local $aPoints[2][2]
    $aPoints[0][0] = 1
    $aPoints[1][0] = $iW
    $aPoints[1][1] = $iH

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

    _GDIPlus_GraphicsSetPageUnit($hGraphics, 6)
    Local $aResult = _GDIPlus_GraphicsTransformPoints($hGraphics, $aPoints, 2, 1)

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

    _GDIPlus_GraphicsDispose($hGraphics)

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

    Local $aReturn[2]
    $aReturn[0] = Ceiling($aResult[1][0])
    $aReturn[1] = Ceiling($aResult[1][1])

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

    Return $aReturn
    EndFunc ;==>_CalcBitmapSize

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

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func _Exit()
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGfxMilimeter)
    _GDIPlus_BitmapDispose($hBmpMilimeter)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    E

  • Ich denke du kannst folgednermaßen DPI-Werte festlegen:
    _GDIPlus_ImageSetPropertyItem mit PropertyTagXResolution, PropertyTagYResolution, PropertyTagResolutionXUnit, PropertyTagResolutionYUnit,
    und/oder PropertyTagResolutionUnit, PropertyTagPixelUnit, PropertyTagPixelPerUnitX, PropertyTagPixelPerUnitY

  • Vielen Dank euch beiden!

    Wie war das nochmal, man muss nicht alles wissen..... Man muss wissen wo man nachschauen kann! ;D

    Ne, scherz beiseite, ich bin echt froh das es Leute wie euch gibt! :)


    Grüße aus Upper Austria

    Stoani

    mfg, Stoani