|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
HD
Anmeldungsdatum: 14.11.2015 Beiträge: 35 Wohnort: Polen
|
Verfasst am: 23.10.2016, 17:21 Titel: groessere Schrift |
|
|
Kann mir jemand sagen, wie ich in mein Programm 'S A T Z B A U' (kleine Helferlein) eine groessere Schrift einbauen kann (freeimage, freetype)? |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 23.10.2016, 18:13 Titel: |
|
|
Mit Freetype kannst du die Schriftgröße frei wählen. Ich habe in meinem Projekt Lengua eine Datei font.bi beiliegen, vielleicht hilft dir die. Da stecken ein paar Funktionen zur Ausgabe auf den Bildschirm, in einen Bildschirmpuffer und zentrierte Ausgabe drin - vorher muss natürlich ein Font korrekt geladen werden (passiert in der Hauptdatei lengua.bas). Und die Texte müssen in UTF-8 übergeben werden (oder natürlich ASCII). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
HD
Anmeldungsdatum: 14.11.2015 Beiträge: 35 Wohnort: Polen
|
Verfasst am: 23.10.2016, 19:26 Titel: fehlende Datei |
|
|
Lieber Nemored, vielen Dank fuer die schnelle Antwort. Beim Versuch, Lengua.bas zu compilieren, erhalte ich die Meldung: fbthread.bi fehlt. Die Datei befindet sich auch nicht auf meiner Festplatte. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 23.10.2016, 20:11 Titel: |
|
|
Hast du die neuste Version von FreeBASIC? (>= 1.01, für alles andere übernehme ich keine Garantie; besser natürlich 1.05)
font.bi braucht allerdings die fbthread.bi nicht; du kannst im Prinzip auch in der include/spanish/basic.bi das entsprechende #include herausnehmen und den Inhalt der Funktion speakThread() auskommentieren. Sprachausgabe funktioniert sowieso nur bei installiertem espeak. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
HD
Anmeldungsdatum: 14.11.2015 Beiträge: 35 Wohnort: Polen
|
Verfasst am: 24.10.2016, 10:47 Titel: -lfreetype? |
|
|
Unter FB 1.05 fehlt mir gem. compiler jetzt -lfreetype. Gruss HD |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 24.10.2016, 14:13 Titel: |
|
|
Dazu bitte ich die Hinweise auf der Projektseite zu beachten.
https://www.freebasic-portal.de/projekte/lengua-102.html hat Folgendes geschrieben: | Zur Ausgabe des Zeichensatzes wird die Bibliothek Freetype verwendet. Die zur Ausführung des Programms benötigten dll-Dateien (Windows 32bit) liegen dem Download-Paket bei. Um das Programm selbst zu compilieren, wird die Bibliothek libfreetype.a benötigt, die im lib-Ordner der FreeBASIC-Installation liegen muss.
An dieser Stelle ein herzliches Dankeschön an St_W für die Bereitstellung der compilierten Windows-Bibliothek! |
libfreetype.a ist auf der Projektseite verlinkt. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
HD
Anmeldungsdatum: 14.11.2015 Beiträge: 35 Wohnort: Polen
|
Verfasst am: 24.10.2016, 16:41 Titel: Danke nemored |
|
|
Das programm lengua laeuft. Gegen meines ist es sehr kompliziert. ausser fuer fehlermeldungen habe ich keine einfachen print-anweisungen gefunden.
Im Laufschrift-programm von Volta wird die Schrift mit put ausgegeben. Aber einfache put-anweisungen habe ich in lengua auch nicht gefunden.
Offenbar ist es sehr schwierig, in FreeBasic mit groesserer schrift zu arbeiten. wenn ich Voltas programm zugrunde lege, kann ich wohl eine deutlich groessere Schrift erreichen. Ich hoffe, dass ich dabei keine urheberrechte verletze. Aber es ist auch so schon recht umstaendlich, auf diese art eine groessere schriftausgabe zu erreichen. Ich dachte, dass ich mit freeimage, freetype einfach einen font fuer die normale print-ausgabe auswaehlen kann.
Gruss HD |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 24.10.2016, 17:06 Titel: |
|
|
Nein, es muss nicht kompliziert sein.
nemored's "font.bi" enthält gerade einmal 10 Methoden die eigentlich alle einen recht aussagekräftigen Namen haben. Du wirst vermutlich zuerst einmal eine Schriftart mit "getFont" laden und dann mit "printFT" Text ausgeben.
Alternativ zu nemored's Lösung: Im englischen Forum wurde kürzlich ein Projekt vorgestellt, das ebenso deine Wünsche erfüllen sollte:
http://www.freebasic.net/forum/viewtopic.php?f=14&t=25083
Es verwendet allerdings nicht FreeType sondern stb_truetype und unterstützt deswegen auch manche Features nicht die eben von dieser Bibliothek nicht unterstützt werden (die aber für übliche Anwendungszwecke i.A. vernachlässigbar sind). _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 24.10.2016, 17:40 Titel: |
|
|
Wenn deine Ansprüche nicht allzu hoch sind, hilft dir vielleicht diese kleine Function weiter.
Code: | Function zoom(text As String) As Any Ptr
Dim As Any Ptr img, imgz
Dim As Integer w, h
Dim As ULong pnt
img = ImageCreate(Len(text) * 8, 8, RGB(255, 0, 255), 32)
ImageInfo img, w, h
imgz = ImageCreate(w * 2, h * 2, RGB(255, 0, 255), 32)
Draw String img, (0,0), text, RGB(255, 255, 255)
For x As Integer = 0 To w - 1
For y As Integer = 0 To h - 1
pnt = Point(x, y, img)
PSet imgz, (x * 2, y * 2), pnt
PSet imgz, (x * 2 + 1, y * 2), pnt
PSet imgz, (x * 2, y * 2 + 1), pnt
PSet imgz, (x * 2 + 1, y * 2 + 1), pnt
Next
Next
ImageDestroy img
Return imgz
End Function
ScreenRes 300,300,32
Dim As Any Ptr tp = zoom("abcABC")
Put (100, 100), tp, Trans
Sleep
|
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 24.10.2016, 18:28 Titel: |
|
|
Minimales Beispiel mit font.bi - du brauchst
- font.bi (natürlich)
- libfreetype.a
- freetype.dll (im Programmordner)
- eine ttf-Fontdatei mit Namen font.ttf (im Programmordner)
(und ich hoffe mal, dass ich nichts wichtiges vergessen habe )
Code: | #include once "fbgfx.bi"
#include once "utf_conv.bi"
#include once "include/font.bi"
screenres 800, 600, 32
dim shared font as FT_Face
' Font initialisieren
FT_Var.ErrorMsg = FT_Init_FreeType(@FT_Var.Library)
if FT_Var.ErrorMsg then print "Could not load library"
font = getFont("font.ttf")
' Textausgabe
printFT 10, 10, "oben links, klein in gelb", font, 10, rgb(255, 255, 0)
centerFT 400, 300, "zentriert und in rot" , font, 50, rgb(255, 0, 0)
sleep
end |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
HD
Anmeldungsdatum: 14.11.2015 Beiträge: 35 Wohnort: Polen
|
Verfasst am: 25.10.2016, 08:17 Titel: Danke fuer die konkreten Hilfen! |
|
|
Danke fuer die konkreten Hilfen!
Brauche nun etwas Zeit, um sie zu verarbeiten. |
|
Nach oben |
|
|
HD
Anmeldungsdatum: 14.11.2015 Beiträge: 35 Wohnort: Polen
|
Verfasst am: 25.10.2016, 17:10 Titel: Das mit den schriftgroessen klappt hervorragend. |
|
|
Das mit den schriftgroessen klappt hervorragend, nur mit der schriftfarbe habe ich noch probleme. der jeweilige printFt-befehl sieht so aus:
printFT 300,150,"xy",font,30,&hFFFFFF.
sicher ist es moeglich, die schriftfarbe im voraus festzulegen um sie dann nicht bei jedem neuen printFt-befehl wiederholen zu muessen. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 25.10.2016, 19:26 Titel: |
|
|
In der font.bi ist in den Funktionen eine Schriftfarbe voreingestellt; da ich die Bibliothek auf einem weißen Hintergrund verwende, ist die voreingestellte Schriftfarbe schwarz (0). Du kannst das selbstverständlich durch eine beliebige andere Farbe ersetzen. Dasselbe gilt für die voreingestellte Schriftgröße.
Wenn du willst, dass sich die jeweilige Funktion die letzte verwendete Schriftfarbe merkt, könntest du z. B. mit STATIC arbeiten. Das wäre ein bisschen Bastelarbeit. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
HD
Anmeldungsdatum: 14.11.2015 Beiträge: 35 Wohnort: Polen
|
Verfasst am: 26.10.2016, 16:27 Titel: na prima! |
|
|
jetzt muss ich wohl noch den input-befehl fuer die grossbuchstaben umschreiben. Ich versuche es gerade. |
|
Nach oben |
|
|
HD
Anmeldungsdatum: 14.11.2015 Beiträge: 35 Wohnort: Polen
|
Verfasst am: 29.10.2016, 09:48 Titel: Hier ist mein erster Entwurf: Was haltet ihr davon? |
|
|
Code: | 'Beispiel-Text zum Verwuerfeln:
'Er muss als Textfile vorliegen, wenn kein anderer Text vorhanden ist.
'Es war abends und dunkel.
'Ich musste in die Kueche.
'Da sah ich vor mir einen Geist.
'Der Geist flog durch die Luft.
#lang "fblite"
#include "dir.bi"
Dim shared As Any Ptr s
DIM shared AS INTEGER an,Breite,hoehe,wo,z1,z2
dim shared as string aas,aKo,eingabe,er,fi,n,w,za
dim shared as string auf(400),fbD(3),ink(30)
DECLARE Sub list_files (ByRef filespec As String, ByVal attrib As Integer)
DECLARE Function zoom(text As String) As Any Ptr
fbD(1)="richtig"
fbD(2)="gut"
fbD(3)="ja"
screeninfo Breite,hoehe
SCREENRES breite,hoehe,32
color,RGB(139,90,43)'hintergrund Schokolade "tan4"
CLS
s=zoom("Programm S A T Z B A U . 0 2")
put (20,50),s,TRANS
s=zoom("Copyright (C): HD")
put (20,100),s,TRANS
s=zoom("Vorsicht! Die Anzahl der Woerter wird an Hand")
put (20,150),s,TRANS
s=zoom("der Luecken zwischen den Woertern festgestellt.")
put (20,190),s,TRANS
s=zoom("Deshalb zaehlen Leerstellen wie Woerter.")
put (20,230),s,TRANS
s=zoom("Trennungszeichen am Zeilenende werden nicht")
put (20,270),s,TRANS
s=zoom("beruecksichtigt. Bitte entfernen Sie sie")
put (20,310),s,TRANS
s=zoom("ebenso wie unsichtbare Leerstellen")
put (20,350),s,TRANS
s=zoom("am Zeilenende vor Erstellung des verwuerfelten")
put (20,390),s,TRANS
s=zoom("Textes!")
put (20,430),s,TRANS
s=zoom("Weiter -> Taste enter")
put (20,490),s,TRANS
s=zoom("Ende -> Taste E + Taste enter")
put (20,530),s,TRANS
line INPUT aas
if aas="e" or INKEY="E" then end
startSB:
Width breite\8,hoehe\8
cls:CLOSE 1:CLOSE 2
wo=0
s=zoom("Text verwuerfeln - -> Taste V")
put (50,100),s,TRANS
s=zoom("Verwuerfelten Text ordnen -> Taste O")
put (50,140),s,TRANS
s=zoom("Ende -> Taste E ")
put (383,180),s,TRANS
w= INPUT(1):w= UCASE(w)
IF w="E" THEN END ELSE cls
IF w<>"V" THEN GOTO ordnen
?:?:list_files "*.txt", fbArchive
?:?" Welcher Text soll verwuerfelt werden ";:INPUT aas
IF aas="E" OR aas="e" THEN END
OPEN aas FOR INPUT AS #1:BEEP
?:?" Unter welchem Namen soll der Einsetztext gespeichert werden,"
?:?" - max. 8 Buchstaben?"
?:?" Die Endung ";CHR (34);".SB";CHR (34);
?" wird automatisch hinzugefuegt."
?:?:INPUT " ";fi:fi=LEFT (fi,8)+".SB"
?:?" Bitte warten!"
OPEN fi FOR OUTPUT AS #2
eintrag:FOR an=1 TO z2+1:ink(an)="":NEXT an:z2=0
IF EOF(1) THEN GOTO AD
LINE INPUT #1, eingabe
Li=LEN(eingabe)
x=1
leerz:IF MID (eingabe,x,1)<>" " THEN GOTO z100
wo=wo+1:auf(wo)=LEFT (eingabe,x-1)
z2=z2+1:ink(z2)=LEFT (eingabe,x-1)
LW=LEN(auf(wo))
IF Li <=LW THEN GOTO z100
eingabe=RIGHT (eingabe,(Li-LW-1)):Li=Li-LW-1
x=1:GOTO leerz
z100:x=x+1
IF Li=0 THEN GOTO AD
IF x < Li THEN GOTO leerz
wo=wo+1:auf(wo)= eingabe
z2=z2+1:
ink(z2)= eingabe
IF auf(wo)="" THEN wo=wo-1
FOR an=1 TO z2 STEP 2
IF ink(an+1) <> "" THEN SWAP ink(an),ink(an+1)
NEXT an
n="":FOR an=z2 TO 1 STEP -1
n=n+ink(an)+" ":
NEXT an:? #2,n
n=""
GOTO eintrag
AD:?:?" Der Text enthaelt";wo;" Woerter.":getkey:GOTO startSB
ordnen:
Width breite\8,hoehe\16
?:?:list_files "*.txt",fbArchive
?:?:list_files "*.sb", fbArchive
?:input" Name des unverwuerfelten Textes ";aas
IF UCASE(aas)="E" THEN GOTO startSB
?:INPUT" Name des verwuerfelten Textes mit der Endung .SB ";fi
OPEN aas FOR INPUT AS #1
OPEN fi FOR INPUT AS #2
CLS:?
eintrag0:IF EOF(2) THEN GOTO z1200
LINE INPUT #2,za:?:?" Bitte ordne:"
?:?" ";za
?:?" ";:LINE INPUT #1,aKo
z1=z1+1:LINE INPUT er:IF UCASE(er)="E" THEN END
IF er=aKo THEN rn=INT(RND(1)*3)+1 ELSE GOTO z1040
?:?" ";fbD(rn)
GOTO eintrag0
z1040:
F=F+1:?:?" Bitte vergleiche mit meiner Loesung:"
?:?" ";aKo
?:? " Weiter mit jeder Taste!":w=INPUT(1)
CLS:GOTO eintrag0
z1200:CLS
?:? " Du warst fleiáig. Weiter so! ";z1-F;" von ";z1;" Zeilen richtig."
?:? " Wenn du keine Saetze bearbeitet hast, hast du die Namen der Texte"
?:? " nicht richtig eingegeben.":getkey
GOTO startSB
Sub list_files (ByRef filespec As String, ByVal attrib As Integer)
Dim As String filename = Dir(filespec, attrib)
z1=0
Do While Len(filename) > 0
Print:? tab(30);filename
filename = Dir()
z1=z1+1:if z1=16 then getkey:cls:z1=0
Loop
End Sub
Function zoom(text As String) As Any Ptr
Dim As Any Ptr img, imgz
Dim As Integer w, h
Dim As ULong pnt
img = ImageCreate(Len(text) * 8, 8, RGB(255, 0, 255), 32)
ImageInfo img, w, h
imgz = ImageCreate(w * 2, h * 2, RGB(255, 0, 255), 32)
Draw String img, (0,0), text, RGB(255, 255, 255)
For x As Integer = 0 To w - 1
For y As Integer = 0 To h - 1
pnt = Point(x, y, img)
PSet imgz, (x * 2, y * 2), pnt
PSet imgz, (x * 2 + 1, y * 2), pnt
PSet imgz, (x * 2, y * 2 + 1), pnt
PSet imgz, (x * 2 + 1, y * 2 + 1), pnt
Next
Next
ImageDestroy img
Return imgz
End Function |
|
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2509 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 29.10.2016, 18:32 Titel: |
|
|
Habe mir vorhin auch
http://www.freebasic.net/wiki/wikka.php?wakka=KeyPgDrawString
angeschaut; ist natürlich ein Stück weit recht rudimentär. Weiss nur von der Java-Programmierung her mit AWT/Swing, dass es dort ein ganzes Arsenal an Methoden gibt, um unter anderem auch Dinge wie Geometriewerte (z.B. wie viele Pixel breit wird ein bestimmter Text? Höhe der Ober- und Unterlänge?) zu bestimmten (Klasse FontMetrics). Und natürlich die auf einem System verfügbaren Schriftarten bestimmen gehört ebenfalls dazu (bei den genannten Java-Klassen aus meiner Sicht sogar recht gut dort gelöst). Meines Wissen benützt die JVM hier die Standard-Fontrendering-Routinge des jeweiligen Betriebssystems, so dass typografische Feinheiten wie bei "AVA" die Buchstaben etwas näher zusammenrücken (sog. Kerning) bei der Geometrieberechnung alles auch berücksichtigt wird.
=> Alles solche Sachen müsste ein "font.bi" sinnvollerweise auch zur Verfügung stellen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 29.10.2016, 20:29 Titel: |
|
|
Falls das in Bezug auf meine "font.bi" gemeint war - die ist natürlich auch nur ein Versuch, auf möglichst einfachem Weg für Lengua eine Nutzung von FreeType hinzubekommen (hätte ich keine Spezialzeichen benötigt, hätte ich es gar nicht versucht ).
Eine allgemeine Font-Bibliothek zur Nutzung beliebiger Schriftarten des Betriebssystems wäre natürlich eine tolle Sache. FreeType hat allerdings auch noch das Problem, dass es für Windows schwer zu bekommen ist (bzw. selbst compiliert werden muss) - vielleicht gibt es da wegen der WinAPI wenig Interesse. Wie auch immer, so eine Font-Bibliothek wäre auf jeden Fall super. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|