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?


  • Mod

    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.


  • Mod

    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.


Anmelden zum Antworten