Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Printer DevMode Problem
Message
General information
Forum:
Visual FoxPro
Category:
Windows API functions
Environment versions
Visual FoxPro:
VFP 9 SP2
OS:
Vista
Database:
Visual FoxPro
Miscellaneous
Thread ID:
01321434
Message ID:
01324917
Views:
97
Hi

In case anyone is interested here is the correct code to change the DEVMODE for Orientation, Copies, PaperSize and Paper tray using the WINAPI
#Define    DM_IN_BUFFER      8
#Define    DM_IN_PROMPT      4
#Define    DM_OUT_BUFFER     2
*-----------------------------------------------------------------
* DEVMODE structure: field selection bits (dmFields)
*-----------------------------------------------------------------
#DEFINE DM_ORIENTATION                                  0x00000001
#DEFINE DM_PAPERSIZE                                    0x00000002
#DEFINE DM_PAPERLENGTH                                  0x00000004
#DEFINE DM_PAPERWIDTH                                   0x00000008
#DEFINE DM_SCALE                                        0x00000010
#DEFINE DM_POSITION                                     0x00000020
#DEFINE DM_COPIES                                       0x00000100
#DEFINE DM_DEFAULTSOURCE                                0x00000200
#DEFINE DM_PRINTQUALITY                                 0x00000400
#DEFINE DM_COLOR                                        0x00000800
#DEFINE DM_DUPLEX                                       0x00001000
#DEFINE DM_YRESOLUTION                                  0x00002000
#DEFINE DM_TTOPTION                                     0x00004000
#DEFINE DM_COLLATE                                      0x00008000
#DEFINE DM_FORMNAME                                     0x00010000
#DEFINE DM_LOGPIXELS                                    0x00020000
#DEFINE DM_BITSPERPEL                                   0x00040000
#DEFINE DM_PELSWIDTH                                    0x00080000
#DEFINE DM_PELSHEIGHT                                   0x00100000
#DEFINE DM_DISPLAYFLAGS                                 0x00200000
#DEFINE DM_DISPLAYFREQUENCY                             0x00400000
#DEFINE DM_ICMMETHOD                                    0x00800000
#DEFINE DM_ICMINTENT                                    0x01000000
#DEFINE DM_MEDIATYPE                                    0x02000000
#DEFINE DM_DITHERTYPE                                   0x04000000
#DEFINE DM_PANNINGWIDTH                                 0x08000000
#DEFINE DM_PANNINGHEIGHT                                0x10000000

#DEFINE DM_DMFIELDS_OFFSET                              41
#DEFINE DM_ORIENTATION_OFFSET                           45
#DEFINE DM_PAPERSIZE_OFFSET                             47
#DEFINE DM_PAPERLENGTH_OFFSET                           49
#DEFINE DM_PAPERWIDTH_OFFSET                            51
#DEFINE DM_SCALE_OFFSET                                 53
#DEFINE DM_COPIES_OFFSET                                55
#DEFINE DM_DEFAULTSOURCE_OFFSET                         57
#DEFINE DM_PRINTQUALITY_OFFSET                          59
#DEFINE DM_COLOR_OFFSET                                 61
#DEFINE DM_DUPLEX_OFFSET                                63
#DEFINE DM_YRESOLUTION_OFFSET                           65
#DEFINE DM_TTOPTION_OFFSET                              67
#DEFINE DM_COLLATE_OFFSET                               69
*======================================
* Windows Paper Sizes
*======================================
#DEFINE DMPAPER_LETTER                       1
#DEFINE DMPAPER_LETTERSMALL                  2
#DEFINE DMPAPER_TABLOID                      3
#DEFINE DMPAPER_LEDGER                       4
#DEFINE DMPAPER_LEGAL                        5
#DEFINE DMPAPER_STATEMENT                    6
#DEFINE DMPAPER_EXECUTIVE                    7
#DEFINE DMPAPER_A3                           8
#DEFINE DMPAPER_A4                           9
#DEFINE DMPAPER_A4SMALL                      10
#DEFINE DMPAPER_A5                           11
#DEFINE DMPAPER_B4                           12
#DEFINE DMPAPER_B5                           13
#DEFINE DMPAPER_FOLIO                        14
#DEFINE DMPAPER_QUARTO                       15
#DEFINE DMPAPER_10X14                        20
#DEFINE DMPAPER_11X17                        17
#DEFINE DMPAPER_NOTE                         18
#DEFINE DMPAPER_ENV_9                        19
#DEFINE DMPAPER_ENV_10                       20
#DEFINE DMPAPER_ENV_11                       21
#DEFINE DMPAPER_ENV_12                       22
#DEFINE DMPAPER_ENV_14                       23
#DEFINE DMPAPER_CSHEET                       24
#DEFINE DMPAPER_DSHEET                       25
#DEFINE DMPAPER_ESHEET                       26
#DEFINE DMPAPER_ENV_DL                       27
#DEFINE DMPAPER_ENV_C5                       28
#DEFINE DMPAPER_ENV_C3                       29
#DEFINE DMPAPER_ENV_C4                       30
#DEFINE DMPAPER_ENV_C6                       31
#DEFINE DMPAPER_ENV_C65                      32
#DEFINE DMPAPER_ENV_B4                       33
#DEFINE DMPAPER_ENV_B5                       34
#DEFINE DMPAPER_ENV_B6                       35
#DEFINE DMPAPER_ENV_ITALY                    36
#DEFINE DMPAPER_ENV_MONARCH                  37
#DEFINE DMPAPER_ENV_PERSONAL                 38
#DEFINE DMPAPER_FANFOLD_US                   39
#DEFINE DMPAPER_FANFOLD_STD_GERMAN           40
#DEFINE DMPAPER_FANFOLD_LGL_GERMAN           41

#DEFINE DMBIN_FIRST                          DMBIN_UPPER
#DEFINE DMBIN_UPPER                          1
#DEFINE DMBIN_ONLYONE                        1
#DEFINE DMBIN_LOWER                          2
#DEFINE DMBIN_MIDDLE                         3
#DEFINE DMBIN_MANUAL                         4
#DEFINE DMBIN_ENVELOPE                       5
#DEFINE DMBIN_ENVMANUAL                      6
#DEFINE DMBIN_AUTO                           7
#DEFINE DMBIN_TRACTOR                        8
#DEFINE DMBIN_SMALLFMT                       9
#DEFINE DMBIN_LARGEFMT                       10
#DEFINE DMBIN_LARGECAPACITY                  11
#DEFINE DMBIN_CASSETTE                       14
#DEFINE DMBIN_FORMSOURCE                     15
#DEFINE DMBIN_LAST                           DMBIN_FORMSOURCE
#DEFINE DMBIN_USER                           256


*
* Configure Orientation, Copies, Paper Size and Paper tray
*
lcPrt=GetPrinter()
lnOrient=2  && Landscape=2   Portrait=1
lnCopies=2
lnPaperSize=DMPAPER_LEGAL
lnTray=DMBIN_ENVELOPE


=SetPrinterWinDevMode(lcPrt,lnOrient,lnCopies,lnPaperSize,lnTray)
  
Return   
Procedure SetPrinterWinDevMode
   Lparameters tcPrinter,tnOrient,tnCopies,tnPaperSize,tnTray
   
   Local lhPrinter,lnDefault,lnLen,lcDevMode,leRtn,lnFields
   Declare Integer OpenPrinter In WinSpool.drv String pPrinterName,Integer @phPrinter, Integer pDefault
   Declare Integer ClosePrinter In winspool.drv Integer phPrinter
   Declare Integer DocumentProperties in winspool.drv Integer hWnd,Integer hPrinter,String pDeviceName,;
   String @pDevModeOutput, String @pDevModeInput,Integer fMode
   
   lhPrinter=0

*
* Printer handle for the specified printer
*
   
   =OpenPrinter(tcPrinter,@lhPrinter,0)
*
* Get the length of the DEVMODE buffer
*
   lnLen=DocumentProperties(_Screen.HWnd,lhPrinter,tcPrinter,0,0,0)
*
* Create the DEVMODE Buffer
*   
   lcDevMode=Replicate(Chr(0),lnLen)
*
* Write the default printer settings to the buffer
*   
   =DocumentProperties(_Screen.HWnd,lhPrinter,tcPrinter,@lcDevMode,0,DM_OUT_BUFFER)
*
* Obtain the list of fields avialable for the specified printer
*
   lnFields=CToBin(SubStr(lcDevmode,DM_DMFIELDS_OFFSET,4),"4sr")
   
*
* Set orientation if this feature is supported
*
   If Bitand(lnFields,DM_ORIENTATION)>0
      lcDevMode=Stuff(lcDevMode,DM_ORIENTATION_OFFSET,2,BinToC(tnOrient,"2sr"))
   EndIf
*
* Set Paper Size if this feature is supported
*
   If Bitand(lnFields,DM_PAPERSIZE)>0
      lcDevMode=Stuff(lcDevMode,DM_PAPERSIZE_OFFSET,2,BinToC(tnPaperSize,"2sr"))
   EndIf
*
* Set number of copies if this feature is supported
*
   If Bitand(lnFields,DM_COPIES)>0
      lcDevMode=Stuff(lcDevMode,DM_COPIES_OFFSET,2,BinToC(tnCopies,"2sr"))
   EndIf
*
* Set Paper tray if this feature is supported.  Ideally you should check to see what bins are supported before setting this
* value.  I have skipped that step for this sample.
*
   If Bitand(lnFields,DM_DEFAULTSOURCE)>0
      lcDevMode=Stuff(lcDevMode,DM_DEFAULTSOURCE_OFFSET,2,BinToC(tnTray,"2sr"))
   EndIf
*
* Write settings back to Windows
*   
   =DocumentProperties(_Screen.HWnd,lhPrinter,tcPrinter,@lcDevMode,@lcDevMode,DM_IN_BUFFER+DM_OUT_BUFFER)

*
* View the page setup dialog to see if the settings were accepted
*
 =DocumentProperties(_Screen.HWnd,lhPrinter,tcPrinter,@lcDevMode,@lcDevMode,DM_IN_BUFFER+DM_OUT_BUFFER+DM_IN_PROMPT)

*
* Close Printer
*
   =ClosePrinter(lhPrinter)
EndProc
>Hi
>
>I am using an ActiveX control to print RTF files. Since this will be used in an automated environment I need to be able to configure the printer settings without user intervention. So after reading articles about the WinAPI and articles by other VFP programmers such as Barbara Peisch I began testing the following code. The print parameters are contained in object (oPrintParam) which is attached to my main application object (goApp). So I wrote a program to convert the parameters into a Printer DevMode Structure which I then write to the printer using Sys(1037).
>
>However it appears to have no effect on the printer settings and the document is not printed with the correct orientation or copies etc.
>
>I have not been able to see what I have done wrong. Can anyone tell me what might be wrong with this code?
>
>Thanks,
>Simon
>
>
>
>*
>* SetPrinterDevMode.prg -- Modifies the printer's DevMode for Orientation, Paper Tray, Copies and Paper Size
>*
>Local lcRpt
>lcRpt=Sys(2015)
>=PushWorkArea()
>Select 0
>Create Cursor Temp (Test C(10))
>Select 0
>Create Report (gcTmp+lcRpt+".frx") From Temp
>Use In Select("Temp")
>Use (gcTmp+lcRpt+".frx") Exclu Alias UPDevMod
>
>Set Printer to Name (goApp.oPrintParam.Printer)
>*
>* Write printer environment to cursor
>*
>Sys(1037,2)
>Replace Next 1 UPDevMod.Tag2 With ConfigureDevMode(goApp.oPrintParam,UPDevMod.Tag2)
>*
>* Write modified printer environment to printer
>*
>Sys(1037,3)
>Use In Select("UPDevMod")
>=PopWorkArea()
>
>myole.Print()
>
>*
>* I have tried opening a text file with "Modi Comm" and then printing the
>* thinking it should honour the settings I modified above but this does
>* not work.
>*
>*
>Return
>
>Function ConfigureDevMode
>   LParameters toParam,tcDevMode
>   Local lnPaperSize
>
>   tcDevMode=Stuff(tcDevMode,DM_ORIENTATION_OFFSET,2,BinToC(Iif(toParam.Orientation="Portrait",1,2),"2sr"))
>
>   tcDevMode=Stuff(tcDevMode,DM_COPIES_OFFSET,2,BinToC(toParam.Copies,"2sr"))
>
>*
>* Convert my Paper Size parameters to the ones used in the WinAPI
>*
>   Do Case
>   Case toParam.PaperSize=Transform(VPAPER_A4)
>      lnPaperSize=DMPAPER_A4
>   Case toParam.PaperSize=Transform(VPAPER_LETTER)
>      lnPaperSize=DMPAPER_LETTER
>   Case toParam.PaperSize=Transform(VPAPER_LEGAL)
>      lnPaperSize=DMPAPER_LEGAL
>   Case toParam.PaperSize=Transform(VPAPER_CSHEET)
>      lnPaperSize=DMPAPER_CSHEET
>   Case toParam.PaperSize=Transform(VPAPER_DSHEET)
>      lnPaperSize=DMPAPER_DSHEET
>   Case toParam.PaperSize=Transform(VPAPER_ESHEET)
>      lnPaperSize=DMPAPER_ESHEET
>   Case toParam.PaperSize=Transform(VPAPER_LETTERSMALL)
>      lnPaperSize=DMPAPER_LETTERSMALL
>   Case toParam.PaperSize=Transform(VPAPER_TABLOID)
>      lnPaperSize=DMPAPER_TABLOID
>   Case toParam.PaperSize=Transform(VPAPER_LEDGER)
>      lnPaperSize=DMPAPER_LEDGER
>   Case toParam.PaperSize=Transform(VPAPER_STATEMENT)
>      lnPaperSize=DMPAPER_STATEMENT
>   Case toParam.PaperSize=Transform(VPAPER_EXECUTIVE)
>      lnPaperSize=DMPAPER_EXECUTIVE
>   Case toParam.PaperSize=Transform(VPAPER_A3)
>      lnPaperSize=DMPAPER_A3
>   Case toParam.PaperSize=Transform(VPAPER_A4SMALL)
>      lnPaperSize=DMPAPER_A4SMALL
>   Case toParam.PaperSize=Transform(VPAPER_A5)
>      lnPaperSize=DMPAPER_A5
>   Case toParam.PaperSize=Transform(VPAPER_B4)
>      lnPaperSize=DMPAPER_B4
>   Case toParam.PaperSize=Transform(VPAPER_B5)
>      lnPaperSize=DMPAPER_B5
>   Case toParam.PaperSize=Transform(VPAPER_FOLIO)
>      lnPaperSize=DMPAPER_FOLIO
>   Case toParam.PaperSize=Transform(VPAPER_QUARTO)
>      lnPaperSize=DMPAPER_QUARTO
>   Case toParam.PaperSize=Transform(VPAPER_10X14)
>      lnPaperSize=DMPAPER_10X14
>   Case toParam.PaperSize=Transform(VPAPER_11X17)
>      lnPaperSize=DMPAPER_11X17
>   Case toParam.PaperSize=Transform(VPAPER_NOTE)
>      lnPaperSize=DMPAPER_NOTE
>   Case toParam.PaperSize=Transform(VPAPER_ENV_9)
>      lnPaperSize=DMPAPER_ENV_9
>   Case toParam.PaperSize=Transform(VPAPER_ENV_10)
>      lnPaperSize=DMPAPER_ENV_10
>   Case toParam.PaperSize=Transform(VPAPER_ENV_11)
>      lnPaperSize=DMPAPER_ENV_11
>   Case toParam.PaperSize=Transform(VPAPER_ENV_12)
>      lnPaperSize=DMPAPER_ENV_12
>   Case toParam.PaperSize=Transform(VPAPER_ENV_14)
>      lnPaperSize=DMPAPER_ENV_14
>   Case toParam.PaperSize=Transform(VPAPER_ENV_DL)
>      lnPaperSize=DMPAPER_ENV_DL
>   Case toParam.PaperSize=Transform(VPAPER_ENV_C5)
>      lnPaperSize=DMPAPER_ENV_C5
>   Case toParam.PaperSize=Transform(VPAPER_ENV_C3)
>      lnPaperSize=DMPAPER_ENV_C3
>   Case toParam.PaperSize=Transform(VPAPER_ENV_C4)
>      lnPaperSize=DMPAPER_ENV_C4
>   Case toParam.PaperSize=Transform(VPAPER_ENV_C6)
>      lnPaperSize=DMPAPER_ENV_C6
>   Case toParam.PaperSize=Transform(VPAPER_ENV_C65)
>      lnPaperSize=DMPAPER_ENV_C65
>   Case toParam.PaperSize=Transform(VPAPER_ENV_B4)
>      lnPaperSize=DMPAPER_ENV_B4
>   Case toParam.PaperSize=Transform(VPAPER_ENV_B5)
>      lnPaperSize=DMPAPER_ENV_B5
>   Case toParam.PaperSize=Transform(VPAPER_ENV_B6)
>      lnPaperSize=DMPAPER_ENV_B6
>   Case toParam.PaperSize=Transform(VPAPER_ENV_ITALY)
>      lnPaperSize=DMPAPER_ENV_ITALY
>   Case toParam.PaperSize=Transform(VPAPER_ENV_MONARCH)
>      lnPaperSize=DMPAPER_ENV_MONARCH
>   Case toParam.PaperSize=Transform(VPAPER_ENV_PERSONAL)
>      lnPaperSize=DMPAPER_ENV_PERSONAL
>   Case toParam.PaperSize=Transform(VPAPER_FANFOLD_US)
>      lnPaperSize=DMPAPER_FANFOLD_FANFOLD_US
>   Case toParam.PaperSize=Transform(VPAPER_FANFOLD_STD_GERMAN)
>      lnPaperSize=DMPAPER_FANFOLD_STD_GERMAN
>   Case toParam.PaperSize=Transform(VPAPER_FANFOLD_LGL_GERMAN)
>      lnPaperSize=DMPAPER_FANFOLD_LGL_GERMAN
>   EndCase
>   tcDevMode=Stuff(tcDevMode,DM_PAPERSIZE_OFFSET,2,BinToC(lnPaperSize,"2sr"))
>
>   If toParam.Tray<>"-1"
>      tcDevMode=Stuff(tcDevMode,DM_DEFAULTSOURCE_OFFSET,2,BinToC(Val(toParam.Tray),"2sr"))
>   EndIf
>
>   Return tcDevMode
>EndFunc
>
Simon White
dCipher Computing
Previous
Reply
Map
View

Click here to load this message in the networking platform