Programmieren mit C++

Code-Beispiele & Lösungen

Klassen für allgemeine Aufgaben

PrintStream-Klasse

Die Klasse prtStream, die von iostream abgeleitet ist, bietet den eleganten Zugriff auf Drucker über die übliche Stream-Schnittstelle. Damit reduziert sich der Drucker-I/O auf das Erzeugen und Ansprechen eines Streams.

Die Klasse dient primär dazu, Text komfortabel auszugeben. Über Templates werden jedoch auch diverse Manipulationsfunktionen bereitgestellt, die komplexe Ausgaben ermöglichen. Diese dienen als Beispiel für eigene Erweiterungen.

Extern arbeitet die Klasse prtStream mit der Maßeinheit „Inch“, intern mit 0,001 Inch. Alle Positionen und Maße müssen in Inch spezifiziert werden und beziehen sich immer auf die linke obere Ecke des Druckbereichs.

Für die Übergabe von Defaultwerten sind einige Konstanten definiert worden:

Konstante

Wert

Bedeutung

WHITESP

" "

Leerzeichen

defTopM

0.5

oberer Seitenrand

defBotM

0.5

unterer Seitenrand

defLeftM

0.5

linker Seitenrand

defTabInterval

0.5

Tabulatorabstand

defPgLen

11.0

Seitenlänge

defPrtLimit

defPgLen-defTopM

Länge des Druckbereichs

Public Members der Klasse

Konstanten

prtStream( 
    float leftMargin      = 0.5, 
    float topMargin       = 0.5,
    float botMargin       = 0.5, 
    float tabInterval     = 0.5,
    streambuf* pStreambuf = &strstreambuf());
prtStream( 
    streambuf* pStreambuf,
    float leftMargin      = 0.5, 
    float topMargin       = 0.5,
    float botMargin       = 0.5, 
    float tabInterval     = 0.5 );

Die beiden Konstruktoren erzeugen eine Instanz der Klasse prtStream, wobei als Defaultwerte die global definierten Konstanten eingesetzt werden.

Konstruktor prtStream

Print( TWindow* currentWin, 
       TPrinter& printer, 
       int nPages = 0,
       const char* jobName 
                   = "prtStream print job" );

Die Funktion Print sendet die zuvor im Stream aufgezeichneten Befehle an den Drucker. In nPages wird dabei die Anzahl der zu druckenden Seiten und in jobName der Bezeichner für den Druckjob übergeben. printer übernimmt ein TPrinter-Objekt.

Member Print

void  PrintLine( void );
void  PrintLine( const char *buff );

Das Member PrintLine wird dazu verwendet, den in buff übergebenen Text auszugeben bzw. einen Zeilenvorschub zu bewirken, wenn kein Parameter übergeben wurde.

Member PrintLine

void  NewLine( void );

Mit der Funktion NewLine wird ein Zeilenumbruch erzwungen. Die aktuelle Ausgabeposition wird auf den linken Rand gesetzt und vertikal um eine Zeile nach unten bewegt.

Member NewLine

void  NewPage( void );

NewPage erzwingt einen Seitenumbruch. Die aktuelle Ausgabeposition wird anschließend auf die linke obere Ecke des Druckbereichs, also (0, 0) gesetzt.

Member NewPage

void SaveState(
   prtStreamState state = PrintPos_, 
   int index = 0 );

Member SaveState speichert den in state übergebenen Streamstatus für index. Defaultwerte sind Index 0 und PrintPos als aktuelle Position.

Member SaveState

void  RestoreState(  
   prtStreamState state = PrintPos_, 
   int index = 0 );

RestoreState restauriert den zuvor mit SaveState gespeicherten StreamStatus für index. Defaultwerte sind wiederum Index 0 und PrintPos.

Member RestoreState

void SetPrintPos( 
     float y, 
     float x = -1, 
     bool ignoreMargin = false );

Über die Funktion SetPrintPos kann die aktuelle Ausgabeposition als Entfernung vom oberen Seitenrand festgelegt werden.

y bezeichnet die vertikale Position, die zum aktuellen Seitenrand hinzuaddiert wird, wenn ignoreMargin false ist; ansonsten dient der Papierrand als oberer Bezugspunkt.

Für x können zwei spezielle Werte für Defaultpositionen verwendet werden:

Wert

Position

0

aktuelle Position

-1

aktueller Rand

Member SetPrintPos

void  SetTabInterval(float t );

SetTabInterval erlaubt das Definieren eines neuen Abstands für die Tabulatorpositionen. Der Abstand wird in t als Fließkommazahl übergeben, wobei 1.0 einem Inch entspricht.

Member SetTabInterval

void  SetFont( LOGFONT& lf );

Die Klasse prtStream verwendet für die Ausgabe von Text immer den aktuell gesetzten Font. Dies ist bei Erzeugen der Instanz der Defaultfont. Über SetFont kann jedoch ein beliebiger Font gesetzt werden. In lf ist dazu eine komplette Beschreibung des Fonts in Form einer LOGFONT-Struktur zu übergeben.

Member SetFont

TPrintDC& PDC( void )

Member PDC liefert den aktuellen DeviceContext, der für Ausgaben der prtStream-Instanz verwendet wird.

Member PDC

void EndDoc( bool t )
bool EndDoc( void )

Die beiden Varianten des Members EndDoc greifen intern beide auf das Datenmember endDoc zurück und setzen dessen Wert bzw. fragen dessen Wert ab. Das Datenmember endDoc selbst gibt Auskunft darüber, ob der Druck beendet wurde oder nicht.

Member EndDoc

const int yPrintPos( void ) 
const int xPrintPos( void )

Die Member yPrintPos und xPrintPos liefern die aktuelle vertikale bzw. horizontale Ausgabeposition zurück.

Member yPrintPos, xPrintPos

const int xScale( void )
const int yScale( void )

Durch Verwenden einer internen Skalierung kann die komplette Druckausgabe komfortabel skaliert werden, ohne daß der Aufrufer die erforderliche Umrechnung vornehmen muß.

Member xScal, yScale

void NextPage( void ) 

Die Funktion NextPage erhöht den internen Zeitenzähler pages um den Wert eins.

Member NextPage

const int Pages( void )

Pages liefert den Wert des internen Seitenzählers pages zurück.

Member Pages

const int   PageNum(    void )

PageNum returniert die aktuelle Seite, die intern im Datenmember pageNum gespeichert ist.

Member PageNum

const float TopMargin ( void ) 
const float BotMargin ( void ) 
const float LeftMargin( void )

Die Member TopMargin, BotMargin und LeftMargin liefern die aktuellen Werte für den oberen, unteren und linken Seitenrand, jeweils korrigiert um den zugehörigen Skalierungsfaktor.

Member TopMargin, BotMargin, LeftMargin

const int LeftMargin( int )
void      LeftMargin( float margin )

LeftMargin setzt den linken Seitenrand. Der Parameter kann wahlweise als int- oder float-Wert übergeben werden. In beiden Fällen erfolgt intern eine Skalierung gemäß dem aktuellen Skalierungsfaktor.

Member LeftMargin

void TopMargin( float margin )
void BotMargin( float margin )

Der obere und untere Seitenrand wird über die Member TopMargin bzw. BotMargin gesetzt. Die Werte sind hier jeweils als float zu übergeben. Intern erfolgt eine Skalierung gemäß dem aktuellen Skalierungsfaktor.

Member TopMargin, BotMargin

void IgnoreMargins( bool ignore = false )

Sollen die gesetzten Seitenränder ignoriert werden, muß das interne Flag auf false gesetzt werden. Dazu dient die Funktion IgnoreMargins, deren Defaultparameter false lautet. Mit dem Parameter true werden die Seitenränder wieder aktiviert.

Member IgnoreMargins

void HeaderStart( streampos ptr )
void HeaderEnd (  streampos ptr )

HeaderStart und HeaderEnd markieren den Beginn und das Ende einer Kopfzeile. Alle zwischen diesen beiden Aufrufen erfolgenden Ausgaben werden in einer Kopfzeile plaziert.

Member HeaderStart, HeaderEnd

void FooterStart( streampos ptr )
void FooterEnd(   streampos ptr )

FooterStart und FooterEnd markieren den Beginn und das Ende einer Fußzeile. Alle zwischen diesen beiden Aufrufen erfolgenden Ausgaben werden in einer Fußzeile plaziert.

Templates

Über Templates werden eine Reihe weiterer komplexer Befehle bereitgestellt, die jedoch nicht direkt in der Klasse prtStream implementiert sind.

Member FooterStart, FooterEnd

SingleBox( float top,  float bottom, 
           float left, float right )

Mit SingleBox wird ein einfacher Rahmen mit Eckpunkten (top, left) und (bottom, right) gezeichnet.

SingleBox

drawFrame(  float top, float left, 
            float width, float height, 
            float lineWidth = 0.001, 
            int   lineStyle = PS_SOLID,
            int   red       = 0,
            int   green     = 0,
            int   blue      = 0  )

Mit DrawFrame können Rahmen mit erweiterten Attributen gezeichnet werden. Neben der linken oberen Ecke werden die Breite und Höhe als Parameter übergeben. Linienstärke und Linienstil haben per Default 0,001 Inch Breite und den Stil PS_SOLID. In red, green und blue werden die entsprechenden Farbanteile für die Rahmenfarbe spezifiziert.

Wird in top oder left ein negativer Wert übergeben, erfolgt die Ausgabe an der aktuellen Position.

drawFrame

drawLine( float top, float left, 
          float width, float height, 
          float lineWidth = 0.001,
          int   lineStyle = PS_SOLID,
          int   red       = 0, 
          int   green     = 0,
          int   blue      = 0 )

drawLine zeichnet eine Linie, wobei die zu übergebenden Parameter denen von drawFrame entsprechen.

drawLine

bitMap( TResId resId, 
        float x=0.0, float y=0.0, 
        float w=0.0, float h=0.0 )

Mit bitMap wird eine Bitmap, die aus den Ressourcen geladen wird und in resId spezifiziert ist, an der Position (x, y) mit der Breite width und Höhe height ausgegeben.

bitMap

setPrintCol( float x = -1, 
             bool ignoreMargins = false )

Erlaubt das Festlegen der aktuellen horizontalen Ausgabeposition als Distanz zum linken Rand. Ist ignoreMargins true, wird der linke Rand nicht berücksichtigt und statt dessen der absolute linke Rand als Bezugspunkt verwendet.

setPrintCol

endpg()

endpg erzwingt einen Seitenvorschub. Wird Freiformtext gedruckt, ohne daß alle N Seiten endpg aufgerufen wird, darf endpg gar nicht eingesetzt werden.

Stattdessen sollte dann endpg(true) verwendet und 0 an prtStream::Print() als Seitenzähler übergeben werden.

endpg

conditionalPageBreak( 
   float height= 0, 
   float limit = defPrtLimit )

Mit conditionalPageBreak können bedingungsabhängige Seitenumbrüche eingesetzt werden. Diese berechnen sich anhand der Parameter height und limit:

Umbruch, wenn (height + aktuelle Position) größer als Limit sind.

Mit Hilfe dieser Funktion lassen sich saubere untere Ränder bei der Druckausgabe realisieren.

conditional- PageBreak

endDoc()

Der Manipulator endDoc muß eingesetzt werden, wenn an prtStream::Print() keine Seitenanzahl übergeben wird, um das Ende des Druckvorgangs zu markieren.

EndDoc

pageNumber()

Aktuelle Seitennummer drucken, an der aktuellen Position.

pageNumber

numPages()

Druckt die Anzahl der gesamten Seiten an der aktuellen Ausgabeposition.

numPages

Das nachfolgende Beispiel zeigt, wie die Klasse eingesetzt wird, um Kopf- und Fußzeilen zu drucken:

#include 
#include 
#include "prtStream.h"
printExample( TWindow *Parent, 
              TPrinter &Printer )
{
  // Instanz von prtStream erzeugen
   prtStream prt( 0.5, 1.0 )
  // Kopfzeilen-Markierung setzen:
   prt << startHeader()
  // Kopfzeilenposition setzen:
        << setPrintPos( 0.50 )             
  // text ausgeben:
        << "Beispiel-Header 
  // Endmarkierung der Kopfzeile:
        << endHeader();

Analog dazu wird eine Fußzeile plaziert und ausgegeben:

   prt << startFooter()
       << setPrintPos( 10.00 )
       << "Page: " << pageNumber()
       << endFooter();

Zusätzlich erfolgt die Ausgabe von Standardtext auf der ersten und zweiten Druckseite:

   prt << "Hello Printer!" << endpg()
       << "Hello Again!!!" << endpg();

Zum Abschluß wird der Druckvorgang beendet:

   prt << endDoc();

Ausgabe der Druckseiten auf dem Drucker:

Beispiel

   prt.Print( Parent, Printer );
}




Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 02:57:44 von textarchiv.alojado.de