2009-07-30 41 views
3

我在Windows上並嘗試使用PlayEnhMetaFile()打印增強型圖元文件(EMF)。如何獲得打印機設備上下文?

我目前在屏幕上使用設備上下文顯示窗口,但現在我想將它發送到打印機。

如何獲取打印機的設備上下文並將其正確傳遞到此功能?

回答

4

最簡單的方法是,如果使用Win32 API,或者如果您正在使用MFC調用CPrintDialog::GetPrinterDC調用PrintDlg後使用從PRINTDLG.hDevModePRINTDLG.hDevNames構建設備上下文。

如果使用MFC:

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

或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

有沒有辦法獲得CDC對象? – samoz 2009-07-30 19:26:48

+0

當然:CDC :: FromHandle() – Alan 2009-07-30 23:21:20

3

的CreateDC可以做到這一點,

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

您可以從EnumPrinters得到PRINTERNAME。

相關問題