Einzelnen Beitrag anzeigen

Furtbichler
(Gast)

n/a Beiträge
 
#14

AW: Algorithmus - Zahlen auf Display zentrieren

  Alt 26. Jul 2013, 16: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 08:28 Uhr)
  Mit Zitat antworten Zitat