Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Besondere Buchstaben verwenden


Nano-Ware - Do 03.06.10 11:28
Titel: Besondere Buchstaben verwenden
Hey,

ich würde gerne in meinem Programm verschiedene Texte mit einer Gelben besonderen schrift schreiben (siehe Dateianhang) nur wie ist das am Besten möglich diese Schrift darzustellen, falls mein erster Gedanke gut ist helft mir bitte bei der umsetzung ;D

Also

Nehmen wir an man hat ein Gitter von 64x64 genommen dass man einfach die einzelen Buchstaben herauskopiert und neu zeichnet.. Ich habe leider garkeinen Ansatz möchte aber auch keinen C&P Code haben wichtig ist auch, dass das Bild im Programm eingebunden sein soll, weil es keine Extradateien geben soll.... THX^^


Gausi - Do 03.06.10 11:58

Soweit ich weiß, benutzt Winamp auch (optional/früher mal) solche "Bitmap Schriften". Man ist dann natürlich auf diese Zeichen beschränkt, d.h. Sonderzeichen oder gar Unicode kann man dann vergessen.

Vorgehensweise ist dann die: Den String durchgehen, für jedes Zeichen die passenden Gitterkoordinaten ausrechnen, das per CopyRect (oder ähnliches) auf das Zielcanvas kopieren und dann die "Zielkoordinaten" ändern, damit das nächste Zeichen daneben gemalt wird.

Das Bild könnte als Ressorce eingebunden sein, oder etwas Quick&Dirty in einer ImageList, wobei man bei der ImageList natürlich auch die Einzelzeichen speichern könnte, was dann auch wieder Vorteile hätte. Denn dann müsste man die Einzelgrafiken nicht aus dem großen Bild rauspopeln.


Nano-Ware - Do 03.06.10 12:26

Stimmt ich versuch das einfach mal

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Leider komme ich ganz und garnicht weiter.. Mit Grafiken habe ich mich leider noch nicht beschäftigt ;D also ich schaue wieviele Buchstaben der Text hat und rechne dann Anzahl mal 64 nur wie erstlle ich jetzt eine leere Bitmap und trage dann alle 64pix einen bestimmten Buchstaben(Bild) ein?


Bergmann89 - Fr 04.06.10 00:07

Hey,

das besste is wenn du dir da ne Prozedur machst, die dir die BMP zusammen setzt. Du weißt ja die Breite eines jeden Buchstabens. und die Länge des Strings hast du auch, also muss die BMP.width := Length(str) * CHAR_WIDTH sein. Mit der Höhe is es dann ähnlich, kommt drauf an ob du Zeilenumbrüche oder sowas drin hast. Mit BMP.Canvas.CopyRect() kannst du dann bestimmte bereiche aus der BMP mit den Buchstaben in die neue BMP kopieren. (siehe Delphi-Hilfe).

MfG Bergmann.


Nano-Ware - Fr 04.06.10 00:16

Ich würde das so versuchen, dass jeder Buchstabe in einer Imagelist gespeichert ist. Könntest du eventuell ein Beispiel machen? Bei dem eine Bitmap mit Höhe 64px und Breite 2x64px erstellt wird und dann aus einer ImageList an Stelle 1 ein Bild aus ImageList1 mit index 0 und an Stelle 2 eins mit Index 1 kopiert wird? Wie schon gesagt habe ich leider keinen Ansatz ... währe nett;D thx schonma


Bergmann89 - Fr 04.06.10 00:44

Hey,


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
//schreibt die Buchstaben aus dem String in eine Bitmap
//@bmp: Bitmap in die die Bichstaben geschrieben werden;
//@str: String der in die Bitmap geschrieben werden soll;
procedure GetBitmapFontString(bmp: TBitmap; str: String);
var Font: TBitmap;
var i, x, y: Integer;
var SourceRect, DestRect: TRect;
begin
  //Font-Bitmap laden
  Font := TBitmap.Create;
  Font.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'font.bmp');

  //String auf gültige Zeichen prüfen
  str := LowerCase(str);
  i := 1;
  while i <= Length(str) do begin
    if not (str[i] in [' ','a'..'z','.','!','?','0'..'9',',',':','-','"','$','''']) then
      delete(str, i, 1)
    else
      inc(i);
  end;

  //Koordinaten des Zeichens ermitteln und in BMP kopieren
  x := 0;
  y := 0;
  bmp.Width  := Length(str) * 64;
  bmp.height := 64;
  for i := 1 to Length(str) do begin
    case str[i] of
//LEERZEICHEN
      ' 'begin
        x := 0;
        y := 0;
      end;
//BUCHSTABEN A BIS Z
      'a'..'z'begin
        x := Ord(str[i])-96//bei 'a' ist x = 1;
        y := 0;
        while x > 15 do begin
          dec(x, 16);
          inc(y);
        end;
      end;
//PUNKT
      '.'begin
        x := 11;
        y :=  1;
      end;
//AUSRUFEZEICHEN
      '!'begin
        x := 12;
        y :=  1;
      end;
//FAGEZEICHEN
      '?'begin
        x := 12;
        y :=  1;
      end;
//ZIFFER 0
      '0'begin
        x := 7;
        y := 2;
      end;
//ZIFFERN 1 BIS 9
      '1'..'9'begin
        x := Ord(str[i])-35//bei '1' ist x = 14;
        y := 0;
        while x > 15 do begin
          dec(x, 16);
          inc(y);
        end;
      end;
//KOMMA
      ','begin
        x := 8;
        y := 2;
      end;
//DOPPELPUNKT
      ':'begin
        x := 9;
        y := 2;
      end;
//MINUS/BINDESTRICH
      '-'begin
        x := 10;
        y :=  2;
      end;
//ANFÜHRUNGSZEICHEN
      '"'begin
        x := 11;
        y :=  2;
      end;
//DOLLARZEICHEN
      '$'begin
        x := 12;
        y :=  2;
      end;
//HOCHKOMMA
      ''''begin
        x := 13;
        y :=  2;
      end;
    end;

    //Zeichen in Bitmap kopieren
    SourceRect := Rect(   X * 64, Y * 64, (X+1)* 64, (Y+1) * 64);
    DestRect   := Rect((i-1)* 64,      0,    i * 64,         64);
    bmp.Canvas.CopyRect(DestRect, font.Canvas, SourceRect);
  end;

  //Font freigeben
  Font.Free;
end;


MfG Bergmann


Nano-Ware - Fr 04.06.10 01:15

Vielen Dank erstmal ;D ich hab leider nur diesen Teil nicht verstanden:

Delphi-Quelltext
1:
2:
3:
4:
5:
  //Zeichen in Bitmap kopieren
    SourceRect := Rect(   X * 64, Y * 64, (X+1)* 64, (Y+1) * 64);
    DestRect   := Rect((i-1)* 64,      0,    i * 64,         64);
    bmp.Canvas.CopyRect(DestRect, font.Canvas, SourceRect);
  end;

1. Was ist TRect?
2. Ich weiß auch nicht was CpbyRect für Parameter erwartet und wie der geht xD

Also was ist dann in SourceRect und was in DestRect

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


elundril - Fr 04.06.10 01:18

gibt mal hier [http://ref.dp200x.de/] TRect und CopyRect ein. ;)

lg elundril


Bergmann89 - Fr 04.06.10 01:21

Hey,

TRect definiert ein Rechteck, aus dem dann die Daten kopiert werden. Die Parameter für CopyRect sind (Zielrechteck, QuellCanvas, Quellrechteck). Also kopiert CopyRect alles was in SourceRect ist, von der SourceCanvas auf die Canvas des Objekts welches CopyRect aufruft, in den Breich von DestRect. Das hättest du aber auch ganz einfach in der Hilfe nachlesen können, dazu ist sie da! Also bitte in Zukunft erstmal bisl Eigeninitiative zeigen, denn es ist nich der Sinn der Sache das wir dir alles machen. Wenn du dir das selber erarbeitest beleibts wenigstens im Kopf :mahn: ;)

Mfg Bergmann


Nano-Ware - Fr 04.06.10 01:25

Danke Bergmann ich habs verstanden :P

EDIT// Wenn ich jetzt jeden Buchstaben einzeln in einer Imagelist hab geht ja CopyRect nichtmehr^^ wie "male" ich dann das ganze Bild in die Bitmap?


Bergmann89 - Fr 04.06.10 01:37

canvas.Draw mehr verrat ich jetzt mal nicht ;) Und CopyRect würde auch noch gehen, musst halt das Rect so groß wie die Canvas machen...


Nano-Ware - Fr 04.06.10 08:24

Okay vielen Dank hab es hinbekommen und sry dass ihr soviel schreiben musstet ich hatte einfach keine Ahnung


Bergmann89 - Fr 04.06.10 18:20

Kein Problem, dazu is das Forum ja da. Aber wie gesagt: Selbst ist der Mann ;)