Forum: PC-Programmierung Drucker in C++ ansteuern


von A. R. (eisregen)


Lesenswert?

Hallo,

ich versuche einen Drucker in C++ (Dev-C++) anzusteuern. Das Dokument 
erscheint bereits mit dem gewünschten Namen in der Warteschlange, leider 
schmiert mir die Anwendung jedoch bei der Funktion WritePrinter() ab und 
ich weiß nicht wieso...
1
typedef struct _DOC_INFO_1 {
2
  LPTSTR pDocName;
3
  LPTSTR pOutputFile;
4
  LPTSTR pDatatype;
5
}DOC_INFO_1;
6
7
if( (StartDocPrinter( meinPrinter, 1, (LPBYTE)&DocInfo )) == 0 )
8
    {
9
      ClosePrinter( meinPrinter );
10
        MessageBox(0,"Fehler!","",MB_OK);
11
    }
12
        StartPagePrinter(meinPrinter);
13
14
char test[] = "Dieser Text soll ausgedruckt werden";
15
LPVOID Buffer=test; 
16
DWORD read=sizeof(test);
17
LPDWORD written;
18
WritePrinter(meinPrinter, Buffer, read, written); 
19
EndPagePrinter(meinPrinter);
20
EndDocPrinter(meinPrinter);
21
ClosePrinter(meinPrinter);

Dann wollte ich noch allgemein fragen, ob dies die adäquate Methode ist, 
um in C++ längere Texte(z.B. per Dialog geöffnete Textdateien mit 
mehreren Seiten Text) zum Drucker zu senden? Soweit ich das gelesen 
habe, muss man sich um die Aufteilung der Seiten selbst kümmern und die 
Randeinstellungen
beachten (cxClient, cyClient)...nicht dass ich mir zu viel Arbeit mache 
und es gibt eine viel elegantere Methode?!?

von Peter (Gast)


Lesenswert?

ich glaube du bist mit

> WritePrinter(meinPrinter, Buffer, read, written);

auf dem Holzweg, dort müssen die Daten rein die der Drucker versteht und 
nicht einfach so ein Text.


Du musst auf den DeviceContext(DC) von dem Dokument die normalen GDI 
Funktionen nutzen, wie es auch auf den Bildschirm gemacht wird.

Um in Text zu "malen" nimmt man dann  DrawString
Um solche sachen wie Zeilenumbruch, Seitenumbruch, Rändern muss man sich 
dabei komplett selber kümmern.

von Karl H. (kbuchegg)


Lesenswert?

A. R. schrieb:

> DWORD read=sizeof(test);
> LPDWORD written;

soso.
written ist also ein Pointer, der auf einen DWORD zeigt.
Kurze Frage: Wo ist denn dieser DWORD?

> WritePrinter(meinPrinter, Buffer, read, written);

Tja. Und dann wird wahrscheinlich WritePrinter die Anzahl geschriebener 
Bytes im DWORD hinterlassen wollen, deren Adresse du in written 
übergibst. Nur: written ist ein Pointer und zeigt als slcher auf keinen 
DWORD. Es zeigt irgendwohin. Wo genau, wissen nur die Götter.

Nicht alles, was in einer Funktions-Argumentliste als Pointer deklariert 
ist, heisst für dich automatisch, dass du auch eine Pointer Variable 
dafür brauchst. Du Funktion will an dieser Stelle oft einfach nur die 
Adresse einer Variablen haben, in die sie schreiben darf.

 DWORD written;

 WritePrinter(meinPrinter, Buffer, read, &written);


> Dann wollte ich noch allgemein fragen, ob dies die adäquate Methode ist,
> um in C++ längere Texte(z.B. per Dialog geöffnete Textdateien mit
> mehreren Seiten Text) zum Drucker zu senden?

Nein.
Liegt vor allen Dingen daran, dass WritePrinter die falsche Methode 
dafür ist.

Für dein Programm gibt es keinen Unterschied ob du in ein Fenster oder 
zum Drucker hin ausgibst. Beides wird über einen Device-Kontext 
dargestellt auf den ganz normal ausgegeben wird.

> beachten (cxClient, cyClient)...nicht dass ich mir zu viel Arbeit mache
> und es gibt eine viel elegantere Methode?!?

Normalerweise hat ja ein Windows-Programm irgendwo eine Draw-Funktion, 
die den Inhalt des Documents in einen DC abbildet. Anstelle des DC, den 
man normalerweise bei einer WM_PAINT Nachricht bekommt, benutzt man dann 
einfach den DC den man von den Druckerfunktionen bekommt und schon malt 
dieselbe Routine nicht mehr in ein Fenster sondern auf den Drucker. OK, 
den DruckerDC muss man meist noch etwas anpassen, weil ein Drucker ja 
höhere Auflösungen hat, als ein Monitor, aber ansonsten ist das meiste 
einfach nur eine Frage der Organisation dieser Zeichenroutine.

von Klaus W. (mfgkw)


Lesenswert?

Elegant ist Geschmackssache, aber vielleicht geht es zumindest viel
einfacher, den Text in eine Datei zu schreiben und dann PRINT
aufzurufen (mal in der Eingabeaufforderung HELP PRINT eingeben).
Z.B. mit system( "PRINT \"C:\\Temp\\meinedatei.txt\"" );

von A. R. (eisregen)


Lesenswert?

>soso.
>written ist also ein Pointer, der auf einen DWORD zeigt.
>Kurze Frage: Wo ist denn dieser DWORD?

Erwischt! ;) Aber ich glaube ich habe jetzt vom Prinzip her begriffen, 
wie ich den Drucker ansteuern kann! Das mit der Text-Datei hatte ich 
auch schon überlegt, wollte es aber nur im Notfall so machen, wenn ich 
mit der Druckersteuerung überhaupt nicht zurecht komme.

Vielen Dank für eure Hilfe.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.