发信人: 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 | 
 
 
 |