#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
>* >* 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 >