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