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
Narses: 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:
| procedure GetBitmapFontString(bmp: TBitmap; str: String); var Font: TBitmap; var i, x, y: Integer; var SourceRect, DestRect: TRect; begin Font := TBitmap.Create; Font.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'font.bmp');
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;
x := 0; y := 0; bmp.Width := Length(str) * 64; bmp.height := 64; for i := 1 to Length(str) do begin case str[i] of ' ': begin x := 0; y := 0; end; 'a'..'z': begin x := Ord(str[i])-96; y := 0; while x > 15 do begin dec(x, 16); inc(y); end; end; '.': begin x := 11; y := 1; end; '!': begin x := 12; y := 1; end; '?': begin x := 12; y := 1; end; '0': begin x := 7; y := 2; end; '1'..'9': begin x := Ord(str[i])-35; y := 0; while x > 15 do begin dec(x, 16); inc(y); end; end; ',': begin x := 8; y := 2; end; ':': begin x := 9; y := 2; end; '-': begin x := 10; y := 2; end; '"': begin x := 11; y := 2; end; '$': begin x := 12; y := 2; end; '''': begin x := 13; y := 2; end; end;
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.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:
| 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
Narses: Delphi-Tags hinzugefügt
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 ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!