📄 xhex.asm
字号:
;----------------
;编译模式="EXE"
;----------------
;制表符的长度请设置为3
;=================================================
.386
.Model Flat, StdCall
Option Casemap :None
include xhex.inc
.CODE
START:
invoke _InitCommCtl
invoke GetModuleHandle,NULL
mov hInstance, eax
invoke WinMain,eax,0,0,0
invoke ExitProcess,0
;=============================================
_InitApp proc uses esi edi ecx
local lf:LOGFONTA
invoke GetMenu,hWnd
mov hMenu,eax
call _IniInit
invoke _IniGetStr,0,ctext("font")
.if eax==0
invoke lstrcpy,lpIniBuf,ctext("Fixedsys")
.endif
invoke RtlZeroMemory,addr lf,sizeof LOGFONTA
mov lf.lfWeight,FW_NORMAL
mov lf.lfCharSet,DEFAULT_CHARSET
mov lf.lfOutPrecision,OUT_DEFAULT_PRECIS
mov lf.lfClipPrecision,CLIP_DEFAULT_PRECIS
mov lf.lfQuality,PROOF_QUALITY
mov lf.lfPitchAndFamily,DEFAULT_PITCH
invoke lstrcpy,addr lf.lfFaceName,lpIniBuf
invoke CreateFontIndirect,addr lf
mov hFont,eax
invoke LoadLibrary,ctext("xHexCom.dll")
mov hInstDll,eax
call _GetPrivileges
call _InitOpenSaveDlg
call _InitUndo
invoke _HisMenuLoad
invoke GetCmdLine,TRUE
.if eax<=1
@@:
invoke _NewFile,0,sizeofabout
mov ecx,sizeofabout
lea esi,szAboutStr
mov edi,lpMemFile
rep movsb
.else
invoke _OpenFile,lpCmdLine[1*4]
test eax,eax
jz @b
.endif
call CmdLineEnd
invoke SetTimer,hWnd,1000,700,0;申请计时器,作为闪烁光标
ret
_InitApp endp
;---------------------------------------------------
_AppEnd proc
call _IniEnd
call _UndoEnd
invoke KillTimer,hWnd,1000
invoke DeleteObject,hFont
invoke FreeLibrary,hInstDll
call _Release
call _del_readme
ret
_AppEnd endp
;----------------------------------------
;释放内存
_Release proc
.if lpMemFile
.if dwFileType ==FILE_MAP
invoke UnmapViewOfFile,lpMemFile
.else
__free lpMemFile
.endif
mov lpMemFile,0
.endif
ret
_Release endp
;----------------------------------------------------
_SetWindowTitle proc @hwnd,lpBuf
local @szBuf[255]:BYTE
lea esi,@szBuf
mov DWORD ptr [esi],'xeHx'
mov BYTE ptr [esi+4],' '
add esi,5
invoke _GetFileTitle,lpBuf,esi
.if eax==0
invoke lstrcpy,esi,lpBuf
.elseif dwFileType==FILE_MAP
invoke lstrcat,esi,ctext(" [直接模式]")
.endif
invoke SetWindowText,hWnd,addr @szBuf
call _DrawCursor
ret
_SetWindowTitle endp
;---------------------------------------------------
_InitData proc lParam
local sci:SCROLLINFO
;初始化数据,决定滚动条的数值
mov eax,dwFileSize
push lpMemFile
pop lpMemFileEnd
add lpMemFileEnd,eax
dec lpMemFileEnd
shr eax,4;eax=eax/16
mov sci.nMax,eax
dec eax
mov g_TotalLine,eax
xor eax,eax
mov g_TopLine,eax
mov dwBlockStart,eax
mov dwBlockEnd,eax
mov dwCurPos,eax
mov sci.cbSize,sizeof SCROLLINFO
mov sci.fMask,SIF_POS or SIF_RANGE
mov sci.nPos,eax
mov sci.nMin,eax
mov dwPrePos,eax
invoke SetScrollInfo,hWnd,SB_VERT ,addr sci,TRUE
call _SetPages
call _InitUndo
;将历史位置缓冲区回复
ret
_InitData endp
;-------------------------------------------------
;根据窗体的高度来求出一页有多少行
;设置滚动条的nPage可以设置滚动块的大小(不使用)
_SetPages proc uses ecx edx
local @rc:RECT
;local sci:SCROLLINFO
;mov sci.cbSize,sizeof SCROLLINFO
;mov sci.fMask,SIF_ALL
;invoke GetScrollInfo,hWnd,SB_VERT ,addr sci
invoke GetClientRect,hWnd,addr @rc
mov eax,@rc.bottom
sub eax,@rc.top
sub eax,STATUSBAR_HEIGHT+HEX_TOP
mov ecx,Y_CELL_SPACE
xor edx,edx
div ecx
mov dwVisibleLines, eax
;mov sci.nPage,eax
;invoke SetScrollInfo,hWnd,SB_VERT ,addr sci,TRUE
ret
_SetPages endp
;--------------------------------------
;设置位置
_SetPos proc uses edi nPos
mov eax,nPos
.if SDWORD ptr eax<0
xor eax ,eax
.elseif eax>=dwFileSize
mov eax,dwFileSize
dec eax
.endif
mov dwBlockStart,eax
mov dwBlockEnd,eax
mov dwCurPos,eax
call _Scroll2Visible
ret
_SetPos endp
;----------------------------------------------------
;滚动到可见部分
_Scroll2Visible proc
mov eax,dwBlockStart
.if eax<g_FirstVisible || eax>g_LastVisible
;如果超出可见范围,滚动至可见部分
shr eax,4
mov g_TopLine,eax
shl eax,4
.endif
invoke SetScrollPos,hWnd,SB_VERT ,g_TopLine,TRUE
call _ReDraw
ret
_Scroll2Visible endp
;//----------------------------
;_Point2Pos
;将鼠标的坐标转换为文件绝对位置
;传入:鼠标的坐标
;返回:
;eax:文件的绝对位置
;dl:鼠标所在的区域
;0-偏移(00..01..0F),
;1-地址
;2-HEX显示区
;3-ASC显示区
;dh为1则表示当前位置超出文件的大小或超出可见部分
;-------------------------------------------------//
_Point2Pos proc uses ecx esi edi lParam
Local nCol,nRow,x,y
Local x_hex_left,y_hex_top,x_cell
mov eax,lParam
mov ecx,eax
movzx eax,ax
mov x,eax
shr ecx,16
mov y,ecx
.if y<HEX_TOP+TOP_CELL
mov eax,dwBlockStart
mov edx,0;偏移区 ;鬼
ret
.elseif x<HEX_LEFT
mov eax,dwBlockStart
mov edx,1;地址
ret
.elseif x>=ASC_LEFT
mov edi,ASC_LEFT
mov esi,g_asc_width;ASC字符的宽度
push DWORD ptr 3;ASC
jmp _calc_x_y_
.else
mov edi,HEX_LEFT
mov esi,X_CELL_SPACE
push DWORD ptr 2
_calc_x_y_:
;所在列
mov eax,lParam
movzx eax,ax
sub eax,edi
test eax,eax
jge @f
mov nCol,0
jmp _calc_y_
@@:
xor edx,edx
mov ecx,esi
div ecx
mov nCol,eax
;--------所在行------
_calc_y_:
mov eax,lParam
shr eax,16
sub eax,HEX_TOP+TOP_CELL
test eax,eax
jge @f
mov nRow,0
xor eax,eax
jmp _calc_pos_
@@:
xor edx,edx
mov cx,Y_CELL_SPACE
div cx
mov nRow,eax
;--------绝对位置--- pos=y*16+x ----
_calc_pos_:
shl eax,4
add eax,nCol
mov ecx,g_TopLine
shl ecx,4;ecx=当前可见的第一个地址(即最左上角的那个)
add eax,ecx
pop edx
.endif
.if edx==3
or FLAG_ALL,FLAG_INPUTCHAR
.else
and FLAG_ALL,not FLAG_INPUTCHAR
.endif
;PrintHex g_LastVisible
.if eax>=dwFileSize || eax>g_LastVisible
mov eax,dwCurPos;dwFileSize
mov dh,1
.endif
ret
_Point2Pos endp
;-------------------------------------------------------------------------------
;显示错误提示
_ShowError proc uses ebx
local err_code,lang_ID,@szBuf[512]:BYTE
invoke GetLastError
mov err_code,eax
lea ebx,@szBuf
invoke GetSystemDefaultLangID
invoke FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,0,err_code,eax,ebx,512,0
invoke MessageBox,hWnd,ebx,0,MB_ICONSTOP
xor eax,eax
ret
_ShowError endp
;---------------------------------------------
;是否被修改
_GetModify proc
.if (FLAG_ALL & FLAG_FILECHANGE) && (dwFileType != FILE_MAP)
invoke MessageBox,hWnd,addr szModified,addr szWindowName,MB_YESNOCANCEL or 20h
push eax
.if eax==IDYES
invoke SendMessage,hWnd,WM_COMMAND ,IDM_FILE_SAVE,0
.endif
.else
push IDNO
.endif
pop eax
ret
_GetModify endp
;-----------------------------------------------
;重画
_ReDraw proc uses eax
local rc:RECT
invoke GetWindowRect,hWnd,addr rc
add rc.top,HEX_TOP+TOP_CELL
sub rc.bottom,STATUSBAR_HEIGHT
invoke InvalidateRect,hWnd,addr rc,0
ret
_ReDraw endp
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -