/*++ Copyright (c) Microsoft Corporation. All rights reserved. Module Name: Print.cpp Abstract: Implements printing functionality. Bad print functions are contained in badfunc.cpp. Notes: ANSI only - must run on Win9x. History: 01/30/01 rparsons Created 01/10/02 rparsons Revised --*/ #include "demoapp.h" extern APPINFO g_ai; /*++ Routine Description: Abort callback procedure for printing. Arguments: hDC - Print device context. Return Value: TRUE on success, FALSE otherwise. --*/ BOOL CALLBACK AbortProc( IN HDC hDC, IN int nError ) { MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } return TRUE; } /*++ Routine Description: Prints a little bit of text to a printer. Note that we call a couple bad functions from here. Arguments: hWnd - Parent window handle. lpTextOut - Text to print out. Return Value: TRUE on success, FALSE otherwise. --*/ BOOL PrintDemoText( IN HWND hWnd, IN LPSTR lpTextOut ) { HDC hDC = NULL; HANDLE hPrinter = NULL; DOCINFO di; PRINTDLG pdlg; char szError[MAX_PATH]; BOOL bReturn = FALSE; BOOL bResult = FALSE; // // If we're allowed, call a bad function. // If the user doesn't have any network printers // installed, this function will fail (on Windows 2000/XP). // if (g_ai.fEnableBadFunc) { bReturn = BadEnumPrinters(); if (!bReturn) { LoadString(g_ai.hInstance, IDS_NO_PRINTER, szError, sizeof(szError)); MessageBox(hWnd, szError, 0, MB_ICONERROR); return FALSE; } hPrinter = BadOpenPrinter(); if (!hPrinter) { LoadString(g_ai.hInstance, IDS_NO_PRINTER, szError, sizeof(szError)); MessageBox(hWnd, szError, 0, MB_ICONERROR); return FALSE; } else { ClosePrinter(hPrinter); } } // // Initialize the PRINTDLG structure and obtain a device context for the // default printer. // memset(&pdlg, 0, sizeof(PRINTDLG)); pdlg.lStructSize = sizeof(PRINTDLG); pdlg.Flags = PD_RETURNDEFAULT | PD_RETURNDC; PrintDlg(&pdlg); hDC = pdlg.hDC; if (!hDC) { LoadString(g_ai.hInstance, IDS_NO_PRINT_DC, szError, sizeof(szError)); MessageBox(hWnd, szError, 0, MB_ICONERROR); return FALSE; } // // Set the AbortProc callback. // if (SetAbortProc(hDC, AbortProc) == SP_ERROR) { LoadString(g_ai.hInstance, IDS_ABORT_PROC, szError, sizeof(szError)); MessageBox(hWnd, szError, 0, MB_ICONERROR); goto exit; } // // Initialize the DOCINFO structure and start the document. // di.cbSize = sizeof(DOCINFO); di.lpszDocName = "TestDoc"; di.lpszOutput = NULL; di.lpszDatatype = NULL; di.fwType = 0; StartDoc(hDC, &di); // // Print one page. // StartPage(hDC); TextOut(hDC, 0, 0, lpTextOut, lstrlen(lpTextOut)); EndPage(hDC); // // Tell the spooler that we're done. // EndDoc(hDC); bResult = TRUE; exit: DeleteDC(hDC); return bResult; }