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
#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
#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
lcPrt=GetPrinter()
lnOrient=2
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
=OpenPrinter(tcPrinter,@lhPrinter,0)
lnLen=DocumentProperties(_Screen.HWnd,lhPrinter,tcPrinter,0,0,0)
lcDevMode=Replicate(Chr(0),lnLen)
=DocumentProperties(_Screen.HWnd,lhPrinter,tcPrinter,@lcDevMode,0,DM_OUT_BUFFER)
lnFields=CToBin(SubStr(lcDevmode,DM_DMFIELDS_OFFSET,4),"4sr")
If Bitand(lnFields,DM_ORIENTATION)>0
lcDevMode=Stuff(lcDevMode,DM_ORIENTATION_OFFSET,2,BinToC(tnOrient,"2sr"))
EndIf
If Bitand(lnFields,DM_PAPERSIZE)>0
lcDevMode=Stuff(lcDevMode,DM_PAPERSIZE_OFFSET,2,BinToC(tnPaperSize,"2sr"))
EndIf
If Bitand(lnFields,DM_COPIES)>0
lcDevMode=Stuff(lcDevMode,DM_COPIES_OFFSET,2,BinToC(tnCopies,"2sr"))
EndIf
If Bitand(lnFields,DM_DEFAULTSOURCE)>0
lcDevMode=Stuff(lcDevMode,DM_DEFAULTSOURCE_OFFSET,2,BinToC(tnTray,"2sr"))
EndIf
=DocumentProperties(_Screen.HWnd,lhPrinter,tcPrinter,@lcDevMode,@lcDevMode,DM_IN_BUFFER+DM_OUT_BUFFER)
=DocumentProperties(_Screen.HWnd,lhPrinter,tcPrinter,@lcDevMode,@lcDevMode,DM_IN_BUFFER+DM_OUT_BUFFER+DM_IN_PROMPT)
=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