Code-Beispiel
Zahlen in kleiner Schriftgröße ausgeben
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
FBPSL | Sebastian | 24.02.2012 |
Screenshot
Wer in einem Grafikmodus hochgestellte Zahlen z. B. zur Darstellung von Exponenten bei Potenzen benötigt, kann wegen der Codepage CP437 des Grafik-SCREENs nur auf das Zeichen CHR(253) zurückgreifen. Dabei handelt es sich um eine hochgestellte 2. Wer andere Exponenten benötigt, muss dies entweder als ^3, ^5, ... schreiben oder die kleingeschriebenen Ziffern selbst zeichnen.
Letztere Alternative wird mit dem folgenden Quelltext umgesetzt (Abb. rechts: Screenshot des Beispielprogramms). Die kleingeschriebenen Zahlen werden mit Grafikroutinen auf den Bildschirm gezeichnet, sodass die Beschränkungen der Codepage umgangen werden. Prinzipiell könnte man so auch griechische Buchstaben, mathematische Symbole o. ä. in ein eigenes Programm einbauen.
Hintergrundwissen zum Programm
Am einfachsten wäre es, die kleinen Ziffern als Bitmap zu speichern und dann die BMP-Datei(en) mit BLOAD anzuzeigen. Dies würde jedoch bedeuten, dass man dem Programme eine externe Datei beilegen müsste. Das bloße Weitergeben des Quelltexts würde dann nicht mehr genügen, damit der Nutzer das Programm ausführen kann, weil die Bilddatei mit den kleinen Zahlen fehlen würde. Deshalb wurden die kleingeschriebenen Ziffern für dieses Programm zunächst in Bitmasken umgewandelt, bei denen jedes Bit ein gezeichnetes oder nicht-gezeichnetes Pixel der Ziffer darstellt. Diese Bitmasken (Folgen von 0 und 1) wurden anschließend zu dezimalen Ganzzahlen vom Typ INTEGER umgerechnet (z. B. aus 10101100 würde &hAC, Hexadezimalzahlen sind hierbei praktischer), welche dann als Int-Literale in den Quelltext geschrieben wurden (Integer-Array raw).
Die Routine loadnumbers lädt diese kompakt notierten Bitmasken Bit für Bit und zeichnet sie in 10 Grafikpuffer - für jede Ziffer von 0 bis 9 einen (ANY-PTR-Array zahlImg). Diese Grafikpuffer werden dann je nach Bedarf von der Sub printnr pixelgenau an bestimmten Koordinaten auf den Grafikbildschirm gezeichnet, woraus sich die Zahldarstellung ergibt.
Quelltext: Zahlen in kleiner Schriftgröße
'Zahlen in kleiner Schriftgroesse ausgeben
'z.B. als hochgestellte Ziffern bei Exponenten
'- Funktioniert nur in Grafik-Modi.
'- Getestet mit FreeBASIC 0.22.0 Win32 (SVN 20.10.2010)
dim shared as any ptr zahlImg (0 to 9)
dim shared as integer raw (0 to 10) = { _ 'Bilddaten
&h7D060C17 , &hC860FF02 , &h040438B2 , &h58808326 , _
&h4F618512 , &h7F0803CC , &h99318F25 , &h93263418 , _
&hD238406D , &h264D94CC , &h64C994F0 }
declare sub loadnumbers ()
declare sub printnr (ByVal x as integer, ByVal y as integer, ByVal zahl as uinteger)
screenres 640,480,32
width 80,30
windowtitle "Zweierpotenzen"
line (0,0)-(639,479), &HFFFFFF, BF 'Bildschirm weiss fuellen
loadnumbers() 'Grafikpuffer vorbereiten
dim as integer i
for i = 0 to 14
draw string (10,20+i*28), "2 = " & (2^i), 0 'Normalen Text ausgeben
printnr 20, 18+i*28, i 'Hochgestellte Zahl i ausgeben
next i
draw string (10,450), "Beliebige Taste zum Beenden druecken.", &h888888
sleep
end 0
sub loadnumbers ()
dim as integer zahl, i, bitnr, x, y
for i = 0 to 9
zahlImg(i) = ImageCreate(5,7,&HFF00FF)
next i
for i = 0 to 10
for bitnr = 31 to 0 step -1
if ((raw(i) shr bitnr) and 1) then
pset zahlImg(zahl),(x,y),0
end if
y+=1
if y=7 then
x+=1
y=0
end if
if x=5 then
x=0: y=0
zahl+=1
end if
next bitnr
next i
end sub
sub printnr (ByVal x as integer, ByVal y as integer, ByVal zahl as uinteger)
dim as integer i
dim as string zahlstr
zahlstr = ltrim(str(zahl))
for i = 0 to len(zahlstr)-1
put (x+i*6,y), zahlImg(valint(mid(zahlstr,i+1,1))), trans
next i
end sub
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|