Sample Code
Windows Driver Samples/ MSPLOT Plotter Driver Sample/ C++/ plotui/ ptrinfo.c/
/*++ Copyright (c) 1990-2003 Microsoft Corporation Module Name: ptrInfo.c Abstract: This module contains functions to mappring a hPrinter to useful data, it will also cached the printerinfo data Author: 03-Dec-1993 Fri 00:16:37 created [Environment:] GDI Device Driver - Plotter. [Notes:] Revision History: --*/ #include "precomp.h" #pragma hdrstop #define DBG_PLOTFILENAME DbgPtrInfo #define DBG_MAPPRINTER 0x00000001 #define DBG_CACHE_DATA 0x00000002 DEFINE_DBGVAR(0); PPRINTERINFO MapPrinter( HANDLE hPrinter, PPLOTDEVMODE pPlotDMIn, LPDWORD pdwErrIDS, DWORD MPFlags ) /*++ Routine Description: This function map a handle to the printer to useful information for the plotter UI Arguments: hPrinter - Handle to the printer pPlotDMIn - pointer to the PLOTDEVMODE pass in to be validate and merge with default into pPI->PlotDM, if this pointer is NULL then a default PLOTDEVMODE is set in the pPI pdwErrIDS - pointer to a DWORD to store the error string ID if an error occured. MPFlags - MPF_xxxx flags for this function Return Value: return a pointer to the PRINTERINFO data structure, if NULL then it failed when a pPI is returned then following fields are set and validated hPrinter, pPlotGPC, CurPaper. and following fields are set to NULL Flags, Author: 02-Dec-1993 Thu 23:04:18 created 29-Dec-1993 Wed 14:50:23 updated NOT automatically select AUTO_ROTATE if roll feed device Revision History: --*/ { PPRINTERINFO pPI; PPLOTGPC pPlotGPC; WCHAR DeviceName[CCHDEVICENAME]; UINT cPenSet; UINT MaxPens = 0; DWORD cbPen = 0; DWORD cb; if (!(pPlotGPC = hPrinterToPlotGPC(hPrinter, DeviceName, CCHOF(DeviceName)))) { if (pdwErrIDS) { *pdwErrIDS = IDS_NO_MEMORY; } return(NULL); } cPenSet = 0; if (pPlotGPC->Flags & PLOTF_RASTER) { cb = sizeof(PRINTERINFO) + ((MPFlags & MPF_DEVICEDATA) ? (sizeof(DEVHTADJDATA) + (sizeof(DEVHTINFO) * 2)) : 0); } else { MaxPens = (UINT)pPlotGPC->MaxPens; cbPen = (DWORD)(sizeof(PENDATA) * MaxPens); cPenSet = (MPFlags & MPF_DEVICEDATA) ? PRK_MAX_PENDATA_SET : 1; cb = sizeof(PRINTERINFO) + (DWORD)(cbPen * cPenSet); } if (!(pPI = (PPRINTERINFO)LocalAlloc(LPTR, cb + ((MPFlags & MPF_PCPSUI) ? sizeof(COMPROPSHEETUI) : 0)))) { UnGetCachedPlotGPC(pPlotGPC); if (pdwErrIDS) { *pdwErrIDS = IDS_NO_MEMORY; } return(NULL); } if (MPFlags & MPF_PCPSUI) { pPI->pCPSUI = (PCOMPROPSHEETUI)((LPBYTE)pPI + cb); } pPI->hPrinter = hPrinter; pPI->pPlotDMIn = pPlotDMIn; pPI->PPData.Flags = PPF_AUTO_ROTATE | PPF_SMALLER_FORM | PPF_MANUAL_FEED_CX; pPI->IdxPenSet = 0; pPI->pPlotGPC = pPlotGPC; pPI->dmErrBits = ValidateSetPLOTDM(hPrinter, pPlotGPC, DeviceName, pPlotDMIn, &(pPI->PlotDM), NULL); GetDefaultPlotterForm(pPlotGPC, &(pPI->CurPaper)); if (pPlotGPC->Flags & PLOTF_RASTER) { // // Get the raster plotter default and settings // if (MPFlags & MPF_DEVICEDATA) { PDEVHTADJDATA pDHTAD; PDEVHTINFO pDefHTInfo; PDEVHTINFO pAdjHTInfo; pAdjHTInfo = PI_PADJHTINFO(pPI); pDHTAD = PI_PDEVHTADJDATA(pPI); pDefHTInfo = (PDEVHTINFO)(pDHTAD + 1); pDHTAD->DeviceFlags = (pPlotGPC->Flags & PLOTF_COLOR) ? DEVHTADJF_COLOR_DEVICE : 0; pDHTAD->DeviceXDPI = (DWORD)pPI->pPlotGPC->RasterXDPI; pDHTAD->DeviceYDPI = (DWORD)pPI->pPlotGPC->RasterYDPI; pDHTAD->pDefHTInfo = pDefHTInfo; pDHTAD->pAdjHTInfo = pAdjHTInfo; pDefHTInfo->HTFlags = HT_FLAG_HAS_BLACK_DYE; pDefHTInfo->HTPatternSize = (DWORD)pPlotGPC->HTPatternSize; pDefHTInfo->DevPelsDPI = (DWORD)pPlotGPC->DevicePelsDPI; pDefHTInfo->ColorInfo = pPlotGPC->ci; *pAdjHTInfo = *pDefHTInfo; UpdateFromRegistry(hPrinter, &(pAdjHTInfo->ColorInfo), &(pAdjHTInfo->DevPelsDPI), &(pAdjHTInfo->HTPatternSize), &(pPI->CurPaper), &(pPI->PPData), NULL, 0, NULL); } } else { PPENDATA pPenData; WORD IdxPenSet; // // Get the pen plotter default and settings // pPenData = PI_PPENDATA(pPI); UpdateFromRegistry(hPrinter, NULL, NULL, NULL, &(pPI->CurPaper), &(pPI->PPData), &(pPI->IdxPenSet), 0, NULL); if (MPFlags & MPF_DEVICEDATA) { IdxPenSet = 0; } else { IdxPenSet = (WORD)pPI->IdxPenSet; } // // Set default pen set and get all the pen set back // while (cPenSet--) { CopyMemory(pPenData, pPlotGPC->Pens.pData, cbPen); UpdateFromRegistry(hPrinter, NULL, NULL, NULL, NULL, NULL, NULL, MAKELONG(IdxPenSet, MaxPens), pPenData); IdxPenSet++; (LPBYTE)pPenData += cbPen; } } if (MPFlags & MPF_HELPFILE) { GetPlotHelpFile(pPI); } return(pPI); } VOID UnMapPrinter( PPRINTERINFO pPI ) /*++ Routine Description: Arguments: Return Value: Author: 01-Nov-1995 Wed 19:05:40 created Revision History: --*/ { if (pPI) { if (pPI->pPlotGPC) { UnGetCachedPlotGPC(pPI->pPlotGPC); } if (pPI->pFI1Base) { LocalFree((HLOCAL)pPI->pFI1Base); } if (pPI->pHelpFile) { LocalFree((HLOCAL)pPI->pHelpFile); } if (pPI->pOptItem) { POPTITEM pOI = pPI->pOptItem; UINT cOI = (UINT)pPI->cOptItem; while (cOI--) { if (pOI->UserData) { LocalFree((HLOCAL)pOI->UserData); } pOI++; } LocalFree((HLOCAL)pPI->pOptItem); } LocalFree((HLOCAL)pPI); } } LPBYTE GetPrinterInfo( HANDLE hPrinter, UINT PrinterInfoLevel ) /*++ Routine Description: This function get the DRIVER_INFO_1 Pointer from a hPrinter Arguments: hPrinter - The handle to the printer interested PrinterInfoLevel - It can be PRINTER_INFO_1, PRINTER_INFO_2, PRINTER_INFO_3, PRINTER_4, PRINTER_INFO_5. Return Value: the return value is NULL if failed else a pointer to the PRINTER_INFO_X where X is from 1 to 5. the caller must call LocalFree() to free the memory object after using it. Author: 16-Nov-1995 Thu 23:58:37 created Revision History: --*/ { LPVOID pb; DWORD cb; // // Find out total bytes required // GetPrinter(hPrinter, PrinterInfoLevel, NULL, 0, &cb); if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { PLOTERR(("GetPrinterInfo%d: GetPrinterPrinter(1st) error=%08lx", PrinterInfoLevel, xGetLastError())); } else if (!(pb = (LPBYTE)LocalAlloc(LMEM_FIXED, cb))) { PLOTERR(("GetPrinterInfo%d: LocalAlloc(%ld) failed", PrinterInfoLevel, cb)); } else if (GetPrinter(hPrinter, PrinterInfoLevel, pb, cb, &cb)) { // // Got it allright, so return it // return(pb); } else { PLOTERR(("GetPrinterInfo%d: GetPrinterPrinter(2nd) error=%08lx", PrinterInfoLevel, xGetLastError())); LocalFree((HLOCAL)pb); } return(NULL); } DWORD GetPlotterIconID( PPRINTERINFO pPI ) /*++ Routine Description: Arguments: Return Value: Author: 29-Nov-1995 Wed 19:32:00 created Revision History: --*/ { DWORD Flags; DWORD IconID; if ((Flags = pPI->pPlotGPC->Flags) & PLOTF_RASTER) { IconID = (Flags & PLOTF_ROLLFEED) ? IDI_RASTER_ROLLFEED : IDI_RASTER_TRAYFEED; } else { IconID = (Flags & PLOTF_ROLLFEED) ? IDI_PEN_ROLLFEED : IDI_PEN_TRAYFEED; } return(IconID); }
Our Services
-
What our customers say about us?
Read our customer testimonials to find out why our clients keep returning for their projects.
View Testimonials