(Gast)
n/a Beiträge
|
AW: Algorithmus - Zahlen auf Display zentrieren
26. Jul 2013, 17:26
Zitat:
Deshalb musste ich aus jeder Zahl ein eigenes Bitmap machen. Das mit dem Kerning schau ich mir mal genauer an...
Na dann hast Du doch die maximale Freiheit. Stichwort Kerning: Fixed Space Fonts (Courier z.B.) benötigen kein Kerning Du kannst Dir ja die Bitmaps so wie eine Consolas, Letter Gothic oder Lucida Sans Typewriter erstellen bzw. von Windows sogar rendern lassen: Einfach in 150pt (oder was weiss ich) in Word, Screenshot => Bitmap => Fertig.
Hier mal mein bescheidener Beitrag (Zahl wird von rechts nach links gezeichnet). Die Kerninginfo steht im Array 'KerningCorrection'.
Die '1' hinter einer '0' wird um 10 Pixel, die '7' hinter einer '0' um 6 pixel nach links verschoben,
Delphi-Quellcode:
Const
KerningCorrection : Array [0..9, 0..9] Of Integer = (
{ 0 1 2 3 4 5 6 7 8 9}
{0} ( 0,-10, 0, 0, 0, 0, 0, -6, 0, 0),
{1} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
{2} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
{3} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
{4} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
{5} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
{6} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
{7} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
{8} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
{9} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
);
Function CalcNumberWidth (Number : Integer) : Integer;
Var
Digit, DigitToTheRight : Integer;
Begin
Result := 0;
DigitToTheRight := -1;
Repeat
Digit := Number mod 10;
Number := Number div 10;
Result := Result + GetDigitWidth(Digit,false) + GetKerningCorrection (Digit, DigitToTheRight);
DigitToTheRight := Digit;
Until Number=0;
End;
Procedure DrawNumberAt (LeftPos, Number : Integer);
Var
Digit, DigitToTheRight : Integer;
Begin
Repeat
Digit := Number mod 10;
Number := Number div 10;
LeftPos := LeftPos - GetDigitWidth(Digit,false) + GetKerningCorrection (Digit, DigitToTheRight);
DigitToTheRight := Digit;
DrawDigitAt(LeftPos, Digit);
Until Number=0;
End;
Function GetKerningCorrection (Digit, DigitToTheRight : Integer) : Integer;
// > 0 add spacing, < 0 reduce spacing
Begin
If DigitToTheRight = -1 then
result := 0
else
result := AdditionalSpacing[Digit, DigitToTheRight];
End;
Procedure DisplayNumber (Number : Integer; Alignment : TAlignment);
Const
DisplayWidth = 320;
Var
NumberWidth, LeftPos, i : Integer;
Begin
ClientConnect;
Try
NumberWidth := CalcNumberWidth(Number);
case Alignment of
taLeftAlignment:
LeftPos := DisplayWidth - NumberWidth;
taCenter:
LeftPos := (DisplayWidth + NumberWidth) div 2;
taRightAligment
LeftPos := DisplayWidth;
end;
DrawNumberAt(LeftPos, Number);
Finally
ClientDisconnect
End
End;
Ungetestet.
Geändert von Furtbichler (27. Jul 2013 um 09:28 Uhr)
|