Sat*_*uru 1 printing mfc visual-c++-6
我有一个自动打印报告的应用程序。我正在使用 CPrintDialog 来获取打印机 DC。
void CMyClass::PrintReport()
{
CDC dc;
CPrintDialog printDlg(FALSE);
printDlg.GetDefaults ();
::DeleteDC( printDlg.m_pd.hDC );
LPDEVMODE pDevMode = printDlg.GetDevMode();
if(pDevMode)
{
pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
::GlobalUnlock(pDevMode);
}
HDC hDC;
if( (hDC = printDlg.CreatePrinterDC()) == NULL )
{
::GlobalFree( printDlg.m_pd.hDevMode );
::GlobalFree( printDlg.m_pd.hDevNames );
return;
}
::GlobalFree( printDlg.m_pd.hDevMode );
::GlobalFree( printDlg.m_pd.hDevNames );
dc.Attach(hDC); // Attach a printer DC
dc.m_bPrinting = TRUE;
dc.SetMapMode(MM_LOENGLISH);
/*
Printing Logic using dc
*/
}
Run Code Online (Sandbox Code Playgroud)
当我在控制台应用程序附带的调试模式下运行我的应用程序时,这很好用。
但是,当我将应用程序作为 Windows 服务运行时,CPrintDialog 创建失败。
我做错了什么吗?:( 请帮我。
注意:应用程序设计为在安装中作为服务运行。
当我将应用程序作为 Windows 服务运行时,CPrintDialog 创建失败。
您不能在 Windows 服务中显示对话框(或任何类型的用户界面)。所以CPrintDialog永远不会工作。
但是您不需要创建对话框来获取打印机设备上下文,假设您已经知道要打印到哪台打印机。由于您作为非交互式服务运行,您必须已经知道这一点,因为用户无法选择打印机。
为此,只需CreateDC直接调用,指定"WINSPOOL"设备和打印机名称即可。您可以通过使用该EnumPrinters函数枚举已安装的打印机来获取所需打印机的名称。这一切都方便地记录在操作方法文章中:检索打印机设备上下文。