Version 1.0
Ein DVI-Previewer
für Windows NT 4.0
von Thorsten Hübschen
23. Juni 1997
Umfangreichere Programmieraufgabe
am Fachbereich 7 û Mathematik
der Bergischen Universität - Gesamthochschule Wuppertal
1 Einführung
*2 Installation
*3 Quick-Tour
*3.1 Programmstart
*3.2 Öffnen einer DVI-Datei
*3.3 Navigation im DVI-Dokument
*3.4 Einstellen der Ansichtsoptionen
*3.5 Cursor-Einstellungen
*3.6 Ausdrucken des DVI-Dokuments
*4 Implementierung
*5 Klassenstruktur
*6 Klassenreferenz
*Einführung
ActiveDVI ist ein DVI-Previewer unter Windows NT 4.0. Das DVI-Format ist das gängige Dokumentenformat für mathematisch/wissenschaftliche Veröffentlichungen. Mit ActiveDVI können Sie DVI-Dokumente schnell und komfortabel ansehen und mit jedem von Windows NT 4.0 unterstützten Drucker ausdrucken.
Die Installation erfolgt menügeführt durch das Standard-Installationsprogramm von Windows NT 4.0. Zur Installation legen Sie einfach die erste Installations-Diskette von ActiveDVI in Ihr Diskettenlaufwerk ein, wählen im Windows NT-Startmenü den Menüpunkt "
Ausführen" und geben dann "a:setup.exe" ein.
Im folgenden werden die wichtigsten Funktionen von ActiveDVI vorgestellt:
Programmstart
Nach dem Programmstart präsentiert sich ActiveDVI als typische Win32 MDI-Applikation mit einer Menüleiste und vier andockbaren Toolbars
Abbildung 1
Zu jedem der Toolbar-Buttons steht ein kleiner Hilfetext zur Verfügung, der angezeigt wird, wenn sich der Mauszeiger für mindestens eine Sekunde über dem Button befindet.
Durch Auswahl des Menüpunkts "
Datei/Öffnen..." erscheint der Windows-Standard-Dialog zur Auswahl einer Datei.
Abbildung 2
Wählen Sie die gewünschte Datei aus und klicken auf den "
Öffnen"-Button
Nach dem Öffnen der DVI-Datei erscheint das DVI-Dokument in einem neuen Fenster:
Abbildung 3
In dem linken, schmaleren Teil des Fensters wird eine Vorschau über alle Seiten des DVI-Dokuments angezeigt, während im rechten, breiteren Teil des Fenster die jeweils ausgewählte Seite des DVI-Dokuments angezeigt wird. Um eine bestimmte Seite auszuwählen, können Sie entweder die betreffende Seite im Vorschaufenster anklicken, oder Sie können durch die Menübefehle im Menü
"Navigation" durch das Dokument blättern.
Mit den Befehlen "Ansicht/Auflösung", "Ansicht/Zoom" und "Ansicht/Layout" können Sie verschiedene Darstellungen des DVI-Dokuments auswählen.
Abbildung 4
Es stehen zum Betrachten des angezeigten DVI-Dokuments zwei nützliche Sonderfunktionen zu Verfügung, die im Menü
Navigation/Cursor-Modes ausgewählt werden können. Im Zoom-Modus verhält sich der Mauszeiger beim Klick auf die linke Maustaste wie ein Vergrößerungsglas und zeigt einen vergrößerten Ausschnitt des sich unter dem Cursor befindenden Dokuments an. Im Drag-Modus kann man bei gedrückter linker Maustaste das angezeigte Dokument in alle vier Richtungen frei verschieben.Abbildung 5
Nach Auswahl des Menüpunkts "
Datei/Drucken" wird der Windows-Standard-Druckdialog angezeigt. Hier können die gewünschten Optionen einstellt und der Druckauftrag mit dem "OK"-Button gestartet werden.
Abbildung 6
Die Implementierung von ActiveDVI erfolgte mit Microsoft Visual C++ 5.0 und den Microsoft Foundation Classes (MFC) 5.0.
Ein großer Teil des Implementierungsaufwandes wird von der konsequenten Multithreading-Unterstützung in ActiveDVI beansprucht.
Das eigentliche Lesen und Rendern der DVI-Dateien ist relativ leicht zu implementieren, da eine DVI-Datei im Prinzip aus eine Liste von sehr einfachen Zeichen-Kommando besteht: Zum einen sind dieses Kommandos zur Positionierung eines gedachten Cursors innerhalt einer Dokumentenseite und zum anderen Kommandos zu Zeichen eines bestimmten Zeichens eine angegebenen Schriftart. Hinzu kommen noch elementare Vektorgraphikbefehle. Zu Darstellen des DVI-Dokuments müssen schließlich noch die benötigten PK-Fonts geladen und gerendert werden. Die in einer PK-Font-Datei gespeicherten Zeichen sind im Prinzip als Lauflängen-komprimierte Bitmaps abgespeichert, die wieder relativ schnell und einfach geladen und entpackt werden können.
Die Struktur der ActiveDVI-Anwendung wird in den nächsten Abschnitt durch Klassendiagramme und durch eine Klassenreferenz veranschaulicht.
Für Implementierungsdetails folgen danach die kompletten Source-Codes von ActiveDVI.
Abbildung 7
Abbildung 8
Abbildung 9
Abbildung 10
CActiveDVIApp |
|
Funktionalität:
Instanzen:
|
Applikationsklasse von ActiveDVI. Stellt die grundlegende Funktionalität einer Win32-Applikation zur Verfügung. |
CBitmapManager |
|
Funktionalität:
Instanzen:
|
Diese Klasse übernimmt die Verwaltung der zum Rendern der DVI-Dokumente benötigten Bitmaps. Insbesondere werden hier zentral die Systemresourcen für die Bitmaps belegt und freigegeben. |
CContentsView |
|
Funktionalität:
Instanzen:
|
Die von CListView abgeleitet Klasse übernimmt die Anzeige der Vorschau-ansicht des DVI-Dokuments. |
CDVIDoc |
|
Funktionalität:
Instanzen:
|
Diese Klasse übernimmt das Laden und Parsen der DVI-Files. CDVIDoc erzeugt dabei eine Liste von CDVIPage-Objekten, welche die DVI-Kommandos für jeweils eine DVI-Seite kapseln. |
CDVIFont |
|
Funktionalität:
Instanzen:
|
Ein CDVIFont-Objekt kapselt genau eine DVI-Schriftart in einer bestimmten Auflösung. Jedes CDVIFont-Objekt verwaltet einen Pointer auf ein CPKFont-Objekt, welches einen PK-Font in genau einer Auflösung kapselt, und einen Skalierungsfaktor. Durch diese beiden Daten ist ein DVIFont-Objekt in der Lage, einen anforderten Buchstaben aus dem gekapselten PK-Font selbstständig in der jeweils benötigten Auflösung darzustellen. Jedes CDVIDoc-Objekt führt eine Liste mit CDVIFont-Objekten, die genau die in dem CDVIDoc-Objekt geladenen DVI-Dokument benötigten DVI-Schriftarten repräsentieren. Diese CDVIFont-Objekte sind aber noch nicht mit einem Pointer auf ein CPKFont-Objekt initialisiert. Jedes dem CDVIDoc-Objekt zugeordnete CDVIView-Objekt legt eine eigene Kopie der CDVIFont-Liste des CDVIDoc-Objekts an. Die CDVIFont-Objekte des CDVIView-Objekts werden dann mit Pointern auf CPKFont-Objekte in den benötigten Auflösungen initialisiert. |
CDVIPage |
|
Funktionalität:
Instanzen:
|
Ein CDVIPage-Objekt kapselt die DVI-Kommandos zum Erzeugen genau einer DVI-Seite. Jedes CDVIDoc-Objekt führt eine Liste von CDVIPage-Objekten, wobei für jede DVI-Seite des geladenen Dokuments genau ein CDVIPage-Objekt erzeugt wird. |
CDVIView |
|
Funktionalität:
Instanzen: |
Die CDVIView-Klasse übernimmt das Rendern der in den CDVIPage-Objekten des zugehörigen CDVIDoc-Objekts gekapselten DVI-Kommandos. Für jedes Dokumentfenster wird genau ein CDVIView-Objekt erzeugt. |
CFontManager |
|
Funktionalität:
Instanzen: |
Diese Klasse ist für die Verwaltung der benötigten CPKFont-Objekte zuständig. Hier wird für jeden zur Verfügung stehenden PK-Font ein diesen repräsentierendes CPKObjekt angelegt und bei Bedarf werden die eigentlichen Font-Bitmaps aus den entsprechenden PK-Font-Files geladen. Weiter übernimmt die CFontManager-Klasse die Zuordnung zwischen den für die CDVIFont-Objekte angeforderten PK-Fonts in bestimmten Auflösungen und den verfügbaren CPKFont-Objekten. Es wird im theApp-Objekt genau eine Instanz von CFontManager erzeugt. |
CGlyph |
|
Funktionalität:
Instanzen:
|
Ein CGlyph-Objekt speichert genau die Font-Information für einen Zeichen aus einem PK-Font. Jedes CPKFont-Objekt legt eine Liste mit CGlyph-Objekten an, die bei Bedarf initialisiert und geladen werden. |
CMainFrame |
|
Funktionalität:
Instanzen: |
CMainFrame repräsentiert die Fensterklasse für das Hauptfenster der CActiveDVIApp-Applikation. CMainFrame verwaltet sowohl die Menüleiste und die Toolbar, als auch die MDI-Kindfenster der Applikation. Es wird in theApp genau eine Instanz von CMainFrame angelegt. |
CPKFont |
|
Funktionalität:
Instanzen:
|
Ein CPKFont-Objekt kapselt die Daten einer PK-Font-Datei. Dazu führt jedes CPKFont-Objekt eine Liste mit CGlyph-Objekten und erzeugt die entsprechenden Font-Bitmaps nach Bedarf aus den PK-Kommandos aus der PK-Font-Datei. Für jede im Font-Verzeichnis gefundene PK-Font-Datei wird vom CFontManager-Objekt ein CPKFont-Objekt erzeugt. Die Font-Bitmaps werden dabei aber erst bei Bedarf vom CPKFont-Objekt aus der Datei gelesen. |
CPrintManager |
|
Funktionalität:
Instanzen: |
CPrintManager übernimmt die Drucksteuerung der CDVIView-Klasse und verwaltet die Druck-Threads. |
CPrintThread |
|
Funktionalität:
Instanzen:
|
Diese von CWinThread abgeleitet Klasse kapselt den von CPrintManager benötigten Druck-Thread. |
CRulerBar |
|
Funktionalität:
Instanzen:
|
Diese Fensterklasse repräsentiert die Lineale, die an den Seiten des CDVIView-Fensters zu sehen sind. Jedes CSheetFrame-Objekt erzeugt genau zwei CRulerBar-Objekte, je eins für das horizontale und das vertikale Lineal. |
CSheetChildFrame |
|
Funktionalität:
Instanzen:
|
Jedes MDI-Kindfenster wird durch ein CSheetChildFrame-Objekt repräsentiert. Das CSheetChildFrame erzeugt in seinem Client-Bereich das CSplitterWnd- das CContentsView- und das CDVIView-Objekt. Für jedes neue Dokumentenfenster wird vom CMainFrame ein neues CSheetChildFrame-Objekt erzeugt. |
CSheetFrame |
|
Funktionalität:
Instanzen:
|
CSheetFrame ist die direkte Frame-Klasse für CDVIView und verwaltet sowohl das entsprechende CDVIView-Objekt als auch die beiden CRulerBar-Objekte. |
CSheetView |
|
Funktionalität:
Instanzen: |
CSheetView ist die virtuelle Basisklasse von CDVIView und übernimmt die gesamte Darstellung der leeren Dokumentenseiten. Zum Rendern der eigentlichen DVI-Kommandos wird die entsprechende virtuelle Funktion von CDVIView aufgerufen. Für jedes Dokumentenfenster wird von CSheetChildFrame ein neues CDVIView-Objekt erzeugt. |
CThreadManager |
|
Funktionalität:
Instanzen: |
Diese Klasse übernimmt die Verwaltung der verschiedenen in der Applikation eingesetzten Worker-Threads. Es wird in theApp genau eine Instanz von CThreadManager erzeugt. |
CViewControlBar |
|
Funktionalität: Instanzen: |
Die CViewControlBar-Klasse repräsentiert die "Darstellungs"-Toolsbar. Das CMainFrame-Objekt erzeugt genau eine Instanz von CViewControlBar. |
CZoomWnd |
|
Funktionalität:
Instanzen: |
Diese Klasse stellt die "Vergrößerungsglas"-Funktionalität im Dokumentenfenster zur Verfügung. Jedes CSheetView-Objekt erzeugt bei Bedarf ein eigenes CZoomWnd-Objekt. |