GDI+, Backbuffer und _GDIPlus_MatrixTranslate

  • Hallo,

    ich habe es nun irgendwie geschafft die "Lettern" in die Mitte zu bringen, jedoch bekomm ich des mit dem Backbuffer und der Matrix nicht hin. Wie bewerkstellige ich es das nur das zentrierte Zeichen gezeichnet wird??

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <File.au3>
    #include <Fontconstants.au3>
    #include <GDIPlus.au3>
    #include <GuiButton.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListviewConstants.au3>
    #include <ProgressConstants.au3>
    ;#include <RegFunc.au3>
    #include <StaticConstants.au3>
    #include <UpDownConstants.au3>
    #include <WindowsConstants.au3>
    Opt("GUIOnEventMode", 1)
    Opt("PixelCoordMode", 0)
    ;Data
    $dString = 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,ä,ö,ü,1,2,3,4,5,6,7,8,9,0'
    $aString = StringSplit($dString, ',')
    Local $data[3][$aString[0] + 1]
    Local $rLinks, $rRechts, $rOben, $rUnten, $rWidth, $rHeight
    Local $aCoords1[100][100]
    Local $aCoords2[100][100]
    Local $aARect[1][5]
    For $i = 1 To $aString[0]
    $data[0][$i] = $i
    $data[1][$i] = StringUpper($aString[$i])
    $data[2][$i] = StringLower($aString[$i])
    Next
    $cDataCount = 1 ;Letter Stellenzähler
    $data[0][0] = (UBound($data, 2) - 1)
    ;Fonts
    $FontList = _FileListToArray(@WindowsDir & '\Fonts', '*.ttf', 1);Schriftarten aus Windows Fonts Ordner holen
    $var = _GetRegValues('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts');Schriftartennamen aus Windows Registry holen
    Dim $aItems[($FontList[0] + 1)]
    $x = 1
    $sgrA = 50
    #region ### START Koda GUI section ### Form=C:\Users\IBM\Desktop\AU3_OCR_new\Form1.kxf
    $msg = GUICreate("Form1", 680, 245, 215, 124)
    $Datei = GUICtrlCreateMenu("&Datei")
    $MenuItem1 = GUICtrlCreateMenuItem("Optionen" & @TAB & "", $Datei)
    $MenuItem2 = GUICtrlCreateMenuItem("Exit" & @TAB & "", $Datei)
    $Hilfe = GUICtrlCreateMenu("&Hilfe")
    $lLabel = GUICtrlCreateLabel('Speichern', 264, 10, 60, 20)
    $lLabel2 = GUICtrlCreateLabel('Input:', 277, 66, 60, 20)
    $listview = GUICtrlCreateListView("Nr.|Datei|Name", 337, 25, 335, 157)
    GUICtrlCreateLabel('Suchen: ', 480, 4, 60, 20)
    $sSuche = GUICtrlCreateInput('', 526, 1, 110, 20)
    $iInput = GUICtrlCreateEdit('', 269, 83, 50, 50, BitOR($ES_CENTER, $ES_WANTRETURN, $WS_BORDER))
    _GDIPlus_Startup()
    $gWin1 = GUICtrlCreatePic('', 10, 32, 100, 100, $SS_SUNKEN)
    $gWin2 = GUICtrlCreatePic('', 151, 32, 100, 100, $SS_SUNKEN)
    $hPic1 = GUICtrlGetHandle($gWin1)
    $hPic2 = GUICtrlGetHandle($gWin2)
    $hGfx1 = _GDIPlus_GraphicsCreateFromHWND($hPic1)
    $hGfx2 = _GDIPlus_GraphicsCreateFromHWND($hPic2)
    $hPen = _GDIPlus_PenCreate(0xFF000000)
    Global $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000)
    GUICtrlCreateLabel('Daten: ', 264, 30, 50, 20)
    GUICtrlCreateLabel('Bilder: ', 264, 45, 50, 20)
    $cDaten = GUICtrlCreateCheckbox('', 312, 32, 10, 10)
    $cBilder = GUICtrlCreateCheckbox('', 312, 47, 10, 10)
    $SchriftG = GUICtrlCreateInput($sgrA, 113, 70, 35, 20, $ES_NUMBER)
    $updwnSGR = GUICtrlCreateUpdown($SchriftG)
    $bUp = GUICtrlCreateButton("Up", 113, 32, 35, 35, -1, $WS_EX_CLIENTEDGE)
    $bDown = GUICtrlCreateButton("Dwn", 113, 97, 35, 35, -1, $WS_EX_CLIENTEDGE)
    $bStart = GUICtrlCreateButton("Start", 20, 156, 80, 25, -1, $WS_EX_STATICEDGE)
    $bAbbruch = GUICtrlCreateButton("Abbruch", 160, 156, 80, 25, -1, $WS_EX_STATICEDGE)
    $bDaten = GUICtrlCreateButton("Alle Daten", 412, 188, 190, 30)
    $bSetInput = GUICtrlCreateButton('Set', 274, 136, 40, 18)
    $Progress1 = GUICtrlCreateProgress(11, 139, 238, 10, -1, $WS_EX_STATICEDGE)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###
    _GUICtrlListView_SetColumnWidth($listview, 0, 28)
    _GUICtrlListView_SetColumnWidth($listview, 1, 40)
    _GUICtrlListView_SetColumnWidth($listview, 2, 180)
    GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
    GUICtrlSetOnEvent($bStart, "start")
    GUICtrlSetOnEvent($bUp, "UP")
    GUICtrlSetOnEvent($bDown, "DOWN")
    GUICtrlSetOnEvent($listview, "HandleClicks")
    GUICtrlSetOnEvent($updwnSGR, "SchriftGR")
    GUICtrlSetOnEvent($bDaten, "AlleDaten")
    ;GUICtrlSetOnEvent($bSetInput, "SetInput")
    GUICtrlSetLimit($SchriftG, 99)
    GUICtrlSetLimit($iInput, 1)
    GUICtrlSetFont($iInput, 26)
    GUICtrlSetFont($lLabel, 10, -1, 4)
    GUICtrlSetFont($lLabel2, 10, -1, 4)
    ;GUICtrlSetData($iInput, StringUpper($aString[$cDataCount]))
    GUICtrlSetState($cDaten, $GUI_CHECKED)
    GUICtrlSetState($cBilder, $GUI_CHECKED)
    ;GUI Liste schreiben
    For $a = 1 To UBound($var)
    If StringRight($var[$a - 1][2], 3) = 'ttf' Then
    If StringInStr($var[$a - 1][0], 'Bold', 1) = False And StringInStr($var[$a - 1][0], 'Italic', 1) = False _
    And StringInStr($var[$a - 1][0], 'MT Extra', 1) = False Then
    $nName = StringReplace($var[$a - 1][0], '(TrueType)', '', 1)
    $aItems[$x] = GUICtrlCreateListViewItem($x & '|' & $var[$a - 1][2] & '|' & $nName, $listview)
    GUICtrlSetOnEvent($aItems[$x], "HandleClicks")
    $x = $x + 1
    EndIf
    EndIf
    Next
    $x = 0
    $cFonts = _GUICtrlListView_GetItemCount($listview)
    _GUICtrlListView_SetSelectionMark($listview, 0)
    $sTrim = _GUICtrlListView_GetSelectionMark($listview)
    _GUICtrlListView_ClickItem($listview, 0, "left", False, 1)
    $pList = _GUICtrlListView_GetSelectedColumn($listview)

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

    While 1
    $rAktList = GUICtrlRead($listview)
    ;MsgBox(0, '', $pList)
    $sgr = GUICtrlRead($SchriftG)
    If $sgr <> $sgrA Then
    Drawing()
    $sgrA = $sgr
    EndIf
    $input = GUICtrlRead($iInput)
    ;Sleep(50)
    WEnd
    ;Funktionen
    Func start()
    $sgr = GUICtrlRead($SchriftG)
    $File1 = FileOpen(@ScriptDir & "\coords\" & $sTrim & "_" & $sgr & "_Upper_coords.txt", 10)
    $File2 = FileOpen(@ScriptDir & "\coords\" & $sTrim & "_" & $sgr & "_Lower_coords.txt", 10)
    ;Fenster Farbwert auslesen
    Local $wh1, $wh2
    ;_ArrayDisplay($rect)
    $wh1 = StringSplit($aARect[0][4], '/')
    $wh2 = StringSplit($aARect[1][4], '/')
    For $iX = 0 To $wh1[1]
    For $iY = 0 To $wh1[2]
    $iPixelColor1 = PixelGetColor($iX, $iY, GUICtrlGetHandle($gWin1))
    If Dec($iPixelColor1) < Dec('999999') Then
    FileWrite($File1, $iX & "," & $iY & @CRLF)
    EndIf
    Next
    Next
    For $iX = 0 To $wh2[1]
    For $iY = 0 To $wh2[2]
    $iPixelColor2 = PixelGetColor($iX, $iY, GUICtrlGetHandle($gWin2))
    If Dec($iPixelColor2) < Dec('999999') Then
    FileWrite($File2, $iX & "," & $iY & @CRLF)
    EndIf
    Next
    Next
    ;~ For $iX = 0 To 100 - 1
    ;~ For $iY = 0 To 100 - 1
    ;~ $iPixelColor1 = PixelGetColor($iX, $iY, GUICtrlGetHandle($gWin1))
    ;~ $iPixelColor2 = PixelGetColor($iX, $iY, GUICtrlGetHandle($gWin2))
    ;~ If Dec($iPixelColor1) < Dec('999999') Then
    ;~ FileWrite($File1, $iX & "," & $iY & @CRLF)
    ;~ EndIf
    ;~ If Dec($iPixelColor2) < Dec('999999') Then
    ;~ FileWrite($File2, $iX & "," & $iY & @CRLF)
    ;~ EndIf
    ;~ Next
    ;~ Next
    FileClose($File1)
    FileClose($File1)
    Drawing()
    EndFunc ;==>start
    Func Drawing()
    Local $iRectWidth, $iRectHeight, $aCtrlPos1
    GUICtrlSetColor($gWin1, 0)
    GUICtrlSetColor($gWin2, 0)
    $rInput = $aString[$cDataCount]
    $rInput1 = StringUpper($rInput)
    $rInput2 = StringLower($rInput)
    $sgr = GUICtrlRead($SchriftG)
    ; Größe des Graphic-Controls ermitteln (Noch 100x100, aber wer weiß, wann sich das ändert)
    $aCtrlPos1 = ControlGetPos($msg, '', $gWin1)
    $aCtrlPos2 = ControlGetPos($msg, '', $gWin2)
    $iRectWidth = $aCtrlPos1[2]
    $iRectHeight = $aCtrlPos1[3]
    _GDIPlus_GraphicsClear($hGfx1, 0xFFFFFFFF)
    _GDIPlus_GraphicsClear($hGfx2, 0xFFFFFFFF)
    $hBitmap1 = _GDIPlus_BitmapCreateFromGraphics(100, 100, $hGfx1)
    $hBitmap2 = _GDIPlus_BitmapCreateFromGraphics(100, 100, $hGfx2)
    $hBackbuffer1 = _GDIPlus_ImageGetGraphicsContext($hBitmap1)
    $hBackbuffer2 = _GDIPlus_ImageGetGraphicsContext($hBitmap2)
    _GDIPlus_GraphicsDrawString($hBackbuffer1, $rInput1, 0, 0, $sTrim, $sgr)
    _GDIPlus_GraphicsDrawString($hBackbuffer2, $rInput2, 0, 0, $sTrim, $sgr)
    _Zentriere($rInput1, 50, 50, $sgr, $sTrim, $hBackbuffer1)
    _Zentriere($rInput2, 50, 50, $sgr, $sTrim, $hBackbuffer2)
    _GDIPlus_GraphicsDrawImage($hGfx1, $hBitmap1, 0, 0)
    _GDIPlus_GraphicsDrawImage($hGfx2, $hBitmap2, 0, 0)

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

    EndFunc ;==>Drawing
    ;SpecialEvents
    Func SpecialEvents()
    Select
    Case @GUI_CtrlId = $GUI_EVENT_CLOSE
    cleanup()
    Exit
    EndSelect
    EndFunc ;==>SpecialEvents
    Func _Zentriere($sString, $iX, $iY, $fSize, $sFont, $hGfxBuffer)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePath", "int", 0, "int*", 0)
    Local $hPath = $aResult[2]
    Local $hFormat = _GDIPlus_StringFormatCreate()
    Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
    Local $tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
    Local $tBounds = _GDIPlus_RectFCreate(0, 0, 0, 0)
    DllCall($ghGDIPDll, "uint", "GdipAddPathString", "hwnd", $hPath, "wstr", $sString, "int", -1, "hwnd", $hFamily, "int", 0, "float", $fSize, "ptr", DllStructGetPtr($tLayout), "hwnd", $hFormat)
    DllCall($ghGDIPDll, "uint", "GdipGetPathWorldBounds", "hwnd", $hPath, "ptr", DllStructGetPtr($tBounds), "hwnd", 0, "hwnd", 0)
    Local $fRectX = DllStructGetData($tBounds, "X")
    Local $fRectY = DllStructGetData($tBounds, "Y")
    Local $fRectW = DllStructGetData($tBounds, "Width")
    Local $fRectH = DllStructGetData($tBounds, "Height")
    Local $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixTranslate($hMatrix, -$fRectX - $fRectW / 2 + $iX, -$fRectY - $fRectH / 2 + $iY)
    DllCall($ghGDIPDll, "uint", "GdipTransformPath", "hwnd", $hPath, "hwnd", $hMatrix)
    _GDIPlus_MatrixDispose($hMatrix)
    DllCall($ghGDIPDll, "uint", "GdipFillPath", "hwnd", $hGfxBuffer, "hwnd", $hBrush, "hwnd", $hPath)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    DllCall($ghGDIPDll, "uint", "GdipDeletePath", "hwnd", $hPath)
    EndFunc ;==>_Zentriere
    Func AlleDaten()
    ;_tRect()
    ;~ $sgr = GUICtrlRead($SchriftG)
    ;~ $File1 = FileOpen(@ScriptDir & "\coords\" & $sTrim & "_" & $sgr & "_Upper_coords.txt", 10)
    ;~ $File2 = FileOpen(@ScriptDir & "\coords\" & $sTrim & "_" & $sgr & "_Lower_coords.txt", 10)
    ;~ For $z = 1 To $data[0][0]
    ;~ For $iX = 0 To 100 - 1
    ;~ For $iY = 0 To 100 - 1
    ;~ $iPixelColor1 = PixelGetColor($iX, $iY, GUICtrlGetHandle($gWin1))
    ;~ $iPixelColor2 = PixelGetColor($iX, $iY, GUICtrlGetHandle($gWin2))
    ;~ If Dec($iPixelColor1) < Dec('999999') Then
    ;~ FileWrite($File1, $iX & "," & $iY & @CRLF)
    ;~ EndIf
    ;~ If Dec($iPixelColor2) < Dec('999999') Then
    ;~ FileWrite($File2, $iX & "," & $iY & @CRLF)
    ;~ EndIf
    ;~ Next
    ;~ Next
    ;~ Next
    ;~ FileClose($File1)
    ;~ FileClose($File1)
    EndFunc ;==>AlleDaten
    ;HandleClicks
    Func HandleClicks()
    $aktSel = GUICtrlRead(GUICtrlRead($listview))
    $aList = StringSplit($aktSel, '|')
    $sTrim = StringTrimRight($aList[3], 1)
    ;_ArrayDisplay($aList)
    Drawing()
    EndFunc ;==>HandleClicks
    Func _GDIPlus_GetPixel($hBitmap, $x, $Y)
    Local $result = DllCall($ghGDIPDLL, "int", "GdipBitmapGetPixel", "ptr", $hBitmap, "int", $x, "int", $Y, "dword*", 0)
    If @error Then Return SetError(1, 0, 0)
    Return SetError($result[0], 1, $result[4])
    EndFunc ;==>_GDIPlus_GetPixel
    ;UP()
    Func UP()
    If $cDataCount < $aString[0] Then
    $cDataCount = $cDataCount + 1
    EndIf
    Drawing()
    EndFunc ;==>UP
    ;DOWN()
    Func DOWN()
    If $cDataCount >= 2 Then
    $cDataCount = $cDataCount - 1
    EndIf
    Drawing()
    EndFunc ;==>DOWN
    Func SchriftGR()
    $sgr = GUICtrlRead($SchriftG)
    If $sgr <= 8 Then
    GUICtrlSetData($SchriftG, 8)
    EndIf
    If $sgr >= 99 Then
    GUICtrlSetData($SchriftG, 99)
    EndIf
    Drawing()
    EndFunc ;==>SchriftGR
    Func _GetRegValues($HKEY)
    Local $oMyError = ObjEvent("AutoIt.Error","MyErrFunc")
    If StringInStr($HKEY, '\') Then
    If StringRight($HKEY, 1) = '\' Then
    $HKEY = StringTrimRight($HKEY, 1)
    Local $strKeyPath = ''
    Else
    Local $strKeyPath = StringRight($HKEY, StringLen($HKEY)-StringInStr($HKEY, '\') )
    $HKEY = StringLeft($HKEY, StringInStr($HKEY, '\')-1)
    EndIf
    Else
    Local $strKeyPath = ''
    EndIf
    Select
    Case $HKEY = "HKEY_LOCAL_MACHINE" Or $HKEY = "HKLM"
    $HKEY = 0x80000002
    Case $HKEY = "HKEY_USERS" Or $HKEY = "HKU"
    $HKEY = 0x80000003
    Case $HKEY = "HKEY_CURRENT_USER" Or $HKEY = "HKCU"
    $HKEY = 0x80000001
    Case $HKEY = "HKEY_CLASSES_ROOT" Or $HKEY = "HKCR"
    $HKEY = 0x80000000
    Case $HKEY = "HKEY_CURRENT_CONFIG" Or $HKEY = "HKCC"
    $HKEY = 0x80000005
    EndSelect
    Local $oReg = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    Local $arrValueNames, $arrValueTypes, $strValue
    $oReg.EnumValues($HKEY, $strKeyPath, $arrValueNames, $arrValueTypes)
    $OEvent = ObjEvent($oReg, "EnumValues")
    If Not IsArray($arrValueNames) Then Return ''
    Local $arOut[UBound($arrValueNames)][3]
    For $i = 0 To UBound($arrValueNames) -1
    $arOut[$i][0] = $arrValueNames[$i]
    Switch $arrValueTypes[$i]
    Case 1
    $arOut[$i][1] = 'REG_SZ'
    $oReg.GetStringValue($HKEY, $strKeyPath, $arrValueNames[$i], $strValue)
    Case 2
    $arOut[$i][1] = 'REG_EXPAND_SZ'
    $oReg.GetExpandedStringValue($HKEY, $strKeyPath, $arrValueNames[$i], $strValue)
    Case 3
    $arOut[$i][1] = 'REG_BINARY'
    $oReg.GetBinaryValue($HKEY, $strKeyPath, $arrValueNames[$i], $strValue)
    Case 4
    $arOut[$i][1] = 'REG_DWORD'
    $oReg.GetStringValue($HKEY, $strKeyPath, $arrValueNames[$i], $strValue)
    Case 7
    $arOut[$i][1] = 'REG_MULTI_SZ'
    $oReg.GetMultiStringValue($HKEY, $strKeyPath, $arrValueNames[$i], $strValue)
    EndSwitch
    $arOut[$i][2] = $strValue
    Next
    Return $arOut
    EndFunc ;==>_GetRegValues
    Func MyErrFunc()
    Return
    Endfunc
    Func cleanup()
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGfx1)
    _GDIPlus_GraphicsDispose($hGfx2)
    _GDIPlus_Shutdown()
    EndFunc ;==>cleanup

    [/autoit]

    Update!