uo_printer_setting.sru 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174
  1. $PBExportHeader$uo_printer_setting.sru
  2. forward
  3. global type uo_printer_setting from nonvisualobject
  4. end type
  5. end forward
  6. type str_printer_info_1 from structure
  7. long flags
  8. long Description
  9. long name
  10. long comment
  11. end type
  12. type str_printer_info_2 from structure
  13. long servername
  14. long printername
  15. long sharename
  16. long portname
  17. long drivername
  18. long comment
  19. long location
  20. long devmode
  21. long sepfile
  22. long printprocessor
  23. long datatype
  24. long parameters
  25. long securitydescriptor
  26. long attributes
  27. long priority
  28. long defaultpriority
  29. long starttime
  30. long untiltime
  31. long status
  32. long cjobs
  33. long averageppm
  34. character reserve[500]
  35. end type
  36. type str_devmode from structure
  37. character dmdevicename[32]
  38. unsignedinteger dmspecversion
  39. unsignedinteger dmdriverversion
  40. unsignedinteger dmsize
  41. unsignedinteger dmdriverextra
  42. unsignedlong dmfields
  43. unsignedinteger dmorientation
  44. unsignedinteger dmpapersize
  45. unsignedinteger dmpaperlength
  46. unsignedinteger dmpaperwidth
  47. integer dmscale
  48. integer dmcopies
  49. integer dmdefaultsource
  50. integer dmprintquality
  51. integer dmcolor
  52. integer dmduplex
  53. integer dmyresolution
  54. integer dmttoption
  55. integer dmcollate
  56. character dmformname[32]
  57. unsignedinteger dmlogpixels
  58. unsignedlong dmbitsperpel
  59. unsignedlong dmpelswidth
  60. unsignedlong dmpelsheight
  61. unsignedlong dmdisplayflags
  62. unsignedlong dmdisplayfrequency
  63. unsignedlong dmicmmethod
  64. unsignedlong dmicmintent
  65. unsignedlong dmmediatype
  66. unsignedlong dmdithertype
  67. unsignedlong dmreserved1
  68. unsignedlong dmreserved2
  69. unsignedlong dmreserved3
  70. end type
  71. type str_printer_defaults from structure
  72. long Datatype
  73. long DevMode
  74. long DesiredAccess
  75. end type
  76. type str_printdlg from structure
  77. unsignedlong lstructsize
  78. unsignedlong hwndowner
  79. unsignedlong hdevmode
  80. unsignedlong hdevnames
  81. unsignedlong hdc
  82. unsignedlong flags
  83. unsignedinteger nfrompage
  84. unsignedinteger ntopage
  85. unsignedinteger nminpage
  86. unsignedinteger nmaxpage
  87. unsignedinteger ncopies
  88. unsignedlong hinstance
  89. unsignedlong lcustdata
  90. unsignedlong lpfnprinthook
  91. unsignedlong lpfnsetuphook
  92. unsignedlong lpprinttemplatename
  93. unsignedlong lpsetuptemplatename
  94. unsignedlong hprinttemplate
  95. unsignedlong hsetuptemplate
  96. uint reserve1
  97. end type
  98. type str_devnames from structure
  99. UINT wDriverOffset
  100. UINT wDeviceOffset
  101. UINT wOutputOffset
  102. UINT wDefault
  103. character drivername[32]
  104. character devicename[32]
  105. character portname[32]
  106. end type
  107. type str_point from structure
  108. long x
  109. long y
  110. end type
  111. type str_rect from structure
  112. long left
  113. long top
  114. long right
  115. long bottom
  116. end type
  117. type str_PAGESETUPDLG from structure
  118. ulong lStructSize
  119. ulong hwndOwner
  120. ulong hDevMode
  121. ulong hDevNames
  122. ulong Flags
  123. str_point ptPaperSize
  124. str_rect rtMinMargin
  125. str_rect rtMargin
  126. ulong hInstance
  127. ulong lCustData
  128. ulong lpfnPageSetupHook
  129. ulong lpfnPagePaintHook
  130. ulong lpPageSetupTemplateName
  131. ulong hPageSetupTemplate
  132. end type
  133. global type uo_printer_setting from nonvisualobject autoinstantiate
  134. end type
  135. type prototypes
  136. function boolean EnumPrinters(ulong flags, string name, ulong level, ref blob buffer, ulong cbbuf, ref ulong cbneeded, ref ulong returned) library "winspool.drv" alias for "EnumPrintersA;Ansi"
  137. function ulong CopyMem ( ref str_printer_info_1 dest, ref blob source, ulong length ) library "kernel32" alias for "RtlMoveMemory;Ansi"
  138. function ulong CopyMem ( ref str_printer_info_2 dest, ref blob source, ulong length ) library "kernel32" alias for "RtlMoveMemory;Ansi"
  139. function ulong CopyMem ( ref blob source, ref str_printer_info_2 dest, ulong length ) library "kernel32" alias for "RtlMoveMemory;Ansi"
  140. function boolean OpenPrinter ( string PrinterName, ref ulong hPrinter, ulong null) library "winspool.drv" alias for "OpenPrinterA;Ansi"
  141. function boolean OpenPrinter ( string PrinterName, ref ulong hPrinter, ref str_printer_defaults null) library "winspool.drv" alias for "OpenPrinterA;Ansi"
  142. function boolean ClosePrinter ( ulong hPrinter ) library "winspool.drv"
  143. function boolean GetPrinter ( ulong hPrinter, ulong level, ref blob Printer, ulong cbbuf, ref ulong cbNeeded ) library "winspool.drv" alias for "GetPrinterA"
  144. function boolean SetPrinter ( ulong hPrinter, ulong level, ref blob Printer, ulong command ) library "winspool.drv" alias for "SetPrinterA"
  145. function boolean PrinterProperties ( ulong hwnd, ulong hprinter ) library "winspool.drv"
  146. function ulong CopyMem ( ref str_devmode dest, ref blob src, ulong length ) library "kernel32" alias for "RtlMoveMemory;Ansi"
  147. function ulong CopyMem ( ref str_devmode dest, ulong src, ulong length ) library "kernel32" alias for "RtlMoveMemory;Ansi"
  148. function ulong CopyMem ( ref blob src, ref str_devmode dest, ulong length ) library "kernel32" alias for "RtlMoveMemory;Ansi"
  149. function ulong CopyMem ( ulong src, ref str_devmode dest, ulong length ) library "kernel32" alias for "RtlMoveMemory;Ansi"
  150. function long DocumentProperties ( ulong hwnd, ulong hprinter, string null, ref blob DevModeOutput, long null_1, ulong fMode ) library "winspool.drv" alias for "DocumentPropertiesA;Ansi"
  151. function long DocumentProperties ( ulong hwnd, ulong hprinter, string null, ulong null_1, ref str_devmode pDevModeInput , ulong fMode ) library "winspool.drv" alias for "DocumentPropertiesA;Ansi"
  152. function long DocumentProperties ( ulong hwnd, ulong hprinter, string null, ulong null_1, ref blob pDevModeInput , ulong fMode ) library "winspool.drv" alias for "DocumentPropertiesA;Ansi"
  153. function long DeviceCapabilities ( string Device, string Port, uint fwCapability, ref blob pOutput, long devmode ) library "winspool.drv" alias for "DeviceCapabilitiesA;Ansi"
  154. function long DeviceCapabilities ( string Device, string Port, uint fwCapability, long null, long devmode ) library "winspool.drv" alias for "DeviceCapabilitiesA;Ansi"
  155. function ulong CreateDC ( long driver, string device, long output, long devmode ) library "gdi32" alias for "CreateDCA;Ansi"
  156. function boolean DeleteDC ( ulong hdc ) library "gdi32"
  157. function int Escape ( ulong hdc, int nEscape, int cbInput, long inData, ref blob outdata ) library "gdi32"
  158. function ulong GlobalAlloc(uint uFlags, ulong dwBytes ) library "kernel32"
  159. function ulong GlobalFree ( ulong hmem ) library "kernel32"
  160. function ulong GlobalLock ( ulong hmem ) library "kernel32"
  161. function boolean GlobalUnlock (ulong hmem ) library "kernel32"
  162. function ulong GlobalSize ( ulong hem ) library "kernel32"
  163. function long PrintDlg(ref str_printdlg printdlg) library "comdlg32" alias for "PrintDlgA;Ansi"
  164. function ulong CopyMem ( ref str_devnames dest, ulong src, ulong length ) library "kernel32" alias for "RtlMoveMemory;Ansi"
  165. function ulong CopyMem ( ref blob dest, ulong src, ulong length ) library "kernel32" alias for "RtlMoveMemory"
  166. function boolean PageSetupDlg(ref str_pagesetupdlg ll ) library "comdlg32" alias for "PageSetupDlgA;Ansi"
  167. end prototypes
  168. type variables
  169. constant ulong PRINTER_ENUM_DEFAULT = 1
  170. constant ulong PRINTER_ENUM_LOCAL = 2
  171. constant ulong PRINTER_ENUM_CONNECTIONS = 4
  172. constant ulong PRINTER_ENUM_FAVORITE = 4
  173. constant ulong PRINTER_ENUM_NAME = 8
  174. constant ulong PRINTER_ENUM_REMOTE = 16
  175. constant ulong PRINTER_ENUM_SHARED = 32
  176. constant ulong PRINTER_ENUM_NETWORK = 64
  177. constant ulong PRINTER_ENUM_EXPAND = 16384
  178. constant ulong PRINTER_ENUM_CONTAINER = 32768
  179. constant ulong PRINTER_ENUM_ICONMASK = 16711680
  180. constant ulong PRINTER_ENUM_ICON1 = 65536
  181. constant ulong PRINTER_ENUM_ICON2 = 131072
  182. constant ulong PRINTER_ENUM_ICON3 = 262144
  183. constant ulong PRINTER_ENUM_ICON4 = 545288
  184. constant ulong PRINTER_ENUM_ICON5 = 1048576
  185. constant ulong PRINTER_ENUM_ICON6 = 2097152
  186. constant ulong PRINTER_ENUM_ICON7 = 4194304
  187. constant ulong PRINTER_ENUM_ICON8 = 8388608
  188. constant integer PRINTER_INFO_1_LEN = 16
  189. constant integer PRINTER_INFO_2_LEN = 84
  190. constant integer DEVMODE_LEN = 148
  191. constant ulong DM_ORIENTATION = 00000001
  192. constant ulong DM_PAPERSIZE = 00000002
  193. constant ulong DM_PAPERLENGTH = 00000004
  194. constant ulong DM_PAPERWIDTH = 00000008
  195. constant ulong DM_SCALE = 00000016
  196. constant ulong DM_COPIES = 00000256
  197. constant ulong DM_DEFAULTSOURCE = 00000512
  198. constant ulong DM_PRINTQUALITY = 000001024
  199. constant ulong DM_COLOR = 000002048
  200. constant ulong DM_DUPLEX = 00004096
  201. constant ulong DM_YRESOLUTION = 00008192
  202. constant ulong DM_TTOPTION = 000016384
  203. constant ulong DM_COLLATE = 32768
  204. constant ulong DM_FORMNAME = 65536
  205. constant ulong DM_LOGPIXELS = 131072
  206. constant ulong DM_BITSPERPEL = 262144
  207. constant ulong DM_PELSWIDTH = 524288
  208. constant ulong DM_PELSHEIGHT = 1048576
  209. constant ulong DM_DISPLAYFLAGS = 2097152
  210. constant ulong DM_DISPLAYFREQUENCY = 4194304
  211. constant ulong DM_ICMMETHOD = 8388608
  212. constant ulong DM_ICMINTENT = 16777216
  213. constant ulong DM_MEDIATYPE = 33554432
  214. constant ulong DM_DITHERTYPE = 67108864
  215. constant ulong DM_PANNINGWIDTH = 134217728
  216. constant ulong DM_PANNINGHEIGHT = 268435456
  217. /* orientation selections */
  218. constant ulong DMORIENT_PORTRAIT = 1
  219. constant ulong DMORIENT_LANDSCAPE = 2
  220. constant ulong PRINTER_ATTRIBUTE_QUEUED = 0001
  221. constant ulong PRINTER_ATTRIBUTE_DIRECT = 0002
  222. constant ulong PRINTER_ATTRIBUTE_DEFAULT = 0004
  223. constant ulong PRINTER_ATTRIBUTE_SHARED = 0008
  224. constant ulong PRINTER_ATTRIBUTE_NETWORK = 0016
  225. constant ulong PRINTER_ATTRIBUTE_HIDDEN = 0032
  226. constant ulong PRINTER_ATTRIBUTE_LOCAL = 0064
  227. constant ulong PRINTER_ATTRIBUTE_ENABLE_DEVQ = 128
  228. constant ulong PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS = 256
  229. constant ulong PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST = 512
  230. constant ulong PRINTER_ATTRIBUTE_WORK_OFFLINE = 1024
  231. constant ulong PRINTER_ATTRIBUTE_ENABLE_BIDI = 2048
  232. constant ulong PRINTER_ATTRIBUTE_RAW_ONLY = 4096
  233. constant ulong DM_IN_BUFFER = 8
  234. constant ulong DM_IN_PROMPT = 4
  235. constant ulong DM_OUT_BUFFER = 2
  236. constant ulong DM_OUT_DEFAULT = 1
  237. constant ulong DC_FIELDS = 1
  238. constant ulong DC_PAPERS = 2
  239. constant ulong DC_PAPERSIZE = 3
  240. constant ulong DC_MINEXTENT = 4
  241. constant ulong DC_MAXEXTENT = 5
  242. constant ulong DC_BINS = 6
  243. constant ulong DC_DUPLEX = 7
  244. constant ulong DC_SIZE = 8
  245. constant ulong DC_EXTRA = 9
  246. constant ulong DC_VERSION = 10
  247. constant ulong DC_DRIVER = 11
  248. constant ulong DC_BINNAMES = 12
  249. constant ulong DC_ENUMRESOLUTIONS = 13
  250. constant ulong DC_FILEDEPENDENCIES= 14
  251. constant ulong DC_TRUETYPE = 15
  252. constant ulong DC_PAPERNAMES = 16
  253. constant ulong DC_ORIENTATION = 17
  254. constant ulong DC_COPIES = 18
  255. constant uint DMPAPER_LETTER = 1 /* Letter 8 1/2 x 11 in */
  256. constant uint DMPAPER_LETTERSMALL = 2 /* Letter Small 8 1/2 x 11 in */
  257. constant uint DMPAPER_TABLOID = 3 /* Tabloid 11 x 17 in */
  258. constant uint DMPAPER_LEDGER = 4 /* Ledger 17 x 11 in */
  259. constant uint DMPAPER_LEGAL = 5 /* Legal 8 1/2 x 14 in */
  260. constant uint DMPAPER_STATEMENT = 6 /* Statement 5 1/2 x 8 1/2 in */
  261. constant uint DMPAPER_EXECUTIVE = 7 /* Executive 7 1/4 x 10 1/2 in */
  262. constant uint DMPAPER_A3 = 8 /* A3 297 x 420 mm */
  263. constant uint DMPAPER_A4 = 9 /* A4 210 x 297 mm */
  264. constant uint DMPAPER_A4SMALL = 10 /* A4 Small 210 x 297 mm */
  265. constant uint DMPAPER_A5 = 11 /* A5 148 x 210 mm */
  266. constant uint DMPAPER_B4 = 12 /* B4 (JIS) 250 x 354 */
  267. constant uint DMPAPER_B5 = 13 /* B5 (JIS) 182 x 257 mm */
  268. constant uint DMPAPER_FOLIO = 14 /* Folio 8 1/2 x 13 in */
  269. constant uint DMPAPER_QUARTO = 15 /* Quarto 215 x 275 mm */
  270. constant uint DMPAPER_10X14 = 16 /* 10x14 in */
  271. constant uint DMPAPER_11X17 = 17 /* 11x17 in */
  272. constant uint DMPAPER_NOTE = 18 /* Note 8 1/2 x 11 in */
  273. constant uint DMPAPER_ENV_9 = 19 /* Envelope #9 3 7/8 x 8 7/8 */
  274. constant uint DMPAPER_ENV_10 = 20 /* Envelope #10 4 1/8 x 9 1/2 */
  275. constant uint DMPAPER_ENV_11 = 21 /* Envelope #11 4 1/2 x 10 3/8 */
  276. constant uint DMPAPER_ENV_12 = 22 /* Envelope #12 4 \276 x 11 */
  277. constant uint DMPAPER_ENV_14 = 23 /* Envelope #14 5 x 11 1/2 */
  278. constant uint DMPAPER_CSHEET = 24 /* C size sheet */
  279. constant uint DMPAPER_DSHEET = 25 /* D size sheet */
  280. constant uint DMPAPER_ESHEET = 26 /* E size sheet */
  281. constant uint DMPAPER_ENV_DL = 27 /* Envelope DL 110 x 220mm */
  282. constant uint DMPAPER_ENV_C5 = 28 /* Envelope C5 162 x 229 mm */
  283. constant uint DMPAPER_ENV_C3 = 29 /* Envelope C3 324 x 458 mm */
  284. constant uint DMPAPER_ENV_C4 = 30 /* Envelope C4 229 x 324 mm */
  285. constant uint DMPAPER_ENV_C6 = 31 /* Envelope C6 114 x 162 mm */
  286. constant uint DMPAPER_ENV_C65 = 32 /* Envelope C65 114 x 229 mm */
  287. constant uint DMPAPER_ENV_B4 = 33 /* Envelope B4 250 x 353 mm */
  288. constant uint DMPAPER_ENV_B5 = 34 /* Envelope B5 176 x 250 mm */
  289. constant uint DMPAPER_ENV_B6 = 35 /* Envelope B6 176 x 125 mm */
  290. constant uint DMPAPER_ENV_ITALY = 36 /* Envelope 110 x 230 mm */
  291. constant uint DMPAPER_ENV_MONARCH = 37 /* Envelope Monarch 3.875 x 7.5 in */
  292. constant uint DMPAPER_ENV_PERSONAL = 38 /* 6 3/4 Envelope 3 5/8 x 6 1/2 in */
  293. constant uint DMPAPER_FANFOLD_US = 39 /* US Std Fanfold 14 7/8 x 11 in */
  294. constant uint DMPAPER_FANFOLD_STD_GERMAN = 40 /* German Std Fanfold 8 1/2 x 12 in */
  295. constant uint DMPAPER_FANFOLD_LGL_GERMAN = 41 /* German Legal Fanfold 8 1/2 x 13 in */
  296. constant uint DMPAPER_ISO_B4 = 42 /* B4 (ISO) 250 x 353 mm */
  297. constant uint DMPAPER_JAPANESE_POSTCARD = 43 /* Japanese Postcard 100 x 148 mm */
  298. constant uint DMPAPER_9X11 = 44 /* 9 x 11 in */
  299. constant uint DMPAPER_10X11 = 45 /* 10 x 11 in */
  300. constant uint DMPAPER_15X11 = 46 /* 15 x 11 in */
  301. constant uint DMPAPER_ENV_INVITE = 47 /* Envelope Invite 220 x 220 mm */
  302. constant uint DMPAPER_RESERVED_48 = 48 /* RESERVED--DO NOT USE */
  303. constant uint DMPAPER_RESERVED_49 = 49 /* RESERVED--DO NOT USE */
  304. constant uint DMPAPER_LETTER_EXTRA = 50 /* Letter Extra 9 \275 x 12 in */
  305. constant uint DMPAPER_LEGAL_EXTRA = 51 /* Legal Extra 9 \275 x 15 in */
  306. constant uint DMPAPER_TABLOID_EXTRA = 52 /* Tabloid Extra 11.69 x 18 in */
  307. constant uint DMPAPER_A4_EXTRA = 53 /* A4 Extra 9.27 x 12.69 in */
  308. constant uint DMPAPER_LETTER_TRANSVERSE = 54 /* Letter Transverse 8 \275 x 11 in */
  309. constant uint DMPAPER_A4_TRANSVERSE = 55 /* A4 Transverse 210 x 297 mm */
  310. constant uint DMPAPER_LETTER_EXTRA_TRANSVERSE =56 /* Letter Extra Transverse 9\275 x 12 in */
  311. constant uint DMPAPER_A_PLUS = 57 /* SuperA/SuperA/A4 227 x 356 mm */
  312. constant uint DMPAPER_B_PLUS = 58 /* SuperB/SuperB/A3 305 x 487 mm */
  313. constant uint DMPAPER_LETTER_PLUS = 59 /* Letter Plus 8.5 x 12.69 in */
  314. constant uint DMPAPER_A4_PLUS = 60 /* A4 Plus 210 x 330 mm */
  315. constant uint DMPAPER_A5_TRANSVERSE = 61 /* A5 Transverse 148 x 210 mm */
  316. constant uint DMPAPER_B5_TRANSVERSE = 62 /* B5 (JIS) Transverse 182 x 257 mm */
  317. constant uint DMPAPER_A3_EXTRA = 63 /* A3 Extra 322 x 445 mm */
  318. constant uint DMPAPER_A5_EXTRA = 64 /* A5 Extra 174 x 235 mm */
  319. constant uint DMPAPER_B5_EXTRA = 65 /* B5 (ISO) Extra 201 x 276 mm */
  320. constant uint DMPAPER_A2 = 66 /* A2 420 x 594 mm */
  321. constant uint DMPAPER_A3_TRANSVERSE = 67 /* A3 Transverse 297 x 420 mm */
  322. constant uint DMPAPER_A3_EXTRA_TRANSVERSE = 68 /* A3 Extra Transverse 322 x 445 mm */
  323. constant uint DMPAPER_USER = 256
  324. constant uint GMEM_MOVEABLE = 2
  325. constant int PRINTDLG_LEN = 66
  326. constant ulong PD_ALLPAGES = 000000
  327. constant ulong PD_SELECTION = 000001
  328. constant ulong PD_PAGENUMS = 000002
  329. constant ulong PD_NOSELECTION = 000004
  330. constant ulong PD_NOPAGENUMS = 000008
  331. constant ulong PD_COLLATE = 000016
  332. constant ulong PD_PRINTTOFILE = 000032
  333. constant ulong PD_PRINTSETUP = 000064
  334. constant ulong PD_NOWARNING = 0000128
  335. constant ulong PD_RETURNDC = 256
  336. constant ulong PD_RETURNIC = 512
  337. constant ulong PD_RETURNDEFAULT = 1024
  338. constant ulong PD_SHOWHELP = 2048
  339. constant ulong PD_ENABLEPRINTHOOK = 4096
  340. constant ulong PD_ENABLESETUPHOOK = 8192
  341. constant ulong PD_ENABLEPRINTTEMPLATE = 16384
  342. constant ulong PD_ENABLESETUPTEMPLATE = 32768
  343. constant ulong PD_ENABLEPRINTTEMPLATEHANDLE = 65536
  344. constant ulong PD_ENABLESETUPTEMPLATEHANDLE = 131072
  345. constant ulong PD_USEDEVMODECOPIES = 262144
  346. constant ulong PD_USEDEVMODECOPIESANDCOLLATE = 524288
  347. constant ulong PD_DISABLEPRINTTOFILE = 1048576
  348. constant ulong PD_HIDEPRINTTOFILE = 2097152
  349. constant ulong PD_NONETWORKBUTTON = 4194304
  350. constant int DEVNAMES_LEN = 32 * 3 +8
  351. constant ulong PSD_DEFAULTMINMARGINS = 0000000 // default (printer's)
  352. constant ulong PSD_INWININIINTLMEASURE = 0000000 // 1st of 4 possible
  353. constant ulong PSD_MINMARGINS = 0000001 // use caller's
  354. constant ulong PSD_MARGINS = 0000002 // use caller's
  355. constant ulong PSD_INTHOUSANDTHSOFINCHES = 0000004 // 2nd of 4 possible
  356. constant ulong PSD_INHUNDREDTHSOFMILLIMETERS = 0000008 // 3rd of 4 possible
  357. constant ulong PSD_DISABLEMARGINS = 16
  358. constant ulong PSD_DISABLEPRINTER = 32
  359. constant ulong PSD_NOWARNING = 128 // must be same as PD_*
  360. constant ulong PSD_DISABLEORIENTATION = 256
  361. constant ulong PSD_RETURNDEFAULT = 1024 // must be same as PD_*
  362. constant ulong PSD_DISABLEPAPER = 512
  363. constant ulong PSD_SHOWHELP = 2048 // must be same as PD_*
  364. constant ulong PSD_ENABLEPAGESETUPHOOK = 8192 // must be same as PD_*
  365. constant ulong PSD_ENABLEPAGESETUPTEMPLATE = 32768 // must be same as PD_*
  366. constant ulong PSD_ENABLEPAGESETUPTEMPLATEHANDLE = 131072 // must be same as PD_*
  367. constant ulong PSD_ENABLEPAGEPAINTHOOK = 262144
  368. constant ulong PSD_DISABLEPAGEPAINTING = 524288
  369. constant ulong PSD_NONETWORKBUTTON = 2097152 // must be same as PD_*
  370. constant int PAGESETUPDLG_LEN = 84
  371. end variables
  372. forward prototypes
  373. public function integer of_getprinterlist (ref string printerlist[])
  374. public function integer of_direct (string PrinterName, string data)
  375. public function integer of_printer (string printername, integer command, ref any outpara, ref integer papersize, ref integer paperwidth, ref integer paperlength)
  376. public function string of_getdrivername (string PrinterName)
  377. public function string of_getportname (string printername)
  378. public function int of_getattribute (string printername)
  379. public function long of_getstatus (string printername)
  380. public function integer of_getpapersize (string printername, ref integer papersize, ref integer paperwidth, ref integer paperheight)
  381. public function string of_getpbprinter ()
  382. public function integer of_setdefault (string printername)
  383. private function string of_getstringfromblob (blob source, integer offset)
  384. private function integer of_modifyprinter (string printername, str_devmode devmode)
  385. public function integer of_printsetup (unsignedlong hwnd)
  386. public function integer of_setpapersize (string printername, integer papersize, integer paperwidth, integer paperheight)
  387. public function integer of_pagesetup (unsignedlong hwnd, ref long left, ref long right, ref long top, ref long bottom)
  388. end prototypes
  389. public function integer of_getprinterlist (ref string printerlist[]);// 取打印机列表
  390. // 在printerlist[]中返回
  391. // 返回值为打印机个数,返回-1,错误
  392. integer li_Count , li_Size, li_i
  393. String ls_Name
  394. Blob lbl_buffer, lbl_tmp ,lbl_buffer_net
  395. ulong ll_cbNeeded, ll_Returned,ll_Returned_net
  396. str_Printer_info_2 lstr_info
  397. li_Size = 1
  398. l_GetPrinter:
  399. lbl_buffer = Blob ( Space ( li_size ) )
  400. SetNull ( ls_Name )
  401. If Not EnumPrinters( PRINTER_ENUM_LOCAL, ls_Name, 2, ref lbl_buffer, li_size, ll_cbNeeded, ll_Returned ) Then
  402. If li_size < ll_cbNeeded Then
  403. li_size = ll_cbNeeded
  404. Goto l_GetPrinter
  405. Else
  406. Return -1
  407. End If
  408. End If
  409. // cjh -020728
  410. l_GetPrinter_net:
  411. lbl_buffer_net = Blob ( Space ( li_size ) )
  412. SetNull ( ls_Name )
  413. If Not EnumPrinters( PRINTER_ENUM_CONNECTIONS, ls_Name, 2, ref lbl_buffer_net, li_size, ll_cbNeeded, ll_Returned_net ) Then
  414. If li_size < ll_cbNeeded Then
  415. li_size = ll_cbNeeded
  416. Goto l_GetPrinter_net
  417. Else
  418. Return -1
  419. End If
  420. End If
  421. string ls_desc, ls_pname, ls_comment
  422. For li_i = 1 To integer ( ll_Returned )+integer ( ll_Returned_net )
  423. lbl_tmp = BlobMid ( lbl_buffer, (li_i -1 ) * PRINTER_INFO_2_LEN + 1 )
  424. CopyMem ( lstr_info, lbl_tmp, PRINTER_INFO_2_LEN )
  425. printerlist [ li_i ] = String ( lstr_info.PrinterName, "address" )
  426. ls_pname = string ( lstr_info.PortName, "address" )
  427. Next
  428. For li_i =integer ( ll_Returned )+1 To integer ( ll_Returned )+integer ( ll_Returned_net )
  429. lbl_tmp = BlobMid ( lbl_buffer_net, (li_i -1 - integer ( ll_Returned )) * PRINTER_INFO_2_LEN + 1 )
  430. CopyMem ( lstr_info, lbl_tmp, PRINTER_INFO_2_LEN )
  431. printerlist [ li_i ] = String ( lstr_info.PrinterName, "address" )
  432. ls_pname = string ( lstr_info.PortName, "address" )
  433. Next
  434. Return Integer ( ll_Returned )+integer ( ll_Returned_net )
  435. // cjh -020728
  436. end function
  437. public function integer of_direct (string PrinterName, string data);// 绕过windows直接向打印机发送字符
  438. // PrinterName: 打印机名称
  439. // data: 需要发送的数据
  440. // 返回: 1 = 成功, 2 = 失败
  441. ulong ll_handle
  442. // 建立打印机handle
  443. ll_handle = CreateDC ( 0, PrinterName, 0, 0 )
  444. DeleteDC ( ll_handle )
  445. Return 1
  446. end function
  447. public function integer of_printer (string printername, integer command, ref any outpara, ref integer papersize, ref integer paperwidth, ref integer paperlength);// 与打印机有关的操作
  448. // PrinterName:打印机名称
  449. // Command:命令
  450. // =1: 取打印机驱动名称
  451. // = 2: 取打印机端口名称
  452. // = 3: 取打印机状态
  453. // = 4: 取打印机属性
  454. // = 5: 取打印机纸张
  455. // = 6: 取打印机自定义纸张的大小
  456. // = 7: 取打印方向
  457. // = 8: 设置为缺省打印机
  458. // = 101: 设置打印机的纸张
  459. // = 102: 将打印机设为自定义纸张并设定自定义纸张的大小
  460. // = 103: 设置打印方向
  461. // outpara: 1,2,3,4, 打印机参数由此返回
  462. // papersize: 打印纸大小
  463. // pagerwidth, pagerheight:自定义打印纸尺
  464. // 取得打印机打印纸
  465. // return 1: 成功
  466. // return -1: 不成功
  467. str_Printer_info_2 lstr_info
  468. str_Printer_defaults lstr_default
  469. str_devmode lstr_devmode
  470. Integer li_rc, li_i
  471. string ls_DriverName, ls_PortName
  472. ulong ll_handle, ll_cbbuf, ll_cbNeeded
  473. blob lbl_buffer
  474. // 打开打印机
  475. If Not OpenPrinter ( printername, ll_handle, ref lstr_default ) Then Return -1
  476. ll_cbbuf = 0
  477. // 取打印机驱动名称
  478. ll_cbBuf = 0
  479. l_SetBuffer:
  480. lbl_buffer = Blob ( Space ( ll_cbBuf ) )
  481. If Not GetPrinter ( ll_handle, 2, ref lbl_buffer, ll_cbBuf, ll_cbNeeded ) Then
  482. If ll_cbNeeded > ll_cbBuf Then
  483. ll_cbBuf = ll_cbNeeded
  484. Goto l_SetBuffer
  485. Else
  486. Return -1
  487. End If
  488. End If
  489. // copy 至结构
  490. CopyMem ( lstr_info, lbl_buffer, PRINTER_INFO_2_LEN )
  491. // 驱动名、端口
  492. ls_DriverName = String ( lstr_info.DriverName, "address" )
  493. ls_PortName = String ( lstr_info.PortName, "address" )
  494. Choose Case Command
  495. Case 1
  496. // 驱动名称
  497. OutPara = ls_DriverName
  498. li_rc = 1
  499. Goto l_quit
  500. Case 2
  501. // 端口名称
  502. OutPara = ls_PortName
  503. li_rc = 1
  504. Goto l_quit
  505. Case 3
  506. // 打印机状态
  507. OutPara = lstr_info.Status
  508. li_rc = 1
  509. Goto l_quit
  510. Case 4
  511. // 打印机属性
  512. OutPara = lstr_info.Attributes
  513. li_rc = 1
  514. Goto l_quit
  515. Case 5,6
  516. // 打印纸大小
  517. CopyMem ( lstr_devmode, lstr_info.DevMode, DEVMODE_LEN )
  518. papersize = lstr_devMode.dmPaperSize
  519. paperwidth = lstr_devMode.dmPaperWidth
  520. paperlength = lstr_devMode.dmPaperLength
  521. li_rc = 1
  522. Goto l_quit
  523. Case 7
  524. // 打印方向
  525. CopyMem ( lstr_devmode, lstr_info.DevMode, DEVMODE_LEN )
  526. OutPara = lstr_devMode.dmOrientation
  527. li_rc = 1
  528. Goto l_quit
  529. Case 105
  530. // 设置为缺省打印机
  531. lstr_info.Attributes += PRINTER_ATTRIBUTE_DEFAULT
  532. CopyMem ( lbl_buffer, lstr_info, PRINTER_INFO_2_LEN )
  533. If SetPrinter ( ll_handle , 2, lbl_buffer, 0 ) Then
  534. li_rc = 1
  535. Else
  536. li_rc = -1
  537. end If
  538. Goto l_quit
  539. End Choose
  540. If Command = 101 Or Command = 102 Then
  541. // 取打印机支持的纸张
  542. SetNull ( lbl_buffer )
  543. ll_cbbuf = DeviceCapabilities ( printername, ls_PortName, DC_PAPERS, 0, 0 )
  544. lbl_buffer = Blob ( Space ( 1024 ) ) // ll_cbbuf ) )
  545. ll_cbbuf = DeviceCapabilities ( PrinterName, ls_PortName, DC_PAPERS, lbl_buffer, 0 )
  546. If ll_cbbuf < 0 Then Return -1
  547. // 检查是否支持用户指定纸张
  548. For li_i =1 To Integer ( ll_cbbuf )
  549. If integer ( BlobMid ( lbl_buffer, ( li_i - 1 ) * 2 + 1, 2 ) ) = papersize Then Exit
  550. Next
  551. If li_i > Integer ( ll_cbbuf ) Then
  552. // 不支持自定久纸张
  553. Return -1
  554. End If
  555. End If
  556. // 取需要的空间
  557. ll_cbbuf =DocumentProperties ( 0, ll_handle, ls_DriverName, ref lbl_buffer, 0 , 0 )
  558. If ll_cbbuf < 0 Then
  559. li_rc = -1
  560. Goto l_quit
  561. End If
  562. // 分配空间
  563. lbl_buffer = Blob ( Space ( ll_cbbuf ) )
  564. li_rc = DocumentProperties ( 0, ll_handle, ls_DriverName, ref lbl_buffer, 0, DM_OUT_BUFFER )
  565. CopyMem ( lstr_devmode, lbl_buffer, DEVMODE_LEN )
  566. Choose Case command
  567. Case 101,102
  568. lstr_devMode.dmPaperSize = papersize
  569. lstr_devMode.dmFields = DM_PAPERSIZE
  570. If PaperSize = DMPAPER_USER Then
  571. lstr_devMode.dmPaperWidth = paperwidth
  572. lstr_devMode.dmPaperLength = paperlength
  573. lstr_devMode.dmFields += DM_PAPERLENGTH + DM_PAPERWIDTH
  574. End If
  575. Case 103
  576. lstr_devMode.dmOrientation = outpara
  577. lstr_devMode.dmFields = DM_ORIENTATION
  578. End Choose
  579. li_rc = DocumentProperties ( 0, ll_handle, ls_DriverName, 0, lstr_devmode, DM_IN_BUFFER + DM_OUT_DEFAULT )
  580. If li_rc > 0 Then li_rc = 1
  581. l_quit:
  582. ClosePrinter ( ll_handle )
  583. Return li_rc
  584. end function
  585. public function string of_getdrivername (string PrinterName);// 取打印机驱动程序名称
  586. String ls_Driver
  587. Integer li_1, li_2, li_3, li_rc
  588. Any la_para
  589. li_rc = of_Printer ( PrinterName, 1, la_para, li_1, li_2, li_3 )
  590. If li_rc = 1 Then
  591. ls_Driver = String ( la_para )
  592. Else
  593. ls_Driver = ''
  594. End If
  595. Return ls_Driver
  596. end function
  597. public function string of_getportname (string printername);// 取打印机端口名称
  598. String ls_port
  599. Integer li_1, li_2, li_3, li_rc
  600. Any la_para
  601. li_rc = of_Printer ( PrinterName, 2, la_para, li_1, li_2, li_3 )
  602. If li_rc = 1 Then
  603. ls_port = String ( la_para )
  604. Else
  605. ls_port = ''
  606. End If
  607. Return ls_port
  608. end function
  609. public function int of_getattribute (string printername);// 取打印机属性,下为打印机属性定义
  610. /*
  611. #define PRINTER_ATTRIBUTE_QUEUED 0x00000001
  612. #define PRINTER_ATTRIBUTE_DIRECT 0x00000002
  613. #define PRINTER_ATTRIBUTE_DEFAULT 0x00000004
  614. #define PRINTER_ATTRIBUTE_SHARED 0x00000008
  615. #define PRINTER_ATTRIBUTE_NETWORK 0x00000010
  616. #define PRINTER_ATTRIBUTE_HIDDEN 0x00000020
  617. #define PRINTER_ATTRIBUTE_LOCAL 0x00000040
  618. #define PRINTER_ATTRIBUTE_ENABLE_DEVQ 0x00000080
  619. #define PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS 0x00000100
  620. #define PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST 0x00000200
  621. #define PRINTER_ATTRIBUTE_WORK_OFFLINE 0x00000400
  622. #define PRINTER_ATTRIBUTE_ENABLE_BIDI 0x00000800
  623. #define PRINTER_ATTRIBUTE_RAW_ONLY 0x00001000
  624. #define PRINTER_ATTRIBUTE_PUBLISHED 0x00002000
  625. */
  626. int li_attrib
  627. Integer li_1, li_2, li_3, li_rc
  628. Any la_para
  629. li_rc = of_Printer ( PrinterName, 2, la_para, li_1, li_2, li_3 )
  630. If li_rc = 1 Then
  631. li_attrib = la_para
  632. Else
  633. li_attrib = -1
  634. End If
  635. Return li_attrib
  636. end function
  637. public function long of_getstatus (string printername);// 取打印机状态,下为打印机状态定义
  638. /*
  639. #define PRINTER_STATUS_PAUSED 0x00000001
  640. #define PRINTER_STATUS_ERROR 0x00000002
  641. #define PRINTER_STATUS_PENDING_DELETION 0x00000004
  642. #define PRINTER_STATUS_PAPER_JAM 0x00000008
  643. #define PRINTER_STATUS_PAPER_OUT 0x00000010
  644. #define PRINTER_STATUS_MANUAL_FEED 0x00000020
  645. #define PRINTER_STATUS_PAPER_PROBLEM 0x00000040
  646. #define PRINTER_STATUS_OFFLINE 0x00000080
  647. #define PRINTER_STATUS_IO_ACTIVE 0x00000100
  648. #define PRINTER_STATUS_BUSY 0x00000200
  649. #define PRINTER_STATUS_PRINTING 0x00000400
  650. #define PRINTER_STATUS_OUTPUT_BIN_FULL 0x00000800
  651. #define PRINTER_STATUS_NOT_AVAILABLE 0x00001000
  652. #define PRINTER_STATUS_WAITING 0x00002000
  653. #define PRINTER_STATUS_PROCESSING 0x00004000
  654. #define PRINTER_STATUS_INITIALIZING 0x00008000
  655. #define PRINTER_STATUS_WARMING_UP 0x00010000
  656. #define PRINTER_STATUS_TONER_LOW 0x00020000
  657. #define PRINTER_STATUS_NO_TONER 0x00040000
  658. #define PRINTER_STATUS_PAGE_PUNT 0x00080000
  659. #define PRINTER_STATUS_USER_INTERVENTION 0x00100000
  660. #define PRINTER_STATUS_OUT_OF_MEMORY 0x00200000
  661. #define PRINTER_STATUS_DOOR_OPEN 0x00400000
  662. #define PRINTER_STATUS_SERVER_UNKNOWN 0x00800000
  663. #define PRINTER_STATUS_POWER_SAVE 0x01000000
  664. */
  665. long ll_status
  666. Integer li_1, li_2, li_3, li_rc
  667. Any la_para
  668. li_rc = of_Printer ( PrinterName, 3, la_para, li_1, li_2, li_3 )
  669. If li_rc = 1 Then
  670. ll_status = la_para
  671. Else
  672. ll_status = -1
  673. End If
  674. Return ll_status
  675. end function
  676. public function integer of_getpapersize (string printername, ref integer papersize, ref integer paperwidth, ref integer paperheight);// 取打印机纸张大小
  677. /* 打印机尺寸定义
  678. #define DMPAPER_LETTER 1 /* Letter 8 1/2 x 11 in */
  679. #define DMPAPER_LETTERSMALL 2 /* Letter Small 8 1/2 x 11 in */
  680. #define DMPAPER_TABLOID 3 /* Tabloid 11 x 17 in */
  681. #define DMPAPER_LEDGER 4 /* Ledger 17 x 11 in */
  682. #define DMPAPER_LEGAL 5 /* Legal 8 1/2 x 14 in */
  683. #define DMPAPER_STATEMENT 6 /* Statement 5 1/2 x 8 1/2 in */
  684. #define DMPAPER_EXECUTIVE 7 /* Executive 7 1/4 x 10 1/2 in */
  685. #define DMPAPER_A3 8 /* A3 297 x 420 mm */
  686. #define DMPAPER_A4 9 /* A4 210 x 297 mm */
  687. #define DMPAPER_A4SMALL 10 /* A4 Small 210 x 297 mm */
  688. #define DMPAPER_A5 11 /* A5 148 x 210 mm */
  689. #define DMPAPER_B4 12 /* B4 (JIS) 250 x 354 */
  690. #define DMPAPER_B5 13 /* B5 (JIS) 182 x 257 mm */
  691. #define DMPAPER_FOLIO 14 /* Folio 8 1/2 x 13 in */
  692. #define DMPAPER_QUARTO 15 /* Quarto 215 x 275 mm */
  693. #define DMPAPER_10X14 16 /* 10x14 in */
  694. #define DMPAPER_11X17 17 /* 11x17 in */
  695. #define DMPAPER_NOTE 18 /* Note 8 1/2 x 11 in */
  696. #define DMPAPER_ENV_9 19 /* Envelope #9 3 7/8 x 8 7/8 */
  697. #define DMPAPER_ENV_10 20 /* Envelope #10 4 1/8 x 9 1/2 */
  698. #define DMPAPER_ENV_11 21 /* Envelope #11 4 1/2 x 10 3/8 */
  699. #define DMPAPER_ENV_12 22 /* Envelope #12 4 \276 x 11 */
  700. #define DMPAPER_ENV_14 23 /* Envelope #14 5 x 11 1/2 */
  701. #define DMPAPER_CSHEET 24 /* C size sheet */
  702. #define DMPAPER_DSHEET 25 /* D size sheet */
  703. #define DMPAPER_ESHEET 26 /* E size sheet */
  704. #define DMPAPER_ENV_DL 27 /* Envelope DL 110 x 220mm */
  705. #define DMPAPER_ENV_C5 28 /* Envelope C5 162 x 229 mm */
  706. #define DMPAPER_ENV_C3 29 /* Envelope C3 324 x 458 mm */
  707. #define DMPAPER_ENV_C4 30 /* Envelope C4 229 x 324 mm */
  708. #define DMPAPER_ENV_C6 31 /* Envelope C6 114 x 162 mm */
  709. #define DMPAPER_ENV_C65 32 /* Envelope C65 114 x 229 mm */
  710. #define DMPAPER_ENV_B4 33 /* Envelope B4 250 x 353 mm */
  711. #define DMPAPER_ENV_B5 34 /* Envelope B5 176 x 250 mm */
  712. #define DMPAPER_ENV_B6 35 /* Envelope B6 176 x 125 mm */
  713. #define DMPAPER_ENV_ITALY 36 /* Envelope 110 x 230 mm */
  714. #define DMPAPER_ENV_MONARCH 37 /* Envelope Monarch 3.875 x 7.5 in */
  715. #define DMPAPER_ENV_PERSONAL 38 /* 6 3/4 Envelope 3 5/8 x 6 1/2 in */
  716. #define DMPAPER_FANFOLD_US 39 /* US Std Fanfold 14 7/8 x 11 in */
  717. #define DMPAPER_FANFOLD_STD_GERMAN 40 /* German Std Fanfold 8 1/2 x 12 in */
  718. #define DMPAPER_FANFOLD_LGL_GERMAN 41 /* German Legal Fanfold 8 1/2 x 13 in */
  719. #if(WINVER >= 0x0400)
  720. #define DMPAPER_ISO_B4 42 /* B4 (ISO) 250 x 353 mm */
  721. #define DMPAPER_JAPANESE_POSTCARD 43 /* Japanese Postcard 100 x 148 mm */
  722. #define DMPAPER_9X11 44 /* 9 x 11 in */
  723. #define DMPAPER_10X11 45 /* 10 x 11 in */
  724. #define DMPAPER_15X11 46 /* 15 x 11 in */
  725. #define DMPAPER_ENV_INVITE 47 /* Envelope Invite 220 x 220 mm */
  726. #define DMPAPER_RESERVED_48 48 /* RESERVED--DO NOT USE */
  727. #define DMPAPER_RESERVED_49 49 /* RESERVED--DO NOT USE */
  728. #define DMPAPER_LETTER_EXTRA 50 /* Letter Extra 9 \275 x 12 in */
  729. #define DMPAPER_LEGAL_EXTRA 51 /* Legal Extra 9 \275 x 15 in */
  730. #define DMPAPER_TABLOID_EXTRA 52 /* Tabloid Extra 11.69 x 18 in */
  731. #define DMPAPER_A4_EXTRA 53 /* A4 Extra 9.27 x 12.69 in */
  732. #define DMPAPER_LETTER_TRANSVERSE 54 /* Letter Transverse 8 \275 x 11 in */
  733. #define DMPAPER_A4_TRANSVERSE 55 /* A4 Transverse 210 x 297 mm */
  734. #define DMPAPER_LETTER_EXTRA_TRANSVERSE 56 /* Letter Extra Transverse 9\275 x 12 in */
  735. #define DMPAPER_A_PLUS 57 /* SuperA/SuperA/A4 227 x 356 mm */
  736. #define DMPAPER_B_PLUS 58 /* SuperB/SuperB/A3 305 x 487 mm */
  737. #define DMPAPER_LETTER_PLUS 59 /* Letter Plus 8.5 x 12.69 in */
  738. #define DMPAPER_A4_PLUS 60 /* A4 Plus 210 x 330 mm */
  739. #define DMPAPER_A5_TRANSVERSE 61 /* A5 Transverse 148 x 210 mm */
  740. #define DMPAPER_B5_TRANSVERSE 62 /* B5 (JIS) Transverse 182 x 257 mm */
  741. #define DMPAPER_A3_EXTRA 63 /* A3 Extra 322 x 445 mm */
  742. #define DMPAPER_A5_EXTRA 64 /* A5 Extra 174 x 235 mm */
  743. #define DMPAPER_B5_EXTRA 65 /* B5 (ISO) Extra 201 x 276 mm */
  744. #define DMPAPER_A2 66 /* A2 420 x 594 mm */
  745. #define DMPAPER_A3_TRANSVERSE 67 /* A3 Transverse 297 x 420 mm */
  746. #define DMPAPER_A3_EXTRA_TRANSVERSE 68 /* A3 Extra Transverse 322 x 445 mm */
  747. #endif /* WINVER >= 0x0400 */
  748. #if(WINVER >= 0x0500)
  749. #define DMPAPER_DBL_JAPANESE_POSTCARD 69 /* Japanese Double Postcard 200 x 148 mm */
  750. #define DMPAPER_A6 70 /* A6 105 x 148 mm */
  751. #define DMPAPER_JENV_KAKU2 71 /* Japanese Envelope Kaku #2 */
  752. #define DMPAPER_JENV_KAKU3 72 /* Japanese Envelope Kaku #3 */
  753. #define DMPAPER_JENV_CHOU3 73 /* Japanese Envelope Chou #3 */
  754. #define DMPAPER_JENV_CHOU4 74 /* Japanese Envelope Chou #4 */
  755. #define DMPAPER_LETTER_ROTATED 75 /* Letter Rotated 11 x 8 1/2 11 in */
  756. #define DMPAPER_A3_ROTATED 76 /* A3 Rotated 420 x 297 mm */
  757. #define DMPAPER_A4_ROTATED 77 /* A4 Rotated 297 x 210 mm */
  758. #define DMPAPER_A5_ROTATED 78 /* A5 Rotated 210 x 148 mm */
  759. #define DMPAPER_B4_JIS_ROTATED 79 /* B4 (JIS) Rotated 364 x 257 mm */
  760. #define DMPAPER_B5_JIS_ROTATED 80 /* B5 (JIS) Rotated 257 x 182 mm */
  761. #define DMPAPER_JAPANESE_POSTCARD_ROTATED 81 /* Japanese Postcard Rotated 148 x 100 mm */
  762. #define DMPAPER_DBL_JAPANESE_POSTCARD_ROTATED 82 /* Double Japanese Postcard Rotated 148 x 200 mm */
  763. #define DMPAPER_A6_ROTATED 83 /* A6 Rotated 148 x 105 mm */
  764. #define DMPAPER_JENV_KAKU2_ROTATED 84 /* Japanese Envelope Kaku #2 Rotated */
  765. #define DMPAPER_JENV_KAKU3_ROTATED 85 /* Japanese Envelope Kaku #3 Rotated */
  766. #define DMPAPER_JENV_CHOU3_ROTATED 86 /* Japanese Envelope Chou #3 Rotated */
  767. #define DMPAPER_JENV_CHOU4_ROTATED 87 /* Japanese Envelope Chou #4 Rotated */
  768. #define DMPAPER_B6_JIS 88 /* B6 (JIS) 128 x 182 mm */
  769. #define DMPAPER_B6_JIS_ROTATED 89 /* B6 (JIS) Rotated 182 x 128 mm */
  770. #define DMPAPER_12X11 90 /* 12 x 11 in */
  771. #define DMPAPER_JENV_YOU4 91 /* Japanese Envelope You #4 */
  772. #define DMPAPER_JENV_YOU4_ROTATED 92 /* Japanese Envelope You #4 Rotated*/
  773. #define DMPAPER_P16K 93 /* PRC 16K 146 x 215 mm */
  774. #define DMPAPER_P32K 94 /* PRC 32K 97 x 151 mm */
  775. #define DMPAPER_P32KBIG 95 /* PRC 32K(Big) 97 x 151 mm */
  776. #define DMPAPER_PENV_1 96 /* PRC Envelope #1 102 x 165 mm */
  777. #define DMPAPER_PENV_2 97 /* PRC Envelope #2 102 x 176 mm */
  778. #define DMPAPER_PENV_3 98 /* PRC Envelope #3 125 x 176 mm */
  779. #define DMPAPER_PENV_4 99 /* PRC Envelope #4 110 x 208 mm */
  780. #define DMPAPER_PENV_5 100 /* PRC Envelope #5 110 x 220 mm */
  781. #define DMPAPER_PENV_6 101 /* PRC Envelope #6 120 x 230 mm */
  782. #define DMPAPER_PENV_7 102 /* PRC Envelope #7 160 x 230 mm */
  783. #define DMPAPER_PENV_8 103 /* PRC Envelope #8 120 x 309 mm */
  784. #define DMPAPER_PENV_9 104 /* PRC Envelope #9 229 x 324 mm */
  785. #define DMPAPER_PENV_10 105 /* PRC Envelope #10 324 x 458 mm */
  786. #define DMPAPER_P16K_ROTATED 106 /* PRC 16K Rotated */
  787. #define DMPAPER_P32K_ROTATED 107 /* PRC 32K Rotated */
  788. #define DMPAPER_P32KBIG_ROTATED 108 /* PRC 32K(Big) Rotated */
  789. #define DMPAPER_PENV_1_ROTATED 109 /* PRC Envelope #1 Rotated 165 x 102 mm */
  790. #define DMPAPER_PENV_2_ROTATED 110 /* PRC Envelope #2 Rotated 176 x 102 mm */
  791. #define DMPAPER_PENV_3_ROTATED 111 /* PRC Envelope #3 Rotated 176 x 125 mm */
  792. #define DMPAPER_PENV_4_ROTATED 112 /* PRC Envelope #4 Rotated 208 x 110 mm */
  793. #define DMPAPER_PENV_5_ROTATED 113 /* PRC Envelope #5 Rotated 220 x 110 mm */
  794. #define DMPAPER_PENV_6_ROTATED 114 /* PRC Envelope #6 Rotated 230 x 120 mm */
  795. #define DMPAPER_PENV_7_ROTATED 115 /* PRC Envelope #7 Rotated 230 x 160 mm */
  796. #define DMPAPER_PENV_8_ROTATED 116 /* PRC Envelope #8 Rotated 309 x 120 mm */
  797. #define DMPAPER_PENV_9_ROTATED 117 /* PRC Envelope #9 Rotated 324 x 229 mm */
  798. #define DMPAPER_PENV_10_ROTATED 118 /* PRC Envelope #10 Rotated 458 x 324 mm */
  799. #endif /* WINVER >= 0x0500 */
  800. #if (WINVER >= 0x0500)
  801. #define DMPAPER_LAST DMPAPER_PENV_10_ROTATED
  802. #elif (WINVER >= 0x0400)
  803. #define DMPAPER_LAST DMPAPER_A3_EXTRA_TRANSVERSE
  804. #else
  805. #define DMPAPER_LAST DMPAPER_FANFOLD_LGL_GERMAN
  806. #endif
  807. #define DMPAPER_USER 256
  808. */
  809. Integer li_rc
  810. any la_buff
  811. Return of_Printer ( printername, 5, la_buff, papersize,paperwidth,paperheight )
  812. end function
  813. public function string of_getpbprinter ();String ls_printer
  814. Integer li_Pos
  815. ls_printer = ProfileString ( "win.ini", "windows", "device", "" )
  816. //messagebox('',ls_printer)
  817. //setProfileString ( "win.ini", "windows", "device", "HP LaserJet 5L" )
  818. //ls_printer = ProfileString ( "win.ini", "windows", "device", "" )
  819. //
  820. //messagebox('',ls_printer)
  821. If ls_printer = "" then Return ""
  822. li_Pos = Pos ( ls_printer, "," )
  823. If li_Pos <> 0 Then
  824. ls_printer = Left ( ls_printer, li_Pos - 1 )
  825. End If
  826. Return ls_printer
  827. end function
  828. public function integer of_setdefault (string printername);// 设置为缺省打印机
  829. //integer li_size, li_width, li_length
  830. //any la_any
  831. //Return of_Printer( printername, 105, la_any, li_size, li_width, li_length )
  832. //
  833. //
  834. string ls_s
  835. ls_s=ProfileString ( "win.ini", "devices", printername, 'winspool,' )
  836. setProfileString ( "win.ini", "windows", "device", printername+','+ls_s )
  837. Return 1
  838. end function
  839. private function string of_getstringfromblob (blob source, integer offset);// 从指定位置得到一个以0结束的字符串
  840. String ls_char, ls_target
  841. Integer li_i
  842. For li_i = offset To Len ( source )
  843. ls_char = String ( BlobMid ( source, li_i, 1 ) )
  844. If Len ( ls_char ) = 0 Then Exit
  845. ls_target += ls_char
  846. Next
  847. Return ls_target
  848. end function
  849. private function integer of_modifyprinter (string printername, str_devmode devmode);// 修改打印机参数
  850. // 仅供内部使用
  851. // 与打印机有关的操作
  852. // return 1: 成功
  853. // return -1: 不成功
  854. str_Printer_info_2 lstr_info
  855. str_Printer_defaults lstr_default
  856. str_devmode lstr_devmode
  857. Integer li_rc, li_i
  858. string ls_DriverName, ls_PortName
  859. ulong ll_handle, ll_cbbuf, ll_cbNeeded
  860. blob lbl_buffer
  861. // 打开打印机
  862. If Not OpenPrinter ( printername, ll_handle, ref lstr_default ) Then Return -1
  863. ll_cbbuf = 0
  864. // 取打印机驱动名称
  865. ll_cbBuf = 0
  866. l_SetBuffer:
  867. lbl_buffer = Blob ( Space ( ll_cbBuf ) )
  868. If Not GetPrinter ( ll_handle, 2, ref lbl_buffer, ll_cbBuf, ll_cbNeeded ) Then
  869. If ll_cbNeeded > ll_cbBuf Then
  870. ll_cbBuf = ll_cbNeeded
  871. Goto l_SetBuffer
  872. Else
  873. li_rc = -1
  874. Goto l_quit
  875. End If
  876. End If
  877. // copy 至结构
  878. CopyMem ( lstr_info, lbl_buffer, PRINTER_INFO_2_LEN )
  879. // 驱动名、端口
  880. ls_DriverName = String ( lstr_info.DriverName, "address" )
  881. ls_PortName = String ( lstr_info.PortName, "address" )
  882. // 设置更新所有属性
  883. devMode.dmFields = 536870911
  884. li_rc = DocumentProperties ( 0, ll_handle, ls_DriverName, 0, devmode, DM_IN_BUFFER + DM_OUT_DEFAULT )
  885. If li_rc > 0 Then li_rc = 1
  886. l_quit:
  887. ClosePrinter ( ll_handle )
  888. Return li_rc
  889. end function
  890. public function integer of_printsetup (unsignedlong hwnd);str_PrintDlg lstr_Dlg
  891. str_devmode lstr_devmode
  892. str_devnames lstr_devNames
  893. String ls_printer, ls_driver, ls_port, ls_char
  894. Blob lbl_buffer
  895. ulong ll_mem, ll_length
  896. // 初始化结构参数
  897. lstr_Dlg.lStructSize = PRINTDLG_LEN
  898. lstr_Dlg.hwndOwner = hwnd
  899. lstr_Dlg.hDevMode = 0
  900. lstr_Dlg.hDevNames = 0
  901. lstr_Dlg.flags = PD_PRINTTOFILE + PD_NOPAGENUMS + PD_NOSELECTION + PD_USEDEVMODECOPIESANDCOLLATE
  902. lstr_Dlg.hInstance = 0
  903. lstr_Dlg.lCustData = 0
  904. lstr_Dlg.lpfnPrintHook = 0
  905. lstr_Dlg.lpfnSetupHook = 0
  906. lstr_Dlg.lpPrintTemplateName = 0
  907. lstr_Dlg.lpSetupTemplateName = 0
  908. lstr_Dlg.hPrintTemplate = 0
  909. lstr_Dlg.hSetupTemplate = 0
  910. If PrintDlg ( lstr_Dlg ) <> 0 Then
  911. // 取devmode
  912. ll_mem = GlobalLock ( lstr_Dlg.hDevMode )
  913. CopyMem ( lstr_devmode, ll_mem, DEVMODE_LEN )
  914. GlobalUnlock ( lstr_Dlg.hDevMode )
  915. // 取devnames
  916. // 这个结构记录用户设置的打印机
  917. // 取长度
  918. ll_Length = GlobalSize ( lstr_Dlg.hDevNames )
  919. ll_mem = GlobalLock ( lstr_Dlg.hDevNames )
  920. CopyMem ( lstr_devNames, ll_mem, DEVNAMES_LEN )
  921. // 分配空间
  922. lbl_buffer = Blob ( Space ( ll_length ) )
  923. CopyMem ( lbl_buffer, ll_mem, ll_length )
  924. GlobalUnlock ( lstr_Dlg.hDevNames )
  925. // 打印机名称
  926. ls_printer = of_GetStringFromBlob ( lbl_buffer, lstr_devNames.wDeviceOffset + 1 )
  927. // 驱动程序,可能是以前的16位系统留下的东西吧?
  928. ls_driver = of_GetStringFromBlob ( lbl_buffer, lstr_devNames.wDriverOffset + 1 )
  929. // 打印端口
  930. ls_port = of_GetStringFromBlob ( lbl_buffer, lstr_devNames.wOutputOffset + 1 )
  931. // 更新打印机属性
  932. of_ModifyPrinter ( ls_printer, lstr_devMode )
  933. // 将打印机设置为缺省打印机
  934. of_SetDefault ( ls_printer )
  935. Else
  936. Return -1
  937. End If
  938. Return 1
  939. end function
  940. public function integer of_setpapersize (string printername, integer papersize, integer paperwidth, integer paperheight);any la_any
  941. Return of_Printer( printername, 101, la_any, papersize,paperwidth,paperheight )
  942. end function
  943. public function integer of_pagesetup (unsignedlong hwnd, ref long left, ref long right, ref long top, ref long bottom);// 打印机页面设置
  944. // 返回1:用户选择确定
  945. // 左右上下边界放在left, right,top,bottom中返回
  946. str_PageSetupDlg lstr_Dlg
  947. str_devmode lstr_devmode
  948. str_devnames lstr_devNames
  949. String ls_printer, ls_driver, ls_port, ls_char
  950. Blob lbl_buffer
  951. ulong ll_mem, ll_length
  952. // 初始化结构参数
  953. lstr_Dlg.lStructSize = PAGESETUPDLG_LEN
  954. lstr_Dlg.hwndOwner = hwnd
  955. lstr_Dlg.hDevMode = 0
  956. lstr_Dlg.hDevNames = 0
  957. lstr_Dlg.flags = PSD_DEFAULTMINMARGINS + PSD_INHUNDREDTHSOFMILLIMETERS
  958. lstr_Dlg.hInstance = 0
  959. lstr_Dlg.lCustData = 0
  960. If PageSetupDlg ( lstr_Dlg ) Then
  961. // 取devmode
  962. ll_mem = GlobalLock ( lstr_Dlg.hDevMode )
  963. CopyMem ( lstr_devmode, ll_mem, DEVMODE_LEN )
  964. GlobalUnlock ( lstr_Dlg.hDevMode )
  965. // 取devnames
  966. // 这个结构记录用户设置的打印机
  967. // 取长度
  968. ll_Length = GlobalSize ( lstr_Dlg.hDevNames )
  969. ll_mem = GlobalLock ( lstr_Dlg.hDevNames )
  970. CopyMem ( lstr_devNames, ll_mem, DEVNAMES_LEN )
  971. // 分配空间
  972. lbl_buffer = Blob ( Space ( ll_length ) )
  973. CopyMem ( lbl_buffer, ll_mem, ll_length )
  974. GlobalUnlock ( lstr_Dlg.hDevNames )
  975. // 打印机名称
  976. ls_printer = of_GetStringFromBlob ( lbl_buffer, lstr_devNames.wDeviceOffset + 1 )
  977. // 驱动程序,可能是以前的16位系统留下的东西吧?
  978. ls_driver = of_GetStringFromBlob ( lbl_buffer, lstr_devNames.wDriverOffset + 1 )
  979. // 打印端口
  980. ls_port = of_GetStringFromBlob ( lbl_buffer, lstr_devNames.wOutputOffset + 1 )
  981. // 更新打印机属性
  982. of_ModifyPrinter ( ls_printer, lstr_devMode )
  983. // 将打印机设置为缺省打印机
  984. of_SetDefault ( ls_printer )
  985. Left = lstr_Dlg.rtMargin.Left
  986. Right = lstr_Dlg.rtMargin.Right
  987. Top = lstr_Dlg.rtMargin.Top
  988. Bottom = lstr_Dlg.rtMargin.Bottom
  989. Else
  990. Return -1
  991. End If
  992. Return 1
  993. end function
  994. on uo_printer_setting.create
  995. TriggerEvent( this, "constructor" )
  996. end on
  997. on uo_printer_setting.destroy
  998. TriggerEvent( this, "destructor" )
  999. end on
  1000. event constructor;//// 形成打印机列表
  1001. //String ls_list [ ]
  1002. //String ls_driver, ls_port, ls_PBPrinter
  1003. //Integer li_i, li_count, li_size, li_width, li_length, li_row
  1004. //datawindow ldw_list
  1005. //ldw_list = tab_1.tabpage_1.dw_list
  1006. //
  1007. //// 取打印机列表
  1008. //li_count = lnv_printer.of_GetPrinterList ( ls_list )
  1009. //
  1010. //// 取PB缺省打印机
  1011. //ls_PBPrinter = lnv_printer.of_GetPBPrinter ( )
  1012. //
  1013. //// 清除数据
  1014. //li_row = ldw_list.GetRow ( )
  1015. //
  1016. //ldw_list.SetRedraw ( False )
  1017. //ldw_list.Reset ( )
  1018. //For li_i = 1 To li_count
  1019. // ldw_list.InsertRow ( 0 )
  1020. // ldw_list.Setitem ( li_i, "printername", ls_list [ li_i ] )
  1021. // ls_driver = lnv_printer.of_GetDriverName ( ls_list [ li_i ] )
  1022. // ls_port = lnv_printer.of_GetPortName ( ls_list [ li_i ] )
  1023. // ldw_list.setitem ( li_i, "drivername", ls_driver )
  1024. // ldw_list.setitem ( li_i, "portname", ls_port )
  1025. //
  1026. // If ls_PBPrinter = ls_list [ li_i ] Then
  1027. // ldw_list.Setitem ( li_i, "pbdefault", 1 )
  1028. // End If
  1029. //
  1030. // // 取打印纸大小
  1031. // lnv_printer.of_GetPaperSize ( ls_list [ li_i ], li_size, li_width, li_length )
  1032. // ldw_list.Setitem ( li_i, "papersize", li_size )
  1033. // ldw_list.Setitem ( li_i, "paperwidth", li_width )
  1034. // ldw_list.Setitem ( li_i, "paperheight", li_length )
  1035. //Next
  1036. //
  1037. //If li_row <> 0 Then
  1038. // ldw_list.ScrollToRow ( li_row )
  1039. //End If
  1040. //
  1041. //ldw_list.setRedraw ( True )
  1042. //Return 1
  1043. end event