📄 docevent.cpp
字号:
WCHAR TempFileName[1024]; GetTempFile(NULL , L"PM",TempFileName); PMPreview pmpreview(TempFileName); OutputDebugString(TempFileName); GetMetaFileFromSpoolFile(pPDev->pSpoolFileName ,PageNbr + 1,TempFileName, pPDev, (BYTE **)&pDevmode); if(pDevmode) free(pDevmode); DialogBoxParam( (HINSTANCE)hModDLL, // handle to module MAKEINTRESOURCE(IDD_PREVIEWER), hDlg, // handle to owner window PMPreview::PreviewMetafile, // dialog box procedure (LPARAM)&pmpreview ); } return TRUE; case IDSAVE: { WCHAR szFileName[MAX_PATH] = L"untitled"; WCHAR szTitleName[MAX_PATH] = L""; OPENFILENAME ofn; WCHAR DirName[MAX_PATH]; GetCurrentDirectory( MAX_PATH, DirName); PopFileSaveDlg (hDlg, szFileName, szTitleName,ofn); WCHAR *ptr =ofn.lpstrFile + ofn.nFileExtension; if(!wcscmp(ptr,L"emf")) { DEVMODE *pDevmode = NULL; int PageNbr = GetWindowLongPtr(hDlg , GWLP_USERDATA); GetMetaFileFromSpoolFile(pPDev->pSpoolFileName ,PageNbr + 1,ofn.lpstrFile, pPDev, (BYTE **)&pDevmode); if(pDevmode) free(pDevmode); } else SaveAsBitmap(hDlg,ofn,pPDev); } break; case IDPRINT: { PrintToPaper(pPDev); } break; case IDNEXT: { int PageNbr = GetWindowLongPtr(hDlg , GWLP_USERDATA); PageNbr++; if(PageNbr == (pPDev->Pages - 1) ) { HWND hwnd = GetDlgItem(hDlg , IDNEXT); EnableWindow(hwnd , FALSE); } else if(PageNbr >= pPDev->Pages) break; SetWindowLongPtr(hDlg ,GWLP_USERDATA , PageNbr); if(PageNbr > 0 && PageNbr < pPDev->Pages ) { HWND hwnd = GetDlgItem(hDlg , IDPREV); EnableWindow(hwnd , TRUE); } WCHAR PageStatus[100]; wsprintf(PageStatus , L"Click [Extract] to Extract Page %d of %d",PageNbr + 1, pPDev->Pages ); SetDlgItemText(hDlg,IDC_SAVEAS,PageStatus); } break; case IDPREV: { int PageNbr = GetWindowLongPtr(hDlg , GWLP_USERDATA); PageNbr--; if(PageNbr == 0 ) { HWND hwnd = GetDlgItem(hDlg , IDPREV); EnableWindow(hwnd , FALSE); } else if(PageNbr < 0) break; SetWindowLongPtr(hDlg ,GWLP_USERDATA , PageNbr); if(PageNbr < (pPDev->Pages - 1) && PageNbr >= 0) { HWND hwnd = GetDlgItem(hDlg , IDNEXT); EnableWindow(hwnd , TRUE); } WCHAR PageStatus[100]; wsprintf(PageStatus , L"Click [Extract] to extract Page %d of %d",PageNbr + 1, pPDev->Pages ); SetDlgItemText(hDlg,IDC_SAVEAS,PageStatus); } break; default: return FALSE; } break; case WM_CLOSE: EndDialog(hDlg , 0); break; default: return FALSE; } return TRUE;}void PMUIDriver::FixUpDevmode(IN HANDLE hPrinter , IN DEVMODE *pbIn, IN OUT PULONG pbOut){ LPBYTE pPrinterInfo; DWORD cbNeeded; GetPrinter(hPrinter,2,NULL ,0,&cbNeeded); pPrinterInfo = (LPBYTE)malloc(cbNeeded); GetPrinter(hPrinter,2,pPrinterInfo,cbNeeded,&cbNeeded); size_t sz; VDEVMODE *pdm = (VDEVMODE *)malloc(sz = (sizeof(VDEVMODE))); PDEVMODE pInDevmode = (PDEVMODE)pbIn; if(pInDevmode->dmSize == sizeof(DEVMODEW) && pInDevmode->dmDriverExtra == sizeof(VPDEVMODE)) memcpy((void *)pdm,(void *)pInDevmode , sz); else { if(!IsSpooler()) DrvDocumentProperties(0,hPrinter , ((PRINTER_INFO_2 *)pPrinterInfo)->pPrinterName ,(PDEVMODE)pdm,(PDEVMODE)pbIn, DM_IN_BUFFER | DM_OUT_BUFFER); } *pbOut = (ULONG)pdm; CreateGDIInfo(hPrinter,pdm); free(pPrinterInfo);}INT PMUIDriver::DrvDocumentEvent( HANDLE hPrinter, HDC hdc, int iEsc, ULONG cbIn, PULONG pbIn, ULONG cbOut, PULONG pbOut ){ DUMPMSG("DrvDocumentEvent"); static DWORD Pages = 0; static BOOL *pResetDC = NULL; static DWORD dwJobId; switch(iEsc) { case DOCUMENTEVENT_RESETDCPOST: case DOCUMENTEVENT_CREATEDCPOST: { free((void *)pbIn[0]); } break; case DOCUMENTEVENT_RESETDCPRE: { DUMPMSG("DrvDocumentEventreset"); if(!pResetDC) pResetDC = (BOOL *)malloc(sizeof(BOOL) * (Pages + 1)); pResetDC[Pages] = TRUE; } case DOCUMENTEVENT_CREATEDCPRE: { CreateWin2kcompatibleSplFile(hPrinter); if(iEsc == DOCUMENTEVENT_CREATEDCPRE) FixUpDevmode(hPrinter , (PDEVMODE)pbIn[2], pbOut); else FixUpDevmode(hPrinter , (PDEVMODE)pbIn[0], pbOut); } break; case DOCUMENTEVENT_STARTPAGE: DUMPMSG("DrvDocumentEventstartpage"); if(!pResetDC) { pResetDC = (BOOL *)malloc(sizeof(BOOL)); pResetDC[0] =FALSE; } Pages++; break; case DOCUMENTEVENT_ENDPAGE: { DUMPMSG("DrvDocumentEventendpage"); BOOL *pTemp = (BOOL *)malloc(sizeof(BOOL) * (Pages + 1)); if(pResetDC) { memcpy(pTemp , pResetDC , sizeof(BOOL) * Pages ); free(pResetDC); } pResetDC = pTemp; pResetDC[Pages] = FALSE; } break; case DOCUMENTEVENT_ENDDOC: { /* You need administrator access to the spool directory for the below to work */ if(IsSpooler()) { DWORD dwSize = sizeof(DEVDATA) - sizeof(VDEVMODE *) - sizeof(LPTSTR); DEVDATA PDEV; ZeroMemory(&PDEV , sizeof(DEVDATA)); ExtEscape(hdc,PDEV_ESCAPE, 0 , NULL , dwSize, (LPSTR)&PDEV); PDEV.pResetDC = pResetDC; TCHAR SpoolFileName[MAX_PATH]; GetSpoolFileName(PDEV.dwJobId , SpoolFileName , hPrinter); PDEV.hPDriver = hPrinter; TCHAR TempSpoolFileName[MAX_PATH]; GetTempFile(NULL ,L"PM" , TempSpoolFileName); CopyFile(SpoolFileName , TempSpoolFileName, FALSE); PDEV.pSpoolFileName = TempSpoolFileName; DWORD cbNeeded; GetJob( PDEV.hPDriver, PDEV.dwJobId, 2, 0, 0, &cbNeeded); LPBYTE pJobInfo = (LPBYTE)MALLOC(cbNeeded); GetJob( PDEV.hPDriver, PDEV.dwJobId, 2, pJobInfo, cbNeeded, &cbNeeded); PDEV.pCurDevmode = (VDEVMODE *)(((JOB_INFO_2 *)pJobInfo)->pDevMode); PDEV.pDocument = (((JOB_INFO_2 *)pJobInfo)->pDocument); DialogBoxParam( (HINSTANCE)hModDLL, MAKEINTRESOURCE(IDD_SAVEDIALOG), GetDesktopWindow(), PMDialog, (LPARAM)(&PDEV)); dwJobId = PDEV.dwJobId; free(pJobInfo); DeleteFile(TempSpoolFileName); } Pages = 0; if(pResetDC) { free(pResetDC); pResetDC = NULL; } } break; case DOCUMENTEVENT_DELETEDC: break; case DOCUMENTEVENT_STARTDOC: break; case DOCUMENTEVENT_ENDDOCPOST: { if(IsSpooler()) { PRINTER_DEFAULTS defaults = { NULL, NULL, PRINTER_ALL_ACCESS}; HANDLE hGPrinter; WCHAR PrintMirrorName[256]; GetPrintMirrorName(PrintMirrorName); OpenPrinter(PrintMirrorName, &hGPrinter, NULL); LPVOID lpv = malloc(sizeof(HANDLE) + sizeof(DWORD)); *((HANDLE *)lpv) = hGPrinter; *(DWORD *)((LPBYTE)lpv + sizeof(HANDLE)) = dwJobId; HANDLE hThread = CreateThread( NULL, 0, ThreadFunc, lpv, 0, NULL); } //_CrtDumpMemoryLeaks(); } break; } return DOCUMENTEVENT_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -