发信人: lawskin(law)
整理人: foxzz(2004-12-28 08:54:34), 站内信件
|
VFP的PRTINFO涵数,定义的纸张尺寸只有41种,在Windows2000中,系统定义的纸张有118种,自定义纸从119开始编号.PRTINFO(2)可以返回所有纸张定义的编号,却无法得到纸张的具体尺寸,PRTINFO(3),PRTINFO(4)返回值均为-1,在需要自定义打印的时候,很困难.我曾在论坛上多次发贴,寻求解决办法,都没有得到回应,最近仔细推敲注册表,终于有所发现,可惜没有98系统,此程序只适用于2000以上系统.只要执行此程序,就可显示当前打印纸张的尺寸(mm)和在屏幕上显示的大小(PIXEL)(因原本是做成一个类的,现改成一个程序,变量定义可能有变化)
Local lnOreintation,i,cSubKey,nBasePaperSet,cPaperData,nPaperno,cObjName,
*SET STEP ON
If !Empty(Set("Printer",3)) And Val(Os(3))>=5 &&僅Windows 2000以上版本有效
Declare Integer RegEnumValue In Win32API ;
Integer hKey, Integer iValue, String @lpszValue, ;
Integer @lpcchValue, Integer lpdwReserved, Integer @lpdwType, ;
String @lpbData, Integer @lpcbData
Declare Integer RegOpenKey In Win32API ;
Integer nHKey, String @cSubKey, Integer @nResult
Declare Integer RegCloseKey In Win32API ;
Integer nHKey
Dimension aPapersize(1)
If Left(Set("Printer" ,3),2)="\\"
cSubKey="SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\LanMan Print Services\Servers\"+;
LEFT(Substr(Set("Printer" ,3),3),At("\",Substr(Set("Printer" ,3),3))-1)+"\Forms"
nBasePaperSet=0 &&网络打印机读取的是全部尺寸,本地打印机读取的只是自定义尺寸.
Else
cSubKey="System\CurrentControlSet\Control\Print\Forms"
nBasePaperSet=118 &&本地打印机
Endif
nSubKey=0
RegOpenKey(-2147483646,cSubKey,@nSubKey)
Dimension PaperData(1)
initPapersize(@aPapersize) &&基本尺寸共118種
n=enumkeyvalues(@PaperData,nSubKey)
=RegCloseKey(nSubKey)
IF !Empty(PaperData(1,1))
*Dimension aPapersize(nBasePaperSet+Alen(PaperData,1),3)
For i=1 To Alen(PaperData,1)
*MESSAGEBOX(PaperData(i,2))
If PaperData(i,2)=3
cPaperData=textbin2hex(PaperData(i,3))
nPaperno=hextodec(Substr(cPaperData,49,2))+nBasePaperSet
If nPaperno>Alen(aPapersize,1)
Dimension aPapersize(nPaperno,3)
Endif
aPapersize(nPaperno,1)=PaperData(i,1)
aPapersize(nPaperno,2)=0.001* ;
hextodec(Substr(cPaperData,7,2)+Substr(cPaperData,5,2)+Substr(cPaperData,3,2)+Substr(cPaperData,1,2))
aPapersize(nPaperno,3)=0.001*;
hextodec(Substr(cPaperData,15,2)+Substr(cPaperData,13,2)+Substr(cPaperData,11,2)+Substr(cPaperData,9,2))
*?Papersize(nPaperno,2),Papersize(nPaperno,3)
Else
Dimension aPapersize(Alen(aPapersize,1)-1,3)
Endif
Endfor
i=118
Do While Alen(aPapersize,1)>i
i=i+1
*FOR i=119 TO ALEN(aPapersize,1)
If Empty(aPapersize(i,1))
Adel(aPapersize,i)
Dimension aPapersize(Alen(aPapersize,1)-1,3)
i=i-1
Endif
Enddo
Endif
CLEAR DLLS RegEnumValue
CLEAR DLLS RegOpenKey
CLEAR DLLS RegCloseKey
Endif
*!* STORE "" TO zzz1,zzz2,zzz3
*!* FOR i=1 TO ALEN(apapersize,1)
*!* zzz1=zzz1+"aPaperSize("+ALLTRIM(STR(i))+",1)='"+ALLTRIM(Papersize(i,1))+"'"+CHR(13)
*!* zzz2=zzz2+"aPaperSize("+ALLTRIM(STR(i))+",2)="+ALLTRIM(str(Papersize(i,2)))+CHR(13)
*!* zzz3=zzz3+"aPaperSize("+ALLTRIM(STR(i))+",3)="+ALLTRIM(str(Papersize(i,3)))+CHR(13)
*!* ENDFOR
*!* _cliptext=zzz1+zzz2+zzz3
If !Between(Prtinfo(2),1,Alen(aPapersize,1))
Messagebox("Sorry, paper size is invalid",16,"Error")
Return
Endif
*m.lnOreintation=IIF(PRTINFO(1)=0,2,3)
?"Paper Width=",aPapersize(Prtinfo(2),Iif(Prtinfo(1)=0,2,3))
?"Paper Height=",aPapersize(Prtinfo(2),Iif(Prtinfo(1)=0,3,2))
?"Screen Width=",(10000/104.167/25.4)*aPapersize(Prtinfo(2),Iif(Prtinfo(1)=0,2,3))
?"Screen Height=",(10000/104.167/25.4)*aPapersize(Prtinfo(2),Iif(Prtinfo(1)=0,3,2))
**********************************************************************
Procedure charconvert
Lparameters eValue
Local eRetValue
If Vartype(eValue)="C"
Do Case
Case Lower(eValue) = "a"
eRetValue= 10
Case Lower(eValue) = "b"
eRetValue= 11
Case Lower(eValue) = "c"
eRetValue= 12
Case Lower(eValue) = "d"
eRetValue= 13
Case Lower(eValue) = "e"
eRetValue= 14
Case Lower(eValue) = "f"
eRetValue= 15
Otherwise
eRetValue= Val(eValue)
Endcase
Else
Do Case
Case eValue= 10
eRetValue= "a"
Case eValue= 11
eRetValue= "b"
Case eValue= 12
eRetValue= "c"
Case eValue= 13
eRetValue= "d"
Case eValue= 14
eRetValue= "e"
Case eValue= 15
eRetValue="f"
Otherwise
eRetValue= Str(eValue,1)
Endcase
Endif
Return eRetValue
Endproc
Procedure hextodec
Lparameter cTextHex
nOct= 0
For i = 1 To Len(cTextHex)
nOct= charconvert(Right(cTextHex,1))*16^(i-1)+nOct
cTextHex= Substr(cTextHex,1,Len(cTextHex)-1)
Endfor
Return nOct
Endproc
Procedure textbin2hex
Lparameters cTextBin
Local cTextHex,i
cTextHex = Space(0)
*SET STEP ON
For i=1 To Len(cTextBin)
cTextHex = cTextHex +;
charconvert(Int(Asc(Substr(cTextBin,i,1))/16))+;
charconvert(Asc(Substr(cTextBin,i,1))-;
int(Asc(Substr(cTextBin,i,1))/16)*16)
Endfor
Return cTextHex
Endproc
Procedure enumkeyvalues
* Enumerates through values of a registry key
Lparameter aKeyValues,ncurrentkey
Local lpszValue,lpcchValue,lpdwReserved
Local lpdwType,lpbData,lpcbData
Local nErrCode,nKeyEntry
Store 0 To nKeyEntry
Do While .T.
Store 0 To lpdwReserved,lpdwType,nErrCode
Store Space(256) To lpbData, lpszValue
Store Len(lpbData) To m.lpcchValue
Store Len(lpszValue) To m.lpcbData
nErrCode=RegEnumValue(ncurrentkey,m.nKeyEntry,@lpszValue,;
@lpcchValue,m.lpdwReserved,@lpdwType,@lpbData,@lpcbData)
Do Case
Case m.nErrCode = 259
Exit
Case m.nErrCode # 0
Exit
Endcase
nKeyEntry = m.nKeyEntry + 1
* Set array values
Dimension aKeyValues[m.nKeyEntry,3]
aKeyValues[m.nKeyEntry,1] = Left(m.lpszValue,m.lpcchValue)
aKeyValues[m.nKeyEntry,2] = lpdwType
Do Case
Case lpdwType = 1
aKeyValues[m.nKeyEntry,3] = Left(m.lpbData,m.lpcbData-1)
Case lpdwType = 2 &&And !ldisallowexpanded
aKeyValues[m.nKeyEntry,3] = Left(m.lpbData,m.lpcbData-1)
Case lpdwType = 3
* Don't support binary
aKeyValues[m.nKeyEntry,3] =Left(m.lpbData,m.lpcbData-1)
Case lpdwType = 4
* You will need to use ASC() to check values here.
aKeyValues[m.nKeyEntry,3] = Left(m.lpbData,m.lpcbData-1)
Otherwise
aKeyValues[m.nKeyEntry,3] = "Unknown type"
Endcase
Enddo
*!* FOR i=1 TO ALEN(aKeyValues,1)
*!* ?aKeyValues(i,1)
*!* ?aKeyValues(i,2)
*!* ENDfor
*!* If m.nErrCode = ERROR_EOF And m.nKeyEntry#0
*!* m.nErrCode = ERROR_SUCCESS
*!* Endif
Return m.nErrCode
ENDPROC
PROCEDURE initPapersize(PaperSize)
DIMENSION PaperSize[118,3]
PaperSize(1,1)='Letter'
PaperSize(2,1)='Letter Small'
PaperSize(3,1)='Tabloid'
PaperSize(4,1)='Ledger'
PaperSize(5,1)='Legal'
PaperSize(6,1)='Statement'
PaperSize(7,1)='Executive'
PaperSize(8,1)='A3'
PaperSize(9,1)='A4'
PaperSize(10,1)='A4 Small'
PaperSize(11,1)='A5'
PaperSize(12,1)='B4 (JIS)'
PaperSize(13,1)='B5 (JIS)'
PaperSize(14,1)='Folio'
PaperSize(15,1)='Quarto'
PaperSize(16,1)='10x14'
PaperSize(17,1)='11x17'
PaperSize(18,1)='Note'
PaperSize(19,1)='Envelope #9'
PaperSize(20,1)='Envelope #10'
PaperSize(21,1)='Envelope #11'
PaperSize(22,1)='Envelope #12'
PaperSize(23,1)='Envelope #14'
PaperSize(24,1)='C size sheet'
PaperSize(25,1)='D size sheet'
PaperSize(26,1)='E size sheet'
PaperSize(27,1)='Envelope DL'
PaperSize(28,1)='Envelope C5'
PaperSize(29,1)='Envelope C3'
PaperSize(30,1)='Envelope C4'
PaperSize(31,1)='Envelope C6'
PaperSize(32,1)='Envelope C65'
PaperSize(33,1)='Envelope B4'
PaperSize(34,1)='Envelope B5'
PaperSize(35,1)='Envelope B6'
PaperSize(36,1)='Envelope'
PaperSize(37,1)='Envelope Monarch'
PaperSize(38,1)='6 3/4 Envelope'
PaperSize(39,1)='US Std Fanfold'
PaperSize(40,1)='German Std Fanfold'
PaperSize(41,1)='German Legal Fanfold'
PaperSize(42,1)='B4 (ISO)'
PaperSize(43,1)='Japanese Postcard'
PaperSize(44,1)='9x11'
PaperSize(45,1)='10x11'
PaperSize(46,1)='15x11'
PaperSize(47,1)='Envelope Invite'
PaperSize(48,1)='Reserved48'
PaperSize(49,1)='Reserved49'
PaperSize(50,1)='Letter Extra'
PaperSize(51,1)='Legal Extra'
PaperSize(52,1)='Tabloid Extra'
PaperSize(53,1)='A4 Extra'
PaperSize(54,1)='Letter Transverse'
PaperSize(55,1)='A4 Transverse'
PaperSize(56,1)='Letter Extra Transverse'
PaperSize(57,1)='Super A'
PaperSize(58,1)='Super B'
PaperSize(59,1)='Letter Plus'
PaperSize(60,1)='A4 Plus'
PaperSize(61,1)='A5 Transverse'
PaperSize(62,1)='B5 (JIS) Transverse'
PaperSize(63,1)='A3 Extra'
PaperSize(64,1)='A5 Extra'
PaperSize(65,1)='B5 (ISO) Extra'
PaperSize(66,1)='A2'
PaperSize(67,1)='A3 Transverse'
PaperSize(68,1)='A3 Extra Transverse'
PaperSize(69,1)='Japanese Double Postcard'
PaperSize(70,1)='A6'
PaperSize(71,1)='Japanese Envelope Kaku #2'
PaperSize(72,1)='Japanese Envelope Kaku #3'
PaperSize(73,1)='Japanese Envelope Chou #3'
PaperSize(74,1)='Japanese Envelope Chou #4'
PaperSize(75,1)='Letter Rotated'
PaperSize(76,1)='A3 Rotated'
PaperSize(77,1)='A4 Rotated'
PaperSize(78,1)='A5 Rotated'
PaperSize(79,1)='B4 (JIS) Rotated'
PaperSize(80,1)='B5 (JIS) Rotated'
PaperSize(81,1)='Japanese Postcard Rotated'
PaperSize(82,1)='Double Japan Postcard Rotated'
PaperSize(83,1)='A6 Rotated'
PaperSize(84,1)='Japan Envelope Kaku #2 Rotated'
PaperSize(85,1)='Japan Envelope Kaku #3 Rotated'
PaperSize(86,1)='Japan Envelope Chou #3 Rotated'
PaperSize(87,1)='Japan Envelope Chou #4 Rotated'
PaperSize(88,1)='B6 (JIS)'
PaperSize(89,1)='B6 (JIS) Rotated'
PaperSize(90,1)='12x11'
PaperSize(91,1)='Japan Envelope You #4'
PaperSize(92,1)='Japan Envelope You #4 Rotated'
PaperSize(93,1)='PRC 16K'
PaperSize(94,1)='PRC 32K'
PaperSize(95,1)='PRC 32K(Big)'
PaperSize(96,1)='PRC Envelope #1'
PaperSize(97,1)='PRC Envelope #2'
PaperSize(98,1)='PRC Envelope #3'
PaperSize(99,1)='PRC Envelope #4'
PaperSize(100,1)='PRC Envelope #5'
PaperSize(101,1)='PRC Envelope #6'
PaperSize(102,1)='PRC Envelope #7'
PaperSize(103,1)='PRC Envelope #8'
PaperSize(104,1)='PRC Envelope #9'
PaperSize(105,1)='PRC Envelope #10'
PaperSize(106,1)='PRC 16K Rotated'
PaperSize(107,1)='PRC 32K Rotated'
PaperSize(108,1)='PRC 32K(Big) Rotated'
PaperSize(109,1)='PRC Envelope #1 Rotated'
PaperSize(110,1)='PRC Envelope #2 Rotated'
PaperSize(111,1)='PRC Envelope #3 Rotated'
PaperSize(112,1)='PRC Envelope #4 Rotated'
PaperSize(113,1)='PRC Envelope #5 Rotated'
PaperSize(114,1)='PRC Envelope #6 Rotated'
PaperSize(115,1)='PRC Envelope #7 Rotated'
PaperSize(116,1)='PRC Envelope #8 Rotated'
PaperSize(117,1)='PRC Envelope #9 Rotated'
PaperSize(118,1)='PRC Envelope #10 Rotated'
PaperSize(1,2)=216
PaperSize(2,2)=216
PaperSize(3,2)=279
PaperSize(4,2)=432
PaperSize(5,2)=216
PaperSize(6,2)=140
PaperSize(7,2)=184
PaperSize(8,2)=297
PaperSize(9,2)=210
PaperSize(10,2)=210
PaperSize(11,2)=148
PaperSize(12,2)=257
PaperSize(13,2)=182
PaperSize(14,2)=216
PaperSize(15,2)=215
PaperSize(16,2)=254
PaperSize(17,2)=279
PaperSize(18,2)=216
PaperSize(19,2)=98
PaperSize(20,2)=105
PaperSize(21,2)=114
PaperSize(22,2)=121
PaperSize(23,2)=127
PaperSize(24,2)=432
PaperSize(25,2)=559
PaperSize(26,2)=864
PaperSize(27,2)=110
PaperSize(28,2)=162
PaperSize(29,2)=324
PaperSize(30,2)=229
PaperSize(31,2)=114
PaperSize(32,2)=114
PaperSize(33,2)=250
PaperSize(34,2)=176
PaperSize(35,2)=176
PaperSize(36,2)=110
PaperSize(37,2)=98
PaperSize(38,2)=92
PaperSize(39,2)=378
PaperSize(40,2)=216
PaperSize(41,2)=216
PaperSize(42,2)=250
PaperSize(43,2)=100
PaperSize(44,2)=229
PaperSize(45,2)=254
PaperSize(46,2)=381
PaperSize(47,2)=220
PaperSize(48,2)=0
PaperSize(49,2)=0
PaperSize(50,2)=241
PaperSize(51,2)=241
PaperSize(52,2)=305
PaperSize(53,2)=235
PaperSize(54,2)=216
PaperSize(55,2)=210
PaperSize(56,2)=241
PaperSize(57,2)=227
PaperSize(58,2)=305
PaperSize(59,2)=216
PaperSize(60,2)=210
PaperSize(61,2)=148
PaperSize(62,2)=182
PaperSize(63,2)=322
PaperSize(64,2)=174
PaperSize(65,2)=201
PaperSize(66,2)=420
PaperSize(67,2)=297
PaperSize(68,2)=322
PaperSize(69,2)=200
PaperSize(70,2)=105
PaperSize(71,2)=240
PaperSize(72,2)=216
PaperSize(73,2)=120
PaperSize(74,2)=90
PaperSize(75,2)=279
PaperSize(76,2)=420
PaperSize(77,2)=297
PaperSize(78,2)=210
PaperSize(79,2)=364
PaperSize(80,2)=257
PaperSize(81,2)=148
PaperSize(82,2)=148
PaperSize(83,2)=148
PaperSize(84,2)=332
PaperSize(85,2)=277
PaperSize(86,2)=235
PaperSize(87,2)=205
PaperSize(88,2)=128
PaperSize(89,2)=182
PaperSize(90,2)=305
PaperSize(91,2)=105
PaperSize(92,2)=235
PaperSize(93,2)=188
PaperSize(94,2)=130
PaperSize(95,2)=140
PaperSize(96,2)=102
PaperSize(97,2)=102
PaperSize(98,2)=125
PaperSize(99,2)=110
PaperSize(100,2)=110
PaperSize(101,2)=120
PaperSize(102,2)=160
PaperSize(103,2)=120
PaperSize(104,2)=229
PaperSize(105,2)=324
PaperSize(106,2)=260
PaperSize(107,2)=184
PaperSize(108,2)=203
PaperSize(109,2)=165
PaperSize(110,2)=176
PaperSize(111,2)=176
PaperSize(112,2)=208
PaperSize(113,2)=220
PaperSize(114,2)=230
PaperSize(115,2)=230
PaperSize(116,2)=309
PaperSize(117,2)=324
PaperSize(118,2)=458
PaperSize(1,3)=279
PaperSize(2,3)=279
PaperSize(3,3)=432
PaperSize(4,3)=279
PaperSize(5,3)=356
PaperSize(6,3)=216
PaperSize(7,3)=267
PaperSize(8,3)=420
PaperSize(9,3)=297
PaperSize(10,3)=297
PaperSize(11,3)=210
PaperSize(12,3)=364
PaperSize(13,3)=257
PaperSize(14,3)=330
PaperSize(15,3)=275
PaperSize(16,3)=356
PaperSize(17,3)=432
PaperSize(18,3)=279
PaperSize(19,3)=225
PaperSize(20,3)=241
PaperSize(21,3)=264
PaperSize(22,3)=279
PaperSize(23,3)=292
PaperSize(24,3)=559
PaperSize(25,3)=864
PaperSize(26,3)=1118
PaperSize(27,3)=220
PaperSize(28,3)=229
PaperSize(29,3)=458
PaperSize(30,3)=324
PaperSize(31,3)=162
PaperSize(32,3)=229
PaperSize(33,3)=353
PaperSize(34,3)=250
PaperSize(35,3)=125
PaperSize(36,3)=230
PaperSize(37,3)=191
PaperSize(38,3)=165
PaperSize(39,3)=279
PaperSize(40,3)=305
PaperSize(41,3)=330
PaperSize(42,3)=353
PaperSize(43,3)=148
PaperSize(44,3)=279
PaperSize(45,3)=279
PaperSize(46,3)=279
PaperSize(47,3)=220
PaperSize(48,3)=0
PaperSize(49,3)=0
PaperSize(50,3)=305
PaperSize(51,3)=381
PaperSize(52,3)=457
PaperSize(53,3)=322
PaperSize(54,3)=279
PaperSize(55,3)=297
PaperSize(56,3)=305
PaperSize(57,3)=356
PaperSize(58,3)=487
PaperSize(59,3)=322
PaperSize(60,3)=330
PaperSize(61,3)=210
PaperSize(62,3)=257
PaperSize(63,3)=445
PaperSize(64,3)=235
PaperSize(65,3)=276
PaperSize(66,3)=594
PaperSize(67,3)=420
PaperSize(68,3)=445
PaperSize(69,3)=148
PaperSize(70,3)=148
PaperSize(71,3)=332
PaperSize(72,3)=277
PaperSize(73,3)=235
PaperSize(74,3)=205
PaperSize(75,3)=216
PaperSize(76,3)=297
PaperSize(77,3)=210
PaperSize(78,3)=148
PaperSize(79,3)=257
PaperSize(80,3)=182
PaperSize(81,3)=100
PaperSize(82,3)=200
PaperSize(83,3)=105
PaperSize(84,3)=240
PaperSize(85,3)=216
PaperSize(86,3)=120
PaperSize(87,3)=90
PaperSize(88,3)=182
PaperSize(89,3)=128
PaperSize(90,3)=280
PaperSize(91,3)=235
PaperSize(92,3)=105
PaperSize(93,3)=260
PaperSize(94,3)=184
PaperSize(95,3)=203
PaperSize(96,3)=165
PaperSize(97,3)=176
PaperSize(98,3)=176
PaperSize(99,3)=208
PaperSize(100,3)=220
PaperSize(101,3)=230
PaperSize(102,3)=230
PaperSize(103,3)=309
PaperSize(104,3)=324
PaperSize(105,3)=458
PaperSize(106,3)=188
PaperSize(107,3)=130
PaperSize(108,3)=140
PaperSize(109,3)=102
PaperSize(110,3)=102
PaperSize(111,3)=125
PaperSize(112,3)=110
PaperSize(113,3)=110
PaperSize(114,3)=120
PaperSize(115,3)=160
PaperSize(116,3)=120
PaperSize(117,3)=229
PaperSize(118,3)=324 |
|