Here's my code for sending a bitmap to the printer I'm leaving out the part where I maintain an aspect ratio between the screen and the printer page.
SIZEL sizl = {0,0}; // Get DC/PS for printer hdcPrinter = GetPrinterDC( hab, PM_Q_STD ); hpsPrinter = GpiCreatePS( hab, hdcPrinter, &sizl, PU_PELS | GPIF_DEFAULT | GPIT_NORMAL | GPIA_ASSOC); // Get DC/PS for memory DC compatible with printer hdcPrtMem = DevOpenDC( hab, OD_MEMORY, "*", 0, NULL, hdcPrinter ); hpsPrtMem = GpiCreatePS( hab, hdcPrtMem, &sizl, PU_PELS | GPIF_DEFAULT | GPIT_MICRO | GPIA_ASSOC ); // Get DC/PS for memory DC compatible with display hdcMemory = DevOpenDC( hab, OD_MEMORY, "*", 0, NULL, NULLHANDLE ); hpsMemory = GpiCreatePS( hab, hdcMemory, &sizl, PU_PELS | GPIF_DEFAULT | GPIT_MICRO | GPIA_ASSOC ); // Get PS for a window to be printed hpsToPrint = WinGetPS( hwndToPrint ); // Set up memory BitBlt BITMAPINFOHEADER2 bmih; LONG alBitmapStuff[ 2 ]; WinQueryWindowPos( hwndToPrint, &swp ); bmih.cbFix = sizeof( BITMAPINFOHEADER2 ); bmih.cx = swp.cx; bmih.cy = swp.cy; GpiQueryDeviceBitmapFormats( hpsToPrint, 2L, alBitmapStuff ); bmih.cPlanes = (USHORT) alBitmapStuff[ 0 ]; bmih.cBitCount = (USHORT) alBitmapStuff[ 1 ]; // ....Set up aptl[0],[1],[2],[3] for the memory BitBlt // Do BitBlt from Display memory PS to Printer memory PS hbmToPrint = GpiCreateBitmap( hpsMemory, &bmih, 0, NULL, NULL ); GpiSetBitmap( hpsMemory, hbmToPrint ); GpiBitBlt( hpsMemory, hpsToPrint, 3L, aptl, ROP_SRCCOPY, BBO_IGNORE ); GpiSetBitmap( hpsMemory, NULLHANDLE ); GpiSetBitmap( hpsPrtMem, hbmToPrint ); // ....Set up aptl[0],[1],[2],[3] for the printer BitBlt // BitBlt to printer PS from Printer memory PS DevEscape( hdcPrinter, DEVESC_STARTDOC,strlen( szDocName ), szDocName, &lBytes, NULL ); GpiBitBlt( hpsPrinter, hpsPrtMem, 4L, aptl, ROP_SRCCOPY,BBO_IGNORE ); DevEscape( hdcPrinter, DEVESC_ENDDOC, 0, NULL, &lBytes, NULL ); GpiSetBitmap( hpsPrtMem, NULLHANDLE ); GpiDeleteBitmap( hbmToPrint ); // Release all hdc's and hps's
Credit: Rick Fishman