Drucken mit API
-
Mit folgendem Code ermittele ich den DruckerDC:
LPDEVMODE lpDevMode = (LPDEVMODE)GlobalLock( prn.hDevMode );
HDC dc = CreateDC("WINSPOOL",(LPCTSTR)lpDevMode->dmDeviceName,NULL,NULL);dmDeviceName nimmt aber nur 32 Zeichen incl. der schließenden Null.
Ist der Druckername allerdings länger wird der Rest abgeschnitten und der
dc ist NULL nicht geht mehr.Wie kann man das umschiffen?
-
Erzeuge den DC über CPrintDlg mit PD_RETURNDC, der nutzt implizit hDevMode
Es gibt massenweise Artikel in www.codeproject.com, die den richtigen Umgang damit zeigen.
-
Erstmal Danke für die Antwort,
aber das ganze nutzt mir nichts, weil ich den Printdlg auch gleichzeitig für meine Druckvorschau benutze.
Der Dialog läuft in einer HookProc und DC über PD_RETURNDC bekomme ich erst wenn der Dialog geschlossen wird.
-
Wo hast Du einen Hook?
Im Print Dialog?
Wie willst Du im Dialog schon wissen, welcher Drucker ausgewählt ist?Grundsätzlich: Es ist in der MSDN klar dokumentiert, dass Du den vollen Namen nur über hDevNames/ DEVNAMES bekommst...
-
Dazu habe ich eine PrintHookProc.
prn.Flags = PD_ENABLEPRINTHOOK | PD_ENABLEPRINTTEMPLATE;Da ich den Printdlg ein bißchen verbogen habe, kann er sowohl den Pagesetup und die Druckervorschau starten
und bleibt solange aktiv bis der eigentliche Druck fertig ist. Erst danach wird der Dialog geaschlossen.Ich habe die Sache jetzt so gelöst:
Ich frage mit Sendmessage die Combobox "ID=1139" mit den Druckernamen ab und speichere den dann in eine Variable und nutze diese.