📄 wndprocbak.asm
字号:
;---------------------------------------------------------------------------
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
_OnVScroll proto:DWORD ,:DWORD
_OnLeftButtonDown proto:DWORD ,:DWORD
_OnLeftButtonUp proto:DWORD ,:DWORD
_OnRightButtonUp proto:DWORD ,:DWORD
_OnMouseMove proto:DWORD ,:DWORD
_OnKeyDown proto:DWORD ,:DWORD
_SetPos proto:DWORD
_Point2Pos proto:DWORD
include on_char.asm
include show_data.asm
include copy.asm
include struct.asm
include hash\hash.asm
include cmpfile.asm
include on_command.asm
.code
;------------------------------
WndProc proc hWin,uMsg,wParam ,lParam
Local @ps:PAINTSTRUCT
local @szBuf[255]:BYTE
mov eax,uMsg
.if eax==WM_CREATE
m2m hWnd,hWin
.elseif eax==WM_COMMAND
_OnCommand
.elseif eax==WM_CLOSE
call _GetModify
.if eax!=IDCANCEL
invoke DestroyWindow,hWin
.endif
.elseif eax==WM_DESTROY
call _AppEnd
invoke PostQuitMessage,NULL
.elseif eax==WM_PAINT
invoke BeginPaint,hWin,addr @ps
.if lpMemFile
call _OnPaint
.endif
invoke EndPaint,hWin,addr @ps
.elseif eax==WM_VSCROLL
invoke _OnVScroll,wParam,lParam
.elseif eax==WM_LBUTTONDOWN
invoke _OnLeftButtonDown,wParam,lParam
.elseif eax==WM_LBUTTONUP
invoke _OnLeftButtonUp,wParam,lParam
.elseif eax==WM_RBUTTONUP
invoke _OnRightButtonUp,wParam,lParam
.elseif eax==WM_MOUSEMOVE
invoke _OnMouseMove,wParam,lParam
.elseif eax==WM_CHAR
_OnChar
.elseif eax==WM_MOUSEWHEEL
mov eax,wParam
shr eax,16
.if SWORD ptr ax<0
invoke SendMessage,hWin,WM_VSCROLL ,SB_LINEDOWN ,0
.else
invoke SendMessage,hWin,WM_VSCROLL ,SB_LINEUP ,0
.endif
.elseif eax==WM_KEYDOWN
invoke _OnKeyDown ,wParam,lParam
.elseif eax==WM_TIMER
xor dwColorFlash,COLOR_CURSOR
call _ReDraw
.elseif eax==WM_INITMENUPOPUP
push edi
.if dwFileType==FILE_NORMAL
xor edi,edi;mov edi,MF_ENABLED
.else
mov edi,MF_GRAYED
.endif
;插入,删除只有在正常模式才能使用
invoke EnableMenuItem,hMenu,40011,edi
invoke EnableMenuItem,hMenu,40012,edi
invoke EnableMenuItem,hMenu,40010,edi
invoke EnableMenuItem,hMenu,40015,edi
pop edi
.elseif eax==WM_DROPFILES
invoke DragQueryFile,wParam,0,addr @szBuf,255
call _GetModify
.if eax!=IDCANCEL
invoke _OpenFile,addr @szBuf
.endif
.elseif eax==WM_SIZE
invoke SendMessage,hStatusBar,WM_SIZE ,wParam,lParam
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
.endif
_ret_:
xor eax,eax
ret
WndProc endp
;-------------------------------------------------
;-------------------------------------------
_OnVScroll proc wParam,lParam
local sci:SCROLLINFO
pushad
mov sci.cbSize,sizeof SCROLLINFO
mov sci.fMask,SIF_ALL
invoke GetScrollInfo,hWnd,SB_VERT,addr sci
mov ebx,sci.nPos
mov eax,wParam
.if ax==SB_LINEUP
dec ebx
.elseif ax==SB_LINEDOWN
inc ebx
.elseif ax==SB_PAGEUP
mov eax,g_LastVisible
sub eax,g_FirstVisible
inc eax
sub ebx,eax
.elseif ax==SB_PAGEDOWN
mov eax,g_LastVisible
sub eax,g_FirstVisible
inc eax
add ebx,eax
.elseif ax==SB_THUMBPOSITION || ax==SB_THUMBTRACK
mov ebx,sci.nTrackPos;和上2句同效
.endif
.if sdword ptr ebx<0
xor ebx,ebx
.elseif ebx>g_TotalLine
mov ebx,g_TotalLine
.endif
mov g_TopLine,ebx
mov sci.fMask,SIF_POS
mov sci.nPos,ebx
invoke SetScrollInfo,hWnd,SB_VERT ,addr sci,TRUE
call _ReDraw
popad
ret
_OnVScroll endp
;------------------------------------------
_OnLeftButtonDown proc uses edx wParam,lParam
;鼠标左键按下,重新设置dwBlockStart(如果按住Shift则不设置dwBlockStart)和dwBlockEnd
mov m_y,hiword(lParam)
mov m_x,loword(lParam)
invoke _Point2Pos,lParam
.if edx>=2
.if !(wParam & MK_SHIFT)
mov dwBlockStart,eax
.endif
mov dwBlockEnd,eax
or FLAG_ALL,FLAG_DRAGING
and FLAG_ALL,not FLAG_INPUTLOWBYTE
and FLAG_ALL,not FLAG_BLOCKSEL
.endif
ret
_OnLeftButtonDown endp
;-------------------------------------
_OnMouseMove proc uses edx wParam,lParam
;鼠标移动的时候,如果有按住左键,则设置选择区
local @szBuf[100]:BYTE
.if FLAG_ALL & FLAG_DRAGING
invoke _Point2Pos,lParam
.if edx>=2
mov dwBlockEnd,eax
call _ReDraw
.endif
.endif
ret
_OnMouseMove endp
;---------------------------------------
_OnLeftButtonUp proc uses edx wParam,lParam
;左键松开,如果不是处于拖动状态,则重新设置dwBlockStart,dwBlockEnd
invoke _Point2Pos,lParam
.if edx>=2
m2m dwPrePos,dwCurPos
mov dwBlockEnd,eax
mov dwCurPos,eax
.if !(FLAG_ALL & FLAG_DRAGING)
mov dwBlockStart,eax
.endif
.if eax<dwBlockStart
push eax
push dwBlockStart
pop dwBlockEnd
pop dwBlockStart
.endif
and FLAG_ALL,not FLAG_DRAGING
call _ReDraw
call _ShowData
.endif
ret
_OnLeftButtonUp endp
;------------------------------------------------------------------------------
_OnRightButtonUp proc wParam,lParam
;右键弹出菜单
Local @pt:POINTL
invoke GetCursorPos,addr @pt
invoke GetSubMenu,hMenu,1
invoke TrackPopupMenu,eax,TPM_LEFTBUTTON or TPM_RIGHTBUTTON ,@pt.x,@pt.y,0,hWnd,NULL
ret
_OnRightButtonUp endp
;---------------------------
_OnKeyDown proc uses ecx ebx wParam,lParam
;处理翻页,方向键移动光标
mov eax,wParam
mov ecx,dwCurPos
mov ebx,g_LastVisible
sub ebx,g_FirstVisible
inc ebx;ebx为一页
.if eax==VK_UP
sub ecx,10h
.elseif eax==VK_DOWN
add ecx,10h
.elseif eax==VK_LEFT
dec ecx
.elseif eax==VK_RIGHT
inc ecx
.elseif eax==VK_PGUP
sub ecx,ebx
.elseif eax==VK_PGDN
add ecx,ebx
.elseif eax==VK_HOME
and ecx,not 0fh
.elseif eax==VK_END
or ecx,0fh
.else
xor eax,eax
ret
.endif
invoke _SetPos,ecx
ret
_OnKeyDown endp
;-----------------------------------
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -