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

📄 on_paint.asm

📁 一个十六进制编辑器源代码,cool!
💻 ASM
字号:
COLOR_ODD=0800000h;双数行
COLOR_EVEN=0f00000h;奇数行
COLOR_SEL=000f00fh;选择的文字
COLOR_SELBACK=0000000h;选择的背景
COLOR_ZERO=0c0c0c0h;0的颜色
COLOR_CURPOS=0ffh;当前位置(地址及位移)
COLOR_NORMAL=0;正常文字
COLOR_CURSOR=00000f0h;光标的颜色
_OnPaint proto:DWORD ,:DWORD ,:DWORD
_DrawDataBar  proto:DWORD ,:DWORD ,:DWORD
_DrawCursor   proto
.code
;------------------------------------------------
_OnPaint proc hWin,wParam,lParam
local @szBuf[9]:BYTE ,@szBufasc[20]:BYTE 
local @hdc_mem,@hdc,@hbmp,@rc:RECT 
local @width,@height,hex_bottom
local x,y,x_char
local @ASC_LEFT
Local @size:SIZEL
	pushad
	invoke GetDC,hWnd
	mov @hdc,eax
	invoke CreateCompatibleDC,0
	mov @hdc_mem,eax

	invoke GetClientRect,hWnd,addr @rc
	mov eax,@rc.bottom
	mov hex_bottom,eax
	sub hex_bottom,STATUSBAR_HEIGHT+Y_CELL_SPACE
	sub eax,@rc.top
	push eax;height for CreateCompatibleBitmap	
	mov @height,eax

	mov eax,@rc.right
	sub eax,@rc.left
	mov @width,eax
	push eax;width for CreateCompatibleBitmap

	push @hdc;hdc for CreateCompatibleBitmap
	call CreateCompatibleBitmap
	mov @hbmp,eax
	invoke SelectObject,@hdc_mem,eax
	invoke SelectObject,@hdc_mem,hFont
	invoke FillRect,@hdc_mem,addr @rc,COLOR_WINDOW+1
	;画几条线----------------------------------
	invoke MoveToEx,@hdc_mem,0,HEX_TOP-3,NULL 
	invoke LineTo,@hdc_mem,@rc.right,HEX_TOP-3
	invoke MoveToEx,@hdc_mem,HEX_LEFT-10,0,NULL
	invoke LineTo,@hdc_mem,HEX_LEFT-10,hex_bottom
	invoke MoveToEx,@hdc_mem,ASC_LEFT-10,0,NULL 
	invoke LineTo,@hdc_mem,ASC_LEFT-10,hex_bottom
	;--------------------------------------------------
	invoke GetTextExtentPoint,@hdc_mem,addr szWindowName,1,addr @size
	m2m g_asc_width,@size.x
;-----------------------------------------------
	;左边的地址及右边的字符
	mov y,HEX_TOP
	mov esi,g_TopLine
	shl esi,4
	mov edi,dwCurPos
	and edi,not 0fh
	.while esi<dwFileSize
		;地址
		.if edi==esi
				invoke SetTextColor,@hdc_mem,COLOR_CURPOS
				mov eax,y
		.else
				invoke SetTextColor,@hdc_mem,COLOR_NORMAL
		.endif
		mov eax,esi
		.if dwFileType==FILE_RAM
			add eax,dwRamAddress
		.endif
		invoke wsprintf,addr @szBuf,ctext("%08X"),eax
		invoke TextOut,@hdc_mem,TOP_CELL,y,addr @szBuf,eax
		;字符
		invoke SetTextColor,@hdc_mem,COLOR_NORMAL
		mov eax,esi
		add eax,lpMemFile
		invoke RtlMoveMemory,addr @szBufasc,eax,16
		xor ecx,ecx
		.while ecx<=0fh
			mov al,@szBufasc[ecx]
			.if al<20h;无法显示的字符用小数点表示
				mov @szBufasc[ecx],'.'
			.elseif SBYTE ptr al<0;测试是否为中文(此方法并不是100%准确)
				mov ah, @szBufasc[ecx+1]
				.if SBYTE ptr ah >=0
					.if SBYTE ptr ah>20h && SBYTE ptr ah<07fh
						mov @szBufasc[ecx],'.'
						mov @szBufasc[ecx+1],ah
					.else
						mov WORD ptr @szBufasc[ecx],'..'
					.endif
				.endif
				inc ecx
			.endif
			inc ecx
		.endw
		mov eax,dwFileSize
		sub eax,esi
		cmp eax,16
		jl @f
		mov eax,16
		@@:
		invoke TextOut,@hdc_mem,ASC_LEFT,y,addr @szBufasc,eax
		add y,Y_CELL_SPACE
		mov eax,y
		.break .if eax>=hex_bottom
		add esi,10h
	.endw
;---------------------------------------------------------
	;顶上的偏移量
	;00 01 02 03 ..0F
	mov edi,HEX_LEFT
	xor esi,esi
	mov ebx,dwCurPos
	and ebx,0fh
	.while esi<=0fh
		.if ebx==esi
				invoke SetTextColor,@hdc_mem,COLOR_CURPOS
		.else
				invoke SetTextColor,@hdc_mem,COLOR_NORMAL
		.endif
		invoke wsprintf,addr @szBuf,ctext("%02X"),esi
		invoke TextOut,@hdc_mem,edi,TOP_CELL,addr @szBuf,eax;eax为wsprintf返回的长度,即是2
		add edi,X_CELL_SPACE		
		inc esi
	.endw
;------------------------------------------------------------
	;HEX内容
	mov ebx,g_TopLine
	shl ebx,4
	mov g_FirstVisible,ebx
	mov g_LastVisible,ebx
	mov edx, dwFileSize
	sub edx,ebx
	mov y,HEX_TOP
	mov x,HEX_LEFT
	mov x_char,ASC_LEFT
	xor esi,esi
	mov edi,lpMemFile
@@:	
	.while esi<edx
		push edx
		xor eax,eax
		mov al,[ebx+edi]
		invoke wsprintf,addr @szBuf,ctext("%02X"),eax
		;如果是从右向左拖动鼠标,则SelEnd小于SelStart
		.if (ebx>=dwBlockStart && ebx<=dwBlockEnd)||(ebx<=dwBlockStart && ebx>=dwBlockEnd)
			;选择部分
			.if !isBlockSelMode
			@@:
				invoke SetBkColor,@hdc_mem,COLOR_SELBACK
				invoke SetTextColor,@hdc_mem,COLOR_SEL
				invoke PatBlt,@hdc_mem,x_char,y,g_asc_width,Y_CELL_SPACE,DSTINVERT
			.else
				invoke _InBlock,ebx,FALSE 
				test eax,eax
				jz @f
				jmp @b
			.endif
		.else
		@@:
			;非选择部分
			invoke SetBkColor,@hdc_mem,0ffffffh
			.if BYTE ptr [ebx+edi]==0
				mov eax,COLOR_ZERO
			.elseif esi & 1;单双列显示不同的颜色
				mov eax,COLOR_ODD
			.else
				mov eax,COLOR_EVEN
			.endif
			invoke SetTextColor,@hdc_mem,eax
		.endif
		invoke TextOut,@hdc_mem,x,y,addr @szBuf,2
		inc g_LastVisible
		add x,X_CELL_SPACE
		mov eax,@size.x
		add x_char,eax
		pop edx
		.if x==X_CELL_SPACE*16+HEX_LEFT
;=============开始新的一行===========
			mov x,HEX_LEFT
			mov x_char,ASC_LEFT
			add y,Y_CELL_SPACE
			mov eax,y
			.break .if eax>=hex_bottom
		.endif
		inc esi
		inc ebx
	.endw
	dec g_LastVisible
	add hex_bottom,Y_CELL_SPACE
	invoke _DrawDataBar,@hdc_mem,hex_bottom,@width
	xor eax,eax
	invoke BitBlt,@hdc,eax,eax,@width,@height,@hdc_mem,eax,eax,SRCCOPY 
	invoke DeleteDC,@hdc_mem	
	invoke ReleaseDC,hWnd,@hdc
	invoke DeleteObject,@hbmp
	popad
	ret
_OnPaint endp
;---------------------------------------------------
;画出光标位置
_DrawCursor proc uses ecx
local @hdc,x,y
	mov eax,dwCurPos
	.if eax>=g_FirstVisible && eax<=g_LastVisible;如果在可见范围内则画光标
		push eax
		invoke GetDC,hWnd
		mov @hdc,eax
		pop eax
		push eax
		and eax,0fh
		.if !(FLAG_ALL & FLAG_INPUTCHAR);如果光标是在HEX区
			mov ecx,X_CELL_SPACE
			mul ecx
			add eax,HEX_LEFT
			.if (FLAG_ALL & FLAG_INPUTLOWBYTE)					
				add eax,g_asc_width
			.endif
		.else
			mov ecx,g_asc_width
			mul ecx
			add eax,ASC_LEFT
		.endif
		mov x,eax
		pop eax;mov eax,dwCurPos
		shr eax,4
		sub eax,g_TopLine
		mov ecx,Y_CELL_SPACE
		mul ecx
		add eax,HEX_TOP
		mov y,eax	
		invoke PatBlt,@hdc,x,y,g_asc_width,Y_CELL_SPACE,DSTINVERT
		invoke ReleaseDC,hWnd,@hdc
	.endif
	ret
_DrawCursor endp
;------------------------------------
;显示数据
_dt macro lpfm,left,num
	invoke wsprintf,esi,lpfm,num
	invoke TextOut,@hdc,left,y,esi,eax
	endm
_DrawDataBar proc @hdc,y,w
local @szBuf[255]:BYTE,@dwCurPos,rc:RECT 
	.data
		szfmdata db '%08Xh-%08Xh %u',0
	.code
	xor eax,eax
	mov rc.left,eax
	m2m rc.top,y
	mov eax,w
	mov rc.right,eax
	push eax
	m2m rc.bottom,y
	add rc.bottom,STATUSBAR_HEIGHT
	invoke SetBkMode,@hdc,TRANSPARENT 
	invoke SetTextColor,@hdc,COLOR_NORMAL
	invoke FillRect,@hdc,addr rc,COLOR_BTNFACE+1
	invoke GetStockObject,DEFAULT_GUI_FONT 
	invoke SelectObject,@hdc,eax
	mov rc.right,150
	invoke DrawEdge,@hdc,addr rc,BDR_RAISEDINNER,BF_RECT
	mov rc.left,151
	mov rc.right,250
	invoke DrawEdge,@hdc,addr rc,BDR_RAISEDINNER,BF_RECT
	mov rc.left,251
	mov rc.right,350
	invoke DrawEdge,@hdc,addr rc,BDR_RAISEDINNER,BF_RECT
	mov rc.left,351
	mov rc.right,450
	invoke DrawEdge,@hdc,addr rc,BDR_RAISEDINNER,BF_RECT
	mov rc.left,451
	pop rc.right
	invoke DrawEdge,@hdc,addr rc,BDR_RAISEDINNER,BF_RECT
	mov edi,lpMemFile
	mov eax,dwCurPos
	add edi,eax
	.if dwFileType==FILE_RAM
		add eax,dwRamAddress
	.endif
	mov @dwCurPos,eax
	lea esi,@szBuf
	add y,5
	invoke _GetBlockSize
	_dt ctext(" %u bytes"),0,dwFileSize
	xor eax,eax
	mov al,[edi]
	_dt addr szFmDecU,155,eax
	xor eax,eax
	mov ax,[edi]
	_dt addr szFmDecU,255,eax
	_dt addr szFmDecU,355,DWORD ptr [edi]
	invoke _GetBlockSize
	mov ebx, dwBlockEnd
	.if isRam
		add ebx,dwRamAddress
	.endif
	mov ecx, dwBlockStart
	.if isRam
		add ecx,dwRamAddress
	.endif
	invoke wsprintf,esi,ctext("%08Xh-%08Xh %u"),ecx,ebx,eax
	invoke TextOut,@hdc,455,y,esi,eax
	.if g_hDlg_Data;如果数据窗口有打开的话,向它发送消息
		WM_SHOWDATA=WM_USER+5919
		invoke SendMessage,g_hDlg_Data,WM_SHOWDATA,edi,dwCurPos
	.endif
	ret
_DrawDataBar endp

⌨️ 快捷键说明

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