Moin,
Ich suche eine Funktion, die einen BB-Code behafteten Text anständig auf ein GFX zeichnet.
Habe dazu schon etwas entworfen, scheitere aber grundsätzlich an der Unkenntnis der exakten Buchstabengröße. Dabei ist unrelevant wie groß die Buchstaben tatsächlich sind (dafür hätte ich eine Funktion), sondern wie groß der "Kasten" ist den sie beanspruchen. Für allgemeine Ratschläge bin ich natürlich auch offen
Hier mal als kleines Beispiel ein Skript.
Spoiler anzeigen
#include <GDIPlus.au3>
; Codes:
; X Kursiv
; X Fett
; X Unterstrichen
; X [c=rot] Roter Text [/code] - Farbe als Wort
; X
[autoit]- Farbe der 16 Windows Farben
; X [c=(0x)FF0000] Roter Text [/code] - Farbe als 24Bit Wert
; X [c=(0x)80FF0000] Halbtransparent Rot [/code] - Farbe als 32Bit Wert
; X [s] Durchgestrichen [/s]
; X Größe in Pixeln
; X [x=5] - Zur korrektur kann x und y angepasst werden
; X [y=-1] - Zur korrektur kann x und y angepasst werden
; [center] Zentriert [/center]
; Schriftart
;
; https://autoit.de/www.a.de/bild.jpg
; Klick Mich
Global $sText = 'Hallo' & @CRLF & 'Das sieht total seltsam aus...' & @CRLF & _
'Sowas möchte ich nicht zum Frühstück essen !' & @CRLF & _
'Dies is[s]t ein sehr krea[/s]tiver Text' & @CRLF & @CRLF & @CRLF & _
'[size=50]Hallo[y=10]du[y=0] Spaßvogel[/size]' & @CRLF & @CRLF & @CRLF & @CRLF & _
'[size=50]a[size=40]bcdefghijklmnopqrstuvwxyz[/size][/size]' & @CRLF & _
'
[autoit]so [c=dunkelrot]mag[/code] i[/size]ch [c=80FF8040]das[/code] !' & _
@CRLF & @CRLF & '[c=ff0000]Das ist [y=-5]ein[y=0] Test[/code]' & @CRLF & @CRLF & _
'[x=100]Update auf Version 0.0.0.1[x=0]' & @CRLF & _
'' & @CRLF & _
'Neu:' & @CRLF & _
' - Account über Webseite registrieren' & @CRLF & _
' - Ingame Login' & @CRLF & _
' - Ingame Menu' & @CRLF & _
' - Ein Berg auf dem sich ein kleines Dorf mit allen' & @CRLF & _
' momentanen Models befindet.' & @CRLF & _
' - Leichte Vegetation' & @CRLF & _
' - Man kann sich die Landschaft ansehen' & @CRLF & _
'' & @CRLF & _
'Bugfixes:' & @CRLF & _
' - Noch keine, da dies das "First Release" ist !' & @CRLF & _
'' & @CRLF & _
'[x=100]euer Team ;)[x=0]' & @CRLF & _
'' & @CRLF & _
'[y=-80][x=80][size=9]ich stehe einfach mittendrin :P'
Global $bRenew
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_Startup()
Global $hGUI = GUICreate('Test', 1000, 500)
Global $hGFX = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Global $hBMP = _GDIPlus_BitmapCreateFromGraphics(500, 500, $hGFX)
Global $hBUF = _GDIPlus_ImageGetGraphicsContext($hBMP)
Global $hEdit = GUICtrlCreateEdit($sText, 500, 0, 500, 500, 0x1000)
_GDIPlus_GraphicsClear($hBUF, 0xFFFFFFFF)
DllCall($ghGDIPDll, 'uint', 'GdipSetTextRenderingHint', 'hwnd', $hBUF, 'int', 5)
_BB_Draw($hBUF, 0, 0, $sText)
WM_PAINT()
GUIRegisterMsg(0x0111, 'WM_COMMAND')
GUIRegisterMsg(0xF, 'WM_PAINT')
GUISetState(@SW_SHOW, $hGUI)
;~ MouseClick(
[/autoit] [autoit][/autoit] [autoit]While GUIGetMsg() <> -3
If $bRenew Then
_GDIPlus_GraphicsClear($hBUF, 0xFFFFFFFF)
_BB_Draw($hBUF, 0, 0, GUICtrlRead($hEdit))
WM_PAINT()
$bRenew = False
EndIf
WEnd
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
Local $iCode = _WinAPI_HiWord($wParam)
If $iCode = 768 Then $bRenew = True
EndFunc ;==>WM_COMMAND
Func _BB_Draw($hGFX, $iX, $iY, $sText)
$sText = StringReplace($sText, @CR, '', 0, 1)
Local $iStepSizeX = 9, $iStepSizeY = 14, $sChar, $iStepX, $iStepY, $aFormat, $iLen, _
$sFormat_Kursiv, $sFormat_Fett, $sFormat_BB_Farbe = 'FF000000', $sFormat_Unterstrichen, $sFormat_Size = '10', $sFormat_Font, $sFormat_Durchgestrichen, _
$xOff = 0, $yOff = 0
For $i = 1 To StringLen($sText) Step 1
$sChar = StringMid($sText, $i, 1)
Switch $sChar
Case '['
For $o = $i To StringLen($sText) Step 1
If StringMid($sText, $o, 1) = ']' Then
$iLen = $o - $i
ExitLoop
EndIf
Next
_BB_SetFormat(StringMid($sText, $i + 1, $iLen - 1), $sFormat_Fett, $sFormat_Kursiv, $sFormat_Unterstrichen, $sFormat_Durchgestrichen, $sFormat_Size, $sFormat_BB_Farbe, $xOff, $yOff)
$i += $iLen
Case @LF
$iStepY += 1
$iStepX = 0
Case Else
$aFormat = _BB_GetFormat($sFormat_Fett, $sFormat_Kursiv, $sFormat_Unterstrichen, $sFormat_Durchgestrichen, $sFormat_Size, $sFormat_BB_Farbe)
_BB_Char($hGFX, $iX + $iStepX * $iStepSizeX + $xOff, $iY + $iStepY * $iStepSizeY + $yOff, $sChar, $aFormat)
$iStepX += 1 * Int('0x' & $aFormat[4]) / 16
EndSwitch
Next
EndFunc ;==>_BB_Draw
Func _BB_SetFormat($s, ByRef $sFormat_Fett, ByRef $sFormat_Kursiv, ByRef $sFormat_Unterstrichen, ByRef $sFormat_Durchgestrichen, ByRef $sFormat_Size, ByRef $sFormat_BB_Farbe, ByRef $xOff, ByRef $yOff)
Local $sLeft = StringLeft($s, 1)
If $sLeft = '/' Then
$s = StringTrimLeft($s, 1)
Switch StringLeft($s, 1)
Case 'b'
$sFormat_Fett = StringTrimRight($sFormat_Fett, 2)
Case 'i'
$sFormat_Kursiv = StringTrimRight($sFormat_Kursiv, 2)
Case 'u'
$sFormat_Unterstrichen = StringTrimRight($sFormat_Unterstrichen, 2)
Case 's'
Switch StringLeft($s, 4)
Case 'size'
$sFormat_Size = StringTrimRight($sFormat_Size, 3)
Case Else
$sFormat_Durchgestrichen = StringTrimRight($sFormat_Durchgestrichen, 2)
EndSwitch
Case 'c'
$sFormat_BB_Farbe = StringTrimRight($sFormat_BB_Farbe, 9)
EndSwitch
Else
Switch StringLeft($s, 1)
Case 'b'
If $sFormat_Fett Then
$sFormat_Fett &= '|1'
Else
$sFormat_Fett = '1'
EndIf
Case 'i'
If $sFormat_Kursiv Then
$sFormat_Kursiv &= '|1'
Else
$sFormat_Kursiv = '1'
EndIf
Case 'u'
If $sFormat_Unterstrichen Then
$sFormat_Unterstrichen &= '|1'
Else
$sFormat_Unterstrichen = '1'
EndIf
Case 's'
Switch StringLeft($s, 5)
Case 'size='
If $sFormat_Size Then
$sFormat_Size &= '|' & Hex(Int(StringTrimLeft($s, 5)), 2)
Else
$sFormat_Size = Hex(Int(StringTrimLeft($s, 5)), 2)
EndIf
Case Else
If $sFormat_Durchgestrichen Then
$sFormat_Durchgestrichen &= '|1'
Else
$sFormat_Durchgestrichen = '1'
EndIf
EndSwitch
Case 'c'
If $sFormat_BB_Farbe Then
$sFormat_BB_Farbe &= '|' & _BB_Farbe($s)
Else
$sFormat_BB_Farbe = _BB_Farbe($s)
EndIf
Case 'x'
$xOff = Int(StringTrimLeft($s, 2))
Case 'y'
$yOff = Int(StringTrimLeft($s, 2))
EndSwitch
EndIf
EndFunc ;==>_BB_SetFormat
Func _BB_Farbe($s)
Local $x = StringSplit($s, '=')
Local $c = $x[$x[0]]
Local Static $aDosCol[16] = [0xFF000000, 0xFF800000, 0xFF008000, 0xFF808000, 0xFF000080, 0xFF800080, 0xFF008080, 0xFFC0C0C0, 0xFF808080, 0xFFFF0000, 0xFF00FF00, 0xFFFFFF00, 0xFF0000FF, 0xFFFF00FF, 0xFF00FFFF, 0xFFFFFFFF]
Local Static $aNamenEn[16] = ['black', 'maroon', 'green', 'olive', 'navy', 'purple', 'teal', 'silver', 'gray', 'red', 'lime', 'yellow', 'blue', 'fuchsia', 'aqua', 'white']
Local Static $aNamenDe[16] = ['schwarz', 'dunkelrot', 'dunkelgrün', 'oliv', 'dunkelblau', 'lila', 'türkis', 'hellgrau', 'grau', 'rot', 'grün', 'gelb', 'blau', 'pink', 'hellblau', 'weiß']
If StringIsXDigit($c) Then
Switch StringLen($c)
Case 1, 2
$c = Int($c)
$c -= Int($c / 16) * 16
Return Hex($aDosCol[$c],
Case 6
Return 'FF' & $c
Case 8
Return $c
EndSwitch
Else
For $i = 0 To 15 Step 1
If ($c = $aNamenEn[$i]) Or ($c = $aNamenDe[$i]) Then
ConsoleWrite($i & @CRLF)
Return Hex($aDosCol[Int($i)],
EndIf
Next
EndIf
Return 'FF000000'
EndFunc ;==>_BB_Farbe
Func _BB_Char($hGFX, $iX, $iY, $sChar, $aFormat)
Local $hBRU = _GDIPlus_BrushCreateSolid('0x' & $aFormat[5])
Local $hFOR = _GDIPlus_StringFormatCreate()
Local $hFAM = _GDIPlus_FontFamilyCreate('Courier New')
Local $hFON = _GDIPlus_FontCreate($hFAM, Int('0x' & $aFormat[4]), $aFormat[0] * 1 + $aFormat[1] * 2 + $aFormat[2] * 4 + $aFormat[3] * 8, 2)
Local $tRect = _GDIPlus_RectFCreate($iX - Int('0x' & $aFormat[4]) * 0.25 + 2, $iY - Int('0x' & $aFormat[4]) ^ 1.34 * 0.19 + 6)
_GDIPlus_GraphicsDrawStringEx($hGFX, $sChar, $hFON, $tRect, $hFOR, $hBRU)
_GDIPlus_FontDispose($hFON)
_GDIPlus_FontFamilyDispose($hFAM)
_GDIPlus_StringFormatDispose($hFOR)
_GDIPlus_BrushDispose($hBRU)
EndFunc ;==>_BB_Char
Func _BB_GetFormat($sFormat_Fett, $sFormat_Kursiv, $sFormat_Unterstrichen, $sFormat_Durchgestrichen, $sFormat_Size, $sFormat_BB_Farbe)
Local $a[6], $b
$b = StringSplit($sFormat_Fett, '|')
$a[0] = $b[$b[0]]
$b = StringSplit($sFormat_Kursiv, '|')
$a[1] = $b[$b[0]]
$b = StringSplit($sFormat_Unterstrichen, '|')
$a[2] = $b[$b[0]]
$b = StringSplit($sFormat_Durchgestrichen, '|')
$a[3] = $b[$b[0]]
$b = StringSplit($sFormat_Size, '|')
$a[4] = $b[$b[0]]
$b = StringSplit($sFormat_BB_Farbe, '|')
$a[5] = $b[$b[0]]
Return $a
EndFunc ;==>_BB_GetFormat
Func WM_PAINT()
_GDIPlus_GraphicsDrawImage($hGFX, $hBMP, 0, 0)
EndFunc ;==>WM_PAINT
Edit: Hab den Tag mal auf "gelöst" gesetzt, da ich glaube die Lösung gefunden zu haben.
Sollte dem nicht so sein mache ich wieder auf und spezifiziere meine Frage neu.
Edit2: Nun ist alles geklärt.
lg
Mars