📄 on_paint.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 + -