今天是本月的最后一天,可最近实在是没有时间研究新课题,但又想要将本月发表的文章凑个吉利数字,没办法,只好随便写点东西了!
当然也不能什么都不写,就复制下面的代码吧,是用来计算缺省打印机上缺省纸张的可打印区域的。
- LOCAL oPaperInfo
- m.oPaperInfo = GetPaperInfo()
- ? '最小左/上边距:', m.oPaperInfo.Left, m.oPaperInfo.Top
- ? '纸张宽/高: ', m.oPaperInfo.Width, m.oPaperInfo.Height
- *!* --------------------------------------------------------------------------
- *!* 功能: 获取缺省打印机及缺省纸张的可打印区域信息
- *!* 出口: 一个包含页信息的对象(单位为 cm )
- *!* --------------------------------------------------------------------------
- FUNCTION GetPaperInfo
- #DEFINE LOGPIXELSX 88
- #DEFINE LOGPIXELSY 90
- #DEFINE PHYSICALWIDTH 110
- #DEFINE PHYSICALHEIGHT 111
- #DEFINE PHYSICALOFFSETX 112
- #DEFINE PHYSICALOFFSETY 113
- #DEFINE SCALINGFACTORX 114
- #DEFINE SCALINGFACTORY 115
- Declare Long GetDeviceCaps IN win32api ;
- Long hdc, Long nIndex
- Declare Long CreateDC IN win32api ;
- String lpszDriver, String lpszDevice, ;
- String lpszOutput, ;
- String lpInitData
- Declare Long DeleteDC IN win32api ;
- Long hdc
- LOCAL loInfo, lhDc, lnLeft, lnTop, lnWidth, lnHeight, lnRes_h, lnRes_v
- m.loInfo = NEWOBJECT( 'Empty' )
- ADDPROPERTY( m.loInfo, 'left', 0 )
- ADDPROPERTY( m.loInfo, 'top', 0 )
- ADDPROPERTY( m.loInfo, 'width', 0 )
- ADDPROPERTY( m.loInfo, 'height', 0 )
- m.lhDc = CreateDC( 'WINSPOOL', SET("Printer",3), NULL, NULL )
- m.lnLeft = GetDeviceCaps( m.lhDc, PHYSICALOFFSETX )
- m.lnTop = GetDeviceCaps( m.lhDc, PHYSICALOFFSETY )
- m.lnWidth = GetDeviceCaps( m.lhDc, PHYSICALWIDTH )
- m.lnHeight = GetDeviceCaps( m.lhDc, PHYSICALHEIGHT )
- m.lnRes_h = GetDeviceCaps( m.lhDc, LOGPIXELSX )
- m.lnRes_v = GetDeviceCaps( m.lhDc, LOGPIXELSY )
- DeleteDC( m.lhDc )
- m.loInfo.Left = ROUND( m.lnLeft / m.lnRes_h * 2.54, 3 )
- m.loInfo.Top = ROUND( m.lnTop / m.lnRes_h * 2.54, 3 )
- m.loInfo.Width = ROUND( m.lnWidth / m.lnRes_h * 2.54, 3 )
- m.loInfo.Height = ROUND( m.lnHeight / m.lnRes_v * 2.54, 3 )
- RETURN m.loInfo
- ENDFUNC
再加点,获取当前 Windows 缺省打印机可用纸张信息及最大/最小自定义纸张尺寸:
- #define TAB chr(9)
- #define DC_FIELDS 1
- #define DC_PAPERS 2
- #define DC_PAPERSIZE 3
- #define DC_MINEXTENT 4
- #define DC_MAXEXTENT 5
- #define DC_BINS 6
- #define DC_DUPLEX 7
- #define DC_SIZE 8
- #define DC_EXTRA 9
- #define DC_VERSION 10
- #define DC_DRIVER 11
- #define DC_BINNAMES 12
- #define DC_ENUMRESOLUTIONS 13
- #define DC_FILEDEPENDENCIES 14
- #define DC_TRUETYPE 15
- #define DC_PAPERNAMES 16
- #define DC_ORIENTATION 17
- #define DC_COPIES 18
- declare long DeviceCapabilities in winspool.drv ;
- string lpDeviceName, ;
- string lpPort, ;
- long iIndex, ;
- string @ lpOutput, ;
- long lpDevMode
- m.nPapers = DeviceCapabilities( set("printer",2), null, DC_PAPERS, null, 0 )
- m.cBuff0 = space( m.nPapers * 2 )
- m.cBuff1 = space( m.nPapers * 8 )
- m.cBuff2 = space( m.nPapers * 64 )
- DeviceCapabilities( set("Printer",2), null, DC_PAPERS, @ m.cbuff0, 0 )
- DeviceCapabilities( set("Printer",2), null, DC_PAPERSIZE, @ m.cbuff1, 0 )
- DeviceCapabilities( set("Printer",2), null, DC_PAPERNAMES, @ m.cbuff2, 0 )
- ? '纸编号' + TAB + '尺寸' + TAB + TAB + '名称'
- ? replicate( '-', 80 )
- for m.ii = 1 to m.nPapers
- ? transform( ctobin( substr( m.cbuff0, (m.ii-1)*2+1, 2 ), '2rs' )) + TAB ;
- + transform( ctobin( substr( m.cbuff1, (m.ii-1)*8+1, 4 ), 'rs' )) + ' x ' ;
- + transform( ctobin( substr( m.cbuff1, (m.ii-1)*8+5, 4 ), 'rs' )) + TAB ;
- + rtrim( rtrim( substr( m.cbuff2, (m.ii-1)*64+1, 64 )), chr(0))
- endfor
- ? replicate( '-', 80 )
- m.cMin = DeviceCapabilities( set("Printer",2), null, DC_MINEXTENT, 0, 0 )
- m.cMax = DeviceCapabilities( set("Printer",2), null, DC_MAXEXTENT, 0, 0 )
- ? '最小自定义纸张尺寸:', transform( m.cMin % 0x10000 ) ;
- + ' x ' + transform( int( m.cMin / 0x10000 ))
- ? '最大自定义纸张尺寸:', transform( m.cMax % 0x10000 ) ;
- + ' x ' + transform( int( m.cMax / 0x10000 ))