Code-Beispiel
Zahlen in kleiner Schriftgröße ausgeben

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 |
- Das Code-Beispiel wurde am 20.10.2010 von
Sebastian angelegt.
- Die aktuellste Version wurde am 24.02.2012 von
Sannaj gespeichert.
|
|