ActiveDVI

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 *

 

  1. Einführung
  2.  

    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.

     

  3. Installation
  4.  

    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.

     

  5. Quick-Tour
  6.  

    Im folgenden werden die wichtigsten Funktionen von ActiveDVI vorgestellt:

     

     

    1. Programmstart

    2. 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.

       

       

    3. Öffnen einer DVI-Datei
    4. 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

       

       

    5. Navigation im DVI-Dokument
    6.  

      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.

       

       

    7. Einstellen der Ansichtsoptionen
    8.  

      Mit den Befehlen "Ansicht/Auflösung", "Ansicht/Zoom" und "Ansicht/Layout" können Sie verschiedene Darstellungen des DVI-Dokuments auswählen.

      Abbildung 4

       

       

    9. Cursor-Einstellungen
    10.  

      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

       

       

    11. Ausdrucken des DVI-Dokuments

     

    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

     

     

  7. Implementierung
  8.  

    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.

     

     

  9. Klassenstruktur
  10.  

     

    Abbildung 7

     

     

     

    Abbildung 8

     

    Abbildung 9

     

    Abbildung 10

  11. Klassenreferenz

 

CActiveDVIApp

Funktionalität:

 

Instanzen:

 

Applikationsklasse von ActiveDVI. Stellt die grundlegende Funktionalität einer Win32-Applikation zur Verfügung.
Es wird mit theApp genau eine globales Instanz der Klasse CActiveDVIApp erzeugt.

 

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.
Es wird genau eine Instanz von CBitmapManager in theApp erzeugt.

 

CContentsView

Funktionalität:

 

Instanzen:

 

Die von CListView abgeleitet Klasse übernimmt die Anzeige der Vorschau-ansicht des DVI-Dokuments.
Für jedes Dokumentenfenster wird eine Instanz dieser Klasse erzeugt von dem zum Fenster gehörenden CSheetChildFrame-Objekt.

 

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.
Für jedes geladene DVI-Dokument wird genau ein CDVIDoc-Objekt erzeugt.

 

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.
Es wird in theApp genau eine Instanz von CPrintManager angelegt.

 

CPrintThread

Funktionalität:

 

Instanzen:

 

Diese von CWinThread abgeleitet Klasse kapselt den von CPrintManager benötigten Druck-Thread.
Für jeden Druckauftrag erzeugt CPrintManager genau ein CPrintThread-Objekt, welches nach Beendigung des Druckauftrags wieder entfernt wird.

 

 

 

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.
Für jedes Dokumentenfenster wird von CSheetChildFrame ein neues CSheetFrame-Objekt erzeugt.

 

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.