⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 print.asm

📁 MasmEd是一款专门针对Masm32做的汇编代码编辑器
💻 ASM
字号:
.data?

prnInches		dd ?

.code

GetPrnCaps proc
	LOCAL	buffer[256]:BYTE

	invoke GetUserDefaultLCID
	mov		edx,eax
	invoke GetLocaleInfo,edx,LOCALE_IMEASURE,addr buffer,sizeof buffer
	mov		al,buffer
	.if al=='1'
		mov		eax,1
	.else
		mov		eax,0
	.endif
	mov		prnInches,eax
	ret

GetPrnCaps endp

ConvToPix proc lLPix:DWORD,lSize:DWORD

	mov		eax,lLPix
	.if !prnInches
		mov		ecx,1000
		mul		ecx
		xor		edx,edx
		mov		ecx,254
		div		ecx
	.else
		mov		ecx,10
		mul		ecx
	.endif
	mov		ecx,eax		;Pix pr. 100mm / 10"
	mov		eax,lSize
	mul		ecx
	xor		edx,edx
	mov		ecx,10000
	div		ecx
	ret

ConvToPix endp

Print proc uses ebx
	LOCAL	doci:DOCINFO
	LOCAL	pX:DWORD
	LOCAL	pY:DWORD
	LOCAL	pML:DWORD
	LOCAL	pMT:DWORD
	LOCAL	pMR:DWORD
	LOCAL	pMB:DWORD
	LOCAL	chrg:CHARRANGE
	LOCAL	rect:RECT
	LOCAL	pt:POINT
	LOCAL	hRgn:DWORD
	LOCAL	buffer[32]:BYTE
	LOCAL	lf:LOGFONT
	LOCAL	hPrFont:DWORD
	LOCAL	nLine:DWORD
	LOCAL	nPageno:DWORD
	LOCAL	nMPage:DWORD
	LOCAL	nMLine:DWORD
	LOCAL	ptX:DWORD
	LOCAL	ptY:DWORD
	LOCAL	tWt:DWORD

	invoke GetPrnCaps
	invoke GetDeviceCaps,pd.hDC,LOGPIXELSX
	mov		ebx,eax
	invoke ConvToPix,ebx,psd.ptPaperSize.x
	mov		pX,eax
	invoke ConvToPix,ebx,psd.rtMargin.left
	mov		pML,eax
	invoke ConvToPix,ebx,psd.rtMargin.right
	mov		pMR,eax
	invoke GetDeviceCaps,pd.hDC,LOGPIXELSY
	mov		ebx,eax
	invoke ConvToPix,ebx,psd.ptPaperSize.y
	mov		pY,eax
	invoke ConvToPix,ebx,psd.rtMargin.top
	mov		pMT,eax
	invoke ConvToPix,ebx,psd.rtMargin.bottom
	mov		pMB,eax
	invoke RtlZeroMemory,addr lf,sizeof lf
	invoke lstrcpy,addr lf.lfFaceName,addr lfnt.lfFaceName
	invoke GetDeviceCaps,pd.hDC,LOGPIXELSY
	mov		ecx,lfnt.lfHeight
	neg		ecx
	mul		ecx
	xor		edx,edx
	mov		ecx,72
	div		ecx
	mov		lf.lfHeight,eax
	mov		ecx,eax
	mov		eax,pY
	sub		eax,pMT
	sub		eax,pMB
	xor		edx,edx
	div		ecx
	mov		ppos.nlinespage,eax
	invoke RegSetValueEx,hReg,addr szPrnPos,0,REG_BINARY,addr ppos,sizeof ppos
	mov		eax,lfnt.lfWeight
	mov		lf.lfWeight,eax
	invoke CreateFontIndirect,addr lf
	mov		hPrFont,eax
	mov		doci.cbSize,sizeof doci
	mov		doci.lpszDocName,offset szAppName
	mov		eax,pd.Flags
	and		eax,PD_PRINTTOFILE
	.if eax
		mov		eax,'ELIF'
		mov		dword ptr buffer,eax
		mov		eax,':'
		mov		dword ptr buffer+4,eax
		lea		eax,buffer
		mov		doci.lpszOutput,eax
	.else
		mov		doci.lpszOutput,NULL
	.endif
	mov		doci.lpszDatatype,NULL
	mov		doci.fwType,NULL
	invoke StartDoc,pd.hDC,addr doci
	mov		eax,pd.Flags
	and		eax,PD_SELECTION
	.if eax
		invoke SendMessage,hREd,EM_EXLINEFROMCHAR,0,chrg.cpMin
		mov		nLine,eax
		mov		ecx,ppos.nlinespage
		xor		edx,edx
		div		ecx
		mov		nPageno,eax
		invoke SendMessage,hREd,EM_EXLINEFROMCHAR,0,chrg.cpMax
		sub		eax,nLine
		inc		eax
		mov		nMLine,eax
		mov		pd.nToPage,-1
	.else
		movzx	eax,pd.nFromPage
		dec		eax
		mov		nPageno,eax
		mov		edx,ppos.nlinespage
		mul		edx
		mov		nLine,eax
		invoke SendMessage,hREd,EM_GETLINECOUNT,0,0
		or		eax,eax
		je		Ed
		inc		eax
		inc		eax
		mov		nMLine,eax
	.endif
	mov		eax,pML
	mov		rect.left,eax
	mov		eax,pX
	sub		eax,pMR
	mov		rect.right,eax
	mov		eax,pMT
	mov		rect.top,eax
	mov		eax,pY
	sub		eax,pMB
	mov		rect.bottom,eax
	invoke CreateRectRgn,rect.left,rect.top,rect.right,rect.bottom
	mov		hRgn,eax
  NxtPage:
	inc		nPageno
	mov		eax,nPageno
	.if ax>pd.nToPage
		jmp		Ed
	.endif
	invoke StartPage,pd.hDC
	mov		eax,pMT
	mov		ptY,eax
	invoke SelectObject,pd.hDC,hPrFont
	invoke SelectObject,pd.hDC,hRgn
	;Get tab width
	mov		eax,'WWWW'
	mov		dword ptr buffer,eax
	invoke GetTextExtentPoint32,pd.hDC,addr buffer,4,addr pt
	mov		eax,pt.x
	shr		eax,2
	mov		ecx,edopt.tabsize
	mul		ecx
	mov		tWt,eax
  NxtLine:
	mov		eax,ptY
	add		eax,pt.y
	add		eax,pt.y
	cmp		eax,rect.bottom
	jnb		Ep
	dec		nMLine
	je		Ep
	mov		eax,pML
	mov		ptX,eax
	mov		word ptr LineTxt,sizeof LineTxt-1
	invoke SendMessage,hREd,EM_GETLINE,nLine,addr LineTxt
	mov		byte ptr LineTxt[eax],0
	inc		nLine
	or		eax,eax
	je		El
	invoke lstrlen,addr LineTxt
	mov		ecx,eax
	invoke TabbedTextOut,pd.hDC,ptX,ptY,addr LineTxt,ecx,1,addr tWt,ptX
  El:
	mov		eax,pt.y
	add		ptY,eax
	jmp		NxtLine
  Ep:
	invoke EndPage,pd.hDC
	.if nMLine
		jmp		NxtPage
	.endif
  Ed:
	invoke EndDoc,pd.hDC
	invoke DeleteDC,pd.hDC
	invoke DeleteObject,hPrFont
	invoke DeleteObject,hRgn
	ret

Print endp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -