Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Grafik und Fonts

Zahlen in kleiner Schriftgröße ausgeben

Lizenz:Erster Autor:Letzte Bearbeitung:
FBPSLAdministratorSebastian 24.02.2012
Screenshot
Vergrößern
Screenshot

Wer in einem BefehlsreferenzeintragGrafikmodus hochgestellte Zahlen z. B. zur Darstellung von Exponenten bei Externer Link!Potenzen benötigt, kann wegen der Externer Link!Codepage CP437 des BefehlsreferenzeintragGrafik-SCREENs nur auf das Zeichen BefehlsreferenzeintragCHR(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 BefehlsreferenzeintragINTEGER 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 (BefehlsreferenzeintragANY-PTR-Array zahlImg). Diese Grafikpuffer werden dann je nach Bedarf von der BefehlsreferenzeintragSub 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 AdministratorSebastian angelegt.
  • Die aktuellste Version wurde am 24.02.2012 von MitgliedSannaj gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen