2009-07-30 9 views
3

Ich bin auf Windows und versuche, eine Enhanced Metafile (EMF) mit PlayEnhMetaFile() zu drucken.Wie kann ich einen Druckergerätekontext erhalten?

Ich zeige es gerade mit einem Gerätekontext für ein Fenster auf dem Bildschirm, aber jetzt möchte ich es an einen Drucker senden.

Wie kann ich einen Gerätekontext für den Drucker bekommen und ihn ordnungsgemäß in diese Funktion übertragen?

Antwort

4

Der einfachste Weg ist es, den Gerätekontext aus PRINTDLG.hDevMode und PRINTDLG.hDevNames nach PrintDlg Aufruf zu verwenden, konstruieren, wenn win32-API verwenden, oder rufe CPrintDialog::GetPrinterDC, wenn Sie MFC verwenden.

Wenn MFC:

CPrintDialog dlgPrint(FALSE, PD_USEDEVMODECOPIES); 
HDC hPrinterDC = dlgPrint.GetPrinterDC(); 

oder win32 API:

HDC hPrinterDC = NULL; 
PRINTDLG dlgPrint; 
if (PrintDlg(&dlgPrint) && dlgPrint.hDevMode != NULL) 
{ 
    DEVNAMES *pDevNames = (DEVNAMES*)GlobalLock(dlgPrint.hDevNames); 
    DEVMODE* pDevMode = NULL; 
    if (dlgPrint.hDevMode != NULL) 
     pDevMode = GlobalLock(dlgPrint.hDevMode); 
    hPrinterDC = CreateDC((LPCTSTR)pDevNames + pDevNames->wDriverOffset, 
          (LPCTSTR)pDevNames + pDevNames->wDeviceOffset, 
          (LPCTSTR)pDevNames + pDevNames->wOutputOffset, 
          pDevMode); 
    GlobalUnlock(dlgPrint.hDevNames); 
    if (dlgPrint.hDevMode != NULL) 
     GlobalUnlock(dlgPrint.hDevMode); 
} 
+0

Gibt es eine Möglichkeit, ein CDC-Objekt zu erhalten? – samoz

+0

Sicher: CDC :: FromHandle() – Alan

+0

Haben Sie das gelöst? – Alan

3

CreateDC es tun kann,

HDC hDC = CreateDC(NULL,printerName,NULL,NULL);

Sie können printer von EnumPrinters bekommen.

+0

P.S. Referenz = Petzold: Programmierfenster (Fünfte Ausgabe), Seite 604 –

Verwandte Themen