EMF.C
上传用户:yuandong
上传日期:2022-08-08
资源大小:954k
文件大小:3k
源码类别:

Delphi控件源码

开发平台:

C++ Builder

  1. /*++
  2. Module Name:
  3.     windowsspoolerprtprocswinprintemf.c
  4. Abstract:
  5.     Routines to facilitate printing of EMF jobs.
  6. Revision History:
  7. --*/
  8. #include "stddef.h"
  9. #include <windef.h>
  10. #include <windows.h>
  11. #include <winspool.h>
  12. #include <winsplp.h>
  13. #include <wchar.h>
  14. #include "winprint.h"
  15. // !!LATER define these prototypes here until I get the spooler to include
  16. // the header files froms ntgdiinc [gerritv] 5-12-95
  17. typedef int (CALLBACK* EMFPLAYPROC)( HDC hdc, INT iFunction, HANDLE hPageQuery );
  18. BOOL WINAPI GdiPlayEMF
  19. (
  20. LPWSTR     pwszPrinterName,
  21. LPDEVMODEW pDevmode,
  22. LPWSTR     pwszDocName,
  23. EMFPLAYPROC pfnEMFPlayFn,
  24. HANDLE     hPageQuery
  25. );
  26. /*++
  27. *******************************************************************
  28.     P r i n t E M F J o b
  29.     Routine Description:
  30.         Prints out a job with EMF data type.
  31.     Arguments:
  32.         pData           => Data structure for this job
  33.         pDocumentName   => Name of this document
  34.     Return Value:
  35.         TRUE  if successful
  36.         FALSE if failed - GetLastError() will return reason.
  37. *******************************************************************
  38. --*/
  39. BOOL
  40. PrintEMFJob(
  41.     IN PPRINTPROCESSORDATA pData,
  42.     IN LPWSTR pDocumentName)
  43. {
  44.     ULONG   Copies;
  45.     DWORD   Start = 0;
  46.     DWORD   End   = 0xffffffff;
  47.     INT     Priority = 0;
  48.     /** Print the data pData->Copies times **/
  49.     Copies = pData->Copies;
  50.     try {
  51.         while (Copies--) {
  52.             /**
  53.                 WORKWORK - There is a problem here.  It seems that
  54.                 the graphics engine deletes the print job
  55.                 once it is done playing it.  Because of this,
  56.                 only one copy is spit out. One fix would be to copy
  57.                 the file off if we will be doing copies, then copy it
  58.                 back for each copy.  Another would be to add a flag to
  59.                 the play call specifying whether to delete the file
  60.                 or not.  Finally, we could just not support copies
  61.                 for journal jobs.
  62.                 WORKWORK - GdiPlayEMF supports a call back function to
  63.                 query which pages should be played next.  This requires
  64.                 support fromt the spooler to allow random access to the
  65.                 spool file on a per page basis.  When this is implemented
  66.                 we can print any number of copies we like using this call
  67.                 back function.
  68.             **/
  69.             /** Call the graphics engine to print the job **/
  70.             if (!GdiPlayEMF(pData->pPrinterName,
  71.                             pData->pDevmode,
  72.                             pDocumentName,
  73.                             NULL,
  74.                             NULL)) {
  75.                 return FALSE;
  76.             }
  77.         } /* While copies to print **/
  78.     } except (TRUE) {
  79.         OutputDebugString(L"GdiPlayEMF gave an exceptionn");
  80.         return FALSE;
  81.     }
  82.     return TRUE;
  83. }