• Keine Ergebnisse gefunden

Ein Druckerprogramm

Im Dokument Windows-Programmierung mit C++ (Seite 171-181)

XQG7KUHDGV

13.2 Ein Druckerprogramm

13.2.1 Der Quelltext

Dieses Programm ist in der Lage, bei einem Klick auf die Schaltfläche

„Drucken“ mit einem Standarddruckerdialog eine Abfrage des Dru-ckers vorzunehmen. Dann wird das Wort „Drucker“ auf dem Blatt ausgegeben. Der Drucker sollte zuvor auf „Grafikausgabe“ gestellt werden.

Nitty Gritty • Start up!

Bild 13.1: Die Anwendung nach dem Start

Bild 13.2: Der Standarddruckerdialog

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,

Nitty Gritty • Start up!

HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {

WNDCLASS WndClass;

WndClass.style = 0;

WndClass.cbClsExtra = 0;

WndClass.cbWndExtra = 0;

WndClass.lpfnWndProc = WndProc;

WndClass.hInstance = hInstance;

WndClass.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);

WndClass.hCursor = LoadCursor (NULL, IDC_ARROW);

WndClass.hIcon = LoadIcon (NULL, IDI_APPLICATION);

WndClass.lpszMenuName = 0;

WndClass.lpszClassName = "WinProg";

RegisterClass(&WndClass);

HWND hWindow,hButton;

hWindow = CreateWindow("WinProg","Fenster", WS_OVERLAPPEDWINDOW, 0,0,400,400,NULL,NULL, hInstance, NULL);

hButton = CreateWindow("BUTTON","Drucken", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,

10,340,140,20,hWindow,(HMENU) 1, hInstance, NULL);

ShowWindow (hWindow, nCmdShow);

UpdateWindow (hWindow);

MSG Message;

while (GetMessage(&Message, NULL, 0, 0)) {

DispatchMessage(&Message);

Nitty Gritty • Start up!

}

return (Message.wParam);

}

LRESULT CALLBACK WndProc (HWND hWnd, UINT uiMessage, WPARAM wParam,LPARAM lParam) {

switch(uiMessage) {

case WM_COMMAND:

if (HIWORD(wParam) == BN_CLICKED) {

if (LOWORD(wParam) == 1) {

PRINTDLG pd;

ZeroMemory(&pd, sizeof(PRINTDLG));

pd.lStructSize = sizeof(PRINTDLG);

pd.hwndOwner = hWnd;

pd.hDevMode = NULL;

pd.hDevNames = NULL;

pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC;

pd.nCopies = 1;

pd.nFromPage = 0xFFFF;

pd.nToPage = 0xFFFF;

pd.nMinPage = 1;

pd.nMaxPage = 0xFFFF;

if (PrintDlg(&pd) == true) {

MessageBox (hWnd, "richtig", "richtig",MB_OK);

}

Nitty Gritty • Start up!

DOCINFO di;

di.cbSize = sizeof(DOCINFO);

di.lpszDocName = "Bitmap Printing Test";

di.lpszOutput = (LPTSTR) NULL;

di.fwType = 0;

StartDoc(pd.hDC, &di);

StartPage(pd.hDC);

TextOut(pd.hDC, 10, 10, "Drucker", lstrlen ("Drucker"));

EndPage(pd.hDC);

EndDoc(pd.hDC);

DeleteDC(pd.hDC);

} } return 0;

case WM_DESTROY:

PostQuitMessage(0);

return 0;

default:

return DefWindowProc (hWnd, uiMessage, wParam, lParam);

} }

Nitty Gritty • Start up!

13.2.2 Erläuterung

Die einzigen Neuerungen liegen in der Nachricht WM_COMMAND.

Aufruf des Druckerstandarddialogs

Windows stellt mehrere Standarddialoge zur Verfügung: für „Datei öffnen“, „Datei speichern“, „Farbauswahl“ und „Drucken“. In die-sem Programm wird der Standarddialog für Drucken verwendet. Die-ser Dialog ermöglicht die Auswahl des Druckers und spezifische Einstellungen. Der Dialog erstellt auch ein Gerätekontext-Objekt.

Den Druckerstandarddialog erzeugt man mit der Funktion PrintDlg.

Diese Funktion erwartet eine Struktur vom Typ PRINTDLG.

typedef struct tagPD {

pd DWORD lStructSize;

HWND hwndOwner;

Wir gehen hier nur auf die Variablen ein, die auch verwendet werden.

Alle anderen werden durch ZeroMemory auf NULL gesetzt.

Nitty Gritty • Start up!

lStructSize ist die Größe der Struktur. Sie wird mit sizeof ermit-telt.

HDC ist ein Handle auf ein Gerätekontext-Objekt, das vom Dialog PrintDlg erzeugt wurde.

Flags sind eine Reihe von Konstanten, die hier angegeben werden.

PD_RETURNDC ist ein Flag, das bestimmt, dass ein Handle auf das Gerätekontext-Objekt für den Drucker zurückgegeben wird.

NCopies ist die Anzahl der Kopien, die gedruckt werden sollen.

Nun muss noch mit dem Befehl PrintDlg ein Standarddialogfeld auf-gerufen werden. Windows stellt einige Standarddialogfelder zur Ver-fügung. Dialogfelder sind nichts anderes als Fenster, die zur Eingabe bestimmt sind. Diese Standarddialogfelder werden mit einer Struk-tur aufgerufen und liefern Werte zurück. In diesem Programm wird der Druckerdialog verwendet. Er wird mit dem Befehl PrintDlg auf-gerufen, dem eine Struktur übergeben wird, die zur Initialisierung und Ausgabe genutzt wird.

BOOL PrintDlg( LPPRINTDLG lppd);

Diesem Aufruf wird im Quelltext die oben besprochene Struktur über-geben.

PrintDlg(&pd);

Einen Druckauftrag einleiten

Windows stellt Funktionen zur Verfügung, mit denen auf dem Dru-cker zugegriffen werden kann. Zum einen gibt es die Funktion, dass man den Drucker genau so behandeln kann wie eine Grafikausgabe, indem man einfach einen Gerätekontext-Handle erstellt. Mit den an-deren Funktionen wird der Druckauftrag eingeleitet, der dann im Dru-ckermanager erscheint. Dazu wird die Funktion StartDoc verwendet.

Dann muss noch mit der Funktion StartPage eine neue Seite einge-richtet werden. Schon seit der Verwendung der Funktion PrintDlg ist der Gerätekontext mit dem Druckertreiber verbunden. Der Druck beginnt aber erst, nachdem der gesamte Druckauftrag abgeschlos-sen ist. Nachdem nun der Gerätekontext erstellt worden ist, werden die einzelnen Funktionen für den Drucker aufgerufen.

Nitty Gritty • Start up!

DOCINFO di;

di.cbSize = sizeof(DOCINFO);

di.lpszDocName = "Bitmap Printing Test";

di.lpszOutput = (LPTSTR) NULL;

di.fwType = 0;

StartDoc(pd.hDC, &di);

StartPage(pd.hDC);

TextOut(pd.hDC, 10, 10, "Drucker", lstrlen ("Drucker"));

EndPage(pd.hDC);

EndDoc(pd.hDC);

DeleteDC(pd.hDC);

Die Funktion StartDoc startet einen neuen Druckauftrag.

int StartDoc( HDC hdc, CONST DOCINFO *lpdi);

Hdc ist der Handle auf das Geräte Kontext Objekt, für das ein neuer Druckjob angelegt werden soll.

Lpdi ist ein Zeiger auf eine Struktur vom Typ DOCINFO. Diese Struktur hat für dieses Programm keine Bedeutung. Sie beinhaltet lediglich Angaben über Namen von Dokumenten und Dateien. Es muss nur die Größe angegeben werden. Die erforderliche Struk-turvariable heißt cbSize.

Die Funktion StartPage beginnt eine neue Seite, in die dann mit den gewohnten GDI-Funktionen gezeichnet werden kann.

int StartPage( HDC hDC);

Hdc ist der Handle auf das Gerätekontext-Objekt, das die neue Seite bekommt.

Die Funktion EndPage schließt eine Seite ab.

int EndPage( HDC hdc);

Nitty Gritty • Start up!

Hdc ist der Handle auf das Geärte Kontext Objekt.

Die Funktion EndDoc beendet den gesamten Druckauftrag.

int EndDoc( HDC hdc);

Hdc ist der Handle auf das Gerätekontext-Objekt.

Nachdem mit StartDoc und StartPage eine Seite für einen Druck-auftrag erstellt wurde, kann mit den GDI-Funktionen auf die Seite gezeichnet werden. Bevor man aber die GDI-Funktionen anwen-det, muss man normalerweise festlegen, mit welcher Maßeinheit der Gerätekontext angesprochen werden soll.

7 $.( 7+$7

7 (,/ ,,

Im Dokument Windows-Programmierung mit C++ (Seite 171-181)