mikrocontroller.net

Forum: PC-Programmierung Drucker in C++ ansteuern


Autor: A. R. (eisregen)
Datum:

Bewertung
0 lesenswert
nicht 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...
typedef struct _DOC_INFO_1 {
  LPTSTR pDocName;
  LPTSTR pOutputFile;
  LPTSTR pDatatype;
}DOC_INFO_1;

if( (StartDocPrinter( meinPrinter, 1, (LPBYTE)&DocInfo )) == 0 )
    {
      ClosePrinter( meinPrinter );
        MessageBox(0,"Fehler!","",MB_OK);
    }
        StartPagePrinter(meinPrinter);

char test[] = "Dieser Text soll ausgedruckt werden";
LPVOID Buffer=test; 
DWORD read=sizeof(test);
LPDWORD written;
WritePrinter(meinPrinter, Buffer, read, written); 
EndPagePrinter(meinPrinter);
EndDocPrinter(meinPrinter);
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?!?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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\"" );

Autor: A. R. (eisregen)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.