FoxPro

FoxPro Developer's Conference '94

Session 233
Fonts, Charts und Bitmaps unter FoxPro für Windows

Sebastian Flucke
ASCI-Consulting, Berlin


 

Inhalt:

Fonts mit FoxPro für Windows


 

Kurzbeschreibung:

Ausgangspunkt der Betrachtungen sind die drei Arten von Fonts unter Windows: Bitmap-, TrueType- und Druckerfonts, die bei aller Verschiedenheit auch einige Gemeinsamkeiten haben.

In die weitere Betrachtung werden allerdings nur die Bitmap- und TrueType-Fonts einbezogen. So gibt es z.B. einige interessante Aspekte zum Zeitverhalten von Fonts. Außerdem wird auf die relevanten Textmetric-Eigenschaften der Fonts eingegangen, die für bestimmte Umrechnungen eine wichtige Rolle spielen.

Eine große Bedeutung für die FoxPro-Programmierung, insbesondere für die Gestaltung von Masken, hat das Verhalten bestimmter Fonteigenschaften in Zusammenhang mit verschiedenen Bildschirmauflösungen bzw. mit verschiedenen Videotreibern. In diesem Zusammenhang wird außerdem auf die Auswirkungen verschiedener Farbtiefen eingegangen.

Im weiteren werden die direkt bzw. indirekt fontbezogenen Befehle von FoxPro behandelt.

Abgeschlossen wird die Fontproblematik mit der Vorstellung einiger Hilfsmittel zum Umgang mit Fonts unter FoxPro für Windows.


Die grafische Darstellung von Kennzahlen gewinnt als qualitativer Gesamtüberblick über betriebswirtschaftliche und andere Zusammenhänge immer mehr an Bedeutung.

Vorgestellt werden Zusatz-Tools zu FoxPro für Windows, die das Erstellen verschiedener Arten von Diagrammen gestatten. Die Tools wurden untersucht auf das äußere Erscheinungsbild der Charts, auf die Steuerbarkeit der Darstellung aus FoxPro-Programmen heraus, auf die erreichbare Handhabbarkeit für den Betrachter und auf die Brauchbarkeit der sonstigen, nicht direkt auf Charts orientierten Funktionen (z.B. Import verschiedener Grafik-Dateiformate).


Neben dem Anzeigen von Bitmaps als Gestaltungselementen von Masken gibt es Einsatzfälle, wo Bitmaps (oder allgemeiner: Bilder) sozusagen einen eigenen Datentyp bilden, der in Datenbanken gespeichert und verarbeitet werden soll.

Gegenstand der Betrachtung werden Möglichkeiten des Speicherns und Anzeigens von Bitmaps sein. Weiterhin wird demonstriert, wie aus einem einzelnen Foxpro-Fenster ein Screenshot bzw. ein Bitmap erzeugt werden kann. Außerdem wird auf einige Eigenheiten bei dem Umgang mit Bitmaps unter FoxPro für Windows eingegangen.


 

Fonts mit FoxPro für Windows

Unter Windows sind drei Typen von Fonts zu unterscheiden:

Druckerfonts sind hardwareabhängige Schriften, die in die Firmware von Druckern eingebaut sind und in der Bildschirmdarstellung durch einen möglichst ähnlichen Bildschirmfont angenähert werden. Diese Font-Art soll im weiteren nicht näher betrachtet werden.

Raster- und TrueType-Fonts sind beides Bildschirmfonts, haben also als Gemeinsamkeit die Darstellung der Zeichen als Muster aus einzelnen Bildschirmpixeln.

Der Unterschied zwischen beiden liegt in der Entstehung des Pixel-Musters:

- Bitmap-Fonts enthalten fest vorgegebe Pixelmuster für alle Schriftgrößen, für die der jeweilige Font definiert wurde. Zwischengrößen werden durch Ersetzen mit dem Pixelmuster einer größenmäßig in der Nähe liegenden Schriftgröße oder durch formales Vergößern des Pixelmusters (mit "Treppenstufen"-Bildung) erstellt.

- TrueType-Fonts beruhen auf einer mathematischen Beschreibung der Umrisse der Buchstaben, Ziffern und Sonderzeichen. Aus dieser Beschreibung wird dann ein zur geforderten Schriftgröße passendes Pixelmuster gebildet (also keine formale Vergrößerung des Pixelmusters, dadurch gibt es bei TrueType-Fonts keine "Treppenstufen"!).

Bildschirmfonts zeigen ein durchaus differierendes Zeitverhalten. Im folgenden sind die Zeiten zum 10 000-maligen Schreiben der Zeichenkette "abcdefgh" mit dem SAY-Befehl auf den FoxProW-Desktop sowohl mit als auch ohne explizite Fontklausel ausgewiesen:

Schriftart, -größe, 640 1024

-stil (Typ) x 480 x 768

MS SANS SERIF, mit FONT-Klausel 30 s 27 s

8, N (Bitmap) ohne FONT-Klausel 14 s 20 s

SCRIPT, 8, N mit FONT-Klausel 174 s 257 s

(Bitmap) ohne FONT-Klausel 150 s 227 s

ARIAL, 8, N mit FONT-Klausel 23 s 32 s

(TrueType) ohne FONT-Klausel 18 s 24 s

WINGDINGS, 8, N mit FONT-Klausel 25 s 27 s

(TrueType) ohne FONT-Klausel 19 s 27 s

Laut Theorie müßten Raster-Fonts schneller sein, weil für sie die fertigen Pixelmuster schon existieren. Die Praxis zeigt, daß es sowohl Unterschiede von Font zu Font als auch von Auflösung zu Auflösung gibt und selbst das Vorhandensein einer FONT-Klausel das Zeitverhalten in gewissem Rahmen beeinflußt.

Eine spezielle Problematik beim Umgang mit Fonts ist die Frage verschiedener Bildschirmauflösungen, also der Bildschirmbreite und -höhe in Pixeln. Die aktuellen Werte für die Bildschirmauflöung in Pixeln kann man mit den FoxProW-Funktionen SYSMETRIC(1) und SYSMETRIC(2) ermitteln.

Bei gleicher Bildschirmauflösung können sich Video-Treiber noch unterscheiden

Die Farbtiefe ist äußerst wichtig bzgl. des Speicherplatzes, den nutzerdefinierte Fenster unter FPW benötigen. Neben einigen Bytes für organisatorische Zwecke, die jedes Fenster innerhalb des FoxPro-Speichers belegt, benötigen nutzerdefinierte Fenster unter Windows auch Speicher außerhalb des mit SYS(1001) abfragbaren FoxPro-Speichers! Dieser Speicher wird benötigt zum Speichern der Fensterinhalte und errechnet sich wie folgt:

Speicher = PixelAnzahlHöhe * PixelAnzahlBreite * Farbtiefe.

Beispiel:

Das Beispiel zeigt, daß man eine FoxProW-Applikation nicht unbedingt im TrueColor-Modus mit 16,7 Mill. Farben abarbeiten sollte. Die Funktion WIN_RAM() in der Programmdatei MISCFUNC.PRG auf der Begleitdiskette zeigt die Berechnung des Bedarfs an RAM außerhalb des FPW-internen Speichers unter Nutzung von Windows-API-Funktionen via FOXTOOLS.FLL.

Den Unterschied zwischen dem Modus "small fonts" und "large fonts" zeigt die folgende Abbildung:

Menüs, Fenstertitel und einige weitere Windows-Elemente werden in der "large"-Version gegenüber der "small"-Version vergrößert angezeigt. Die Unterscheidung in "large" und "small" hat auch Einfluß auf die Darstellung bestimmter Fonts (siehe unten).

Ein konkreter Font unter Windows ist bestimmt durch die drei Angaben "Schriftart", "Schriftgröße" und "Schriftstil", z.B.:

Die Schriftgröße bestimmt die prizipielle Größe der Buchstaben, wobei Fonts mit gleicher Schriftgröße nicht notwendigerweise eine gleiche Buchstabengröße auf dem Bildschirm aufweisen müssen.

Folgende Schriftstile stehen unter Windows zur Verfügung:

B Fett
I Kursiv
N Normal
O Konturiert
Q Undurchsichtig
S Mit Schatten
- Durchgestrichen
T Transparent
U Unterstrichen,

wobei nicht jede Schriftart jeden Stil unterstützt. Je nach Schriftart können Schriftstile auch kombiniert werden (z.B fett und kursiv: "BI").

An Schriftarten stehen immer die unter dem jeweiligen Windows installierten Schriften zur Verfügung. Dabei entscheidet allerdings jedes Programm unter Windows selbst, welche der installierten Schriften für bestimmte Aktivitäten zur Auswahl angeboten werden. So bietet FoxProW z.B. im Screen-Designer sinnvollerweise keine Druckerschriften an, während sie im Berichts-Designer zur Verfügung stehen.

Ist eine angeforderte Schriftart in der konkreten Windows-Installation nicht vorhanden, dann sucht Windows als erstes in der Sektion [FontSubstitutes] in der Datei WIN.INI, ob für den angeforderten Font eine Substitution definiert ist (die Funktionen GET_PS() und PUT_PS() in der Programmdatei MISC_FU1.PRG auf der Begleitdiskette zeigen das Lesen und Schreiben von Einträgen in INI-Dateien aus einem FoxProW-Programm heraus).

Wird in der [FontSubstitutes]-Sektion kein Eintrag für den gesuchten Font gefunden, greift sich Windows nach einem nicht zu durchschauenden Algorithmus "irgendeine" Schriftart.

Es ist also ratsam, sich auf übliche Schriften zu beschränken. Außerdem sollte man das Vorhandensein der in der FoxProW-Applikation benötigten Schriften in die geforderten Umgebungsbedingungen für die Lauffähigkeit der Applikation mit aufnehmen (neben RAM-Bedarf, empfohlenem Prozessor usw.).

Die folgende Abbildung zeigt die wichtigsten Font-Eigenschaften bezogen auf einzelne Zeichen:

Die Höhe H eines Zeichens (gemessen in Pixeln) ist für alle Zeichen eines konkreten Fonts in einer Schriftgröße und einem Schriftstil gleich, unabhängig davon, wieviel dieser Höhe durch das einzelne Zeichen beansprucht wird.

Die Breite B eines Zeichens (gemessen in Pixeln) kann sich entweder "proportional" oder "nichtproportional" verhalten.

Bei proportionalen Schriften nehmen alle Zeichen eines konkreten Fonts in einer Schriftgröße und einem Schriftstil eine ihrer wirklichen Breite entsprechende (proportionale) Pixelanzahl ein (dies ist unter Windows der Normalfall, s.a. nachfolgende Abbildung).

Ebenso existieren aber auch "nichtproportionale" Schriften. Bei diesen Schriften sind alle Zeichen unabhängig von ihrem wirklichen Platzbedarf gleich breit (was die Arbeit mit solchen Schriften innerhalb der Programmierung wesentlich erleichert, aber sie sehen nicht so gut aus wie die proportionalen Schriften).

Eine Ausnahme von dieser Einteilung in "proportional" und "nichtproportional" sind die Ziffern "0" bis "9", die sich auch in proportionalen Schriften "nichtproportional" verhalten, also alle die gleiche Breite beanspruchen. Ohne diese Sonder-Eigenschaft würde es nicht gelingen, Zahlen dezimalstellengetreu untereinander anzuordnen.

Bei TrueType-Fonts wird die Breite eines einzelnen Zeichens noch in die drei Bereiche A (führender Leer-Raum), B (eigentliche Glyphe) und C (nachfolgender Leerraum) eingeteilt:

Die bisher betrachteten Eigenschaften betrafen die einzelnen Zeichen eines Fonts. Wichtig für den Umgang mit Fonts ist aber auch die Kenntnis über Eigenschaften eines Fonts als Menge aller enthaltenen Zeichen.

Für die Höhe der Zeichen eines Fonts gilt das oben gesagte: Alle Zeichen haben die gleiche Höhe!

Die Zeichenbreite eines Fonts wird durch zwei Angaben beschrieben:

- durchschnittliche Zeichenbreite in Pixeln (lt. Windows-SDK: "Specifies the average width of characters in the font. For ANSI_CHARSET fonts, this is a weighted average of the characters "a" through "z" and the space character. For other character sets, this value is an unweighted average of all characters in the font.")

- die maximale Zeichenbreite in Pixeln (lt. Windows-SDK: "Specifies the 'B' spacing of the widest character in the font.").

Die durchschnittliche Zeichenbreite ist ein Begriff, der weiter unten noch eine wichtige Rolle spielen wird.

Die SDK-Definition der maximalen Zeichenbreite steht etwas im Widerspruch zu Informationen, die bestimmte FoxProW-Funktionen liefern. So hat das breiteste Zeichen des Fonts "ARIAL",8,"N" eine Breite von 11 Pixeln, während die Aussage zur maximalen Zeichenbreite 12 Pixel lautet (!?!?!).

Jetzt soll das Verhältnis von Fonthöhe zu Fonthöhe sowie von durchschnittlicher Fontbreite zu durchschnittlicher Fontbreite unter verschiedenen Bedingungen verglichen werden.

Nimmt man die Schriftart, die Schriftgröße und die verwendete Bildschirmauflösung als die drei bestimmenden Parameter, von denen jeweils nur einer variiert wird, kommt man zu erstaunlichen Aussagen:

- variiert man nur die Schriftgröße, verändert sich die Fonthöhe in einem anderen Verhältnis als die durchschnittliche Fontbreite

- variiert man nur die Schriftart, verändert sich die Fonthöhe in einem anderen Verhältnis als die durchschnittliche Fontbreite

- variiert man nur die Bildschirmauflösung, verändert sich die Fonthöhe u.U. in einem anderen Verhältnis als die durchschnittliche Fontbreite.

Die folgende Maske wurde unter 640x480 erstellt:

Aktiviert man die Maske nun bei einer Auflösung von 800x600, führt das zu diesem Ergebnis:

Die in der Abbildung markierten, eigentlich harmlosen Verschiebungen können sich natürlich sehr schnell zu einem handfesten Chaos auswirken (z.B. beim Verwenden des 3D-Treibers des GENSCRNX).

Außerdem können durch Positionsverschiebungen echte Programmfehler auftreten (Fehlers 30, "Position liegt außerhalb des Bildschirms").

An dieser Stelle soll nicht näher auf die detaillierten Konstellationen eingegangen werden, unter denen die oben beschriebenen Font-Verhaltensweisen zu unerwünschten Auswirkungen und Fehlern führen können.

Es lassen sich aber einige Grundregeln bei der Arbeit mit Fonts formulieren, die das Risiko von Programmfehlern und Masken-Verunstaltungen durch Font-Probleme minimieren:

- Bei allen Befehlen, die die explizite Angabe eines Fonts ermöglichen, den zu verwendenden Font in jedem Fall angeben (mit der Angabe von Schriftgröße und Schriftstil).

- Fenster immer mit der Option AT-SIZE definieren (bei FROM-TO-Definitionen wirkt sich sonst der Font des übergeordneten Fensters auf das neu zu definierende aus!).

- Wenn man sich auf die ausschließliche Anwendung von TrueType-Fonts beschränkt, können die entsprechenden Masken risikolos auch unter höheren Auflösungen verwendet werden (sie füllen dann allerdings den Bildschirm entsprechend weniger aus).

- Alles, was Masken betrifft, sollte wenn irgend möglich über den Masken-Generator abgewickelt werden, um sich immer die Möglichkeit des Einsatzes von GENSCRNX-Treibern zu erhalten.

Im folgendenden werden die Befehle aufgezählt, die FoxProW für die direkte Arbeit mit Fonts enthält:

Desweiteren gibt es eine ganze Reihe von Befehlen und Funktionen, die indirekt mit Fonts zu tun haben:

Die wichtigsten Stichpunkte zu den direkt und indirekt fontbezogenen Befehlen sowie einige Tools zum leichteren Umgang mit Fonts unter FPW befinden sich auf der Begleitdiskette.


Fonts, Charts, und Bitmaps unter FoxPro/Windows
(c)1994 Sebastian Flucke