⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 docevent.cpp

📁 PrintMirror 1.5 可用版 VC6 + DDK
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                  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 + -