📄 wndproc.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 OnInitPopupMenu.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
invoke _OnPaint,hWin,wParam,lParam
.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_SIZE
call _SetPages
.elseif eax==WM_KEYDOWN
invoke _OnKeyDown ,wParam,lParam
.elseif eax==WM_TIMER
invoke _DrawCursor
.elseif eax==WM_INITMENUPOPUP
_OnInitPopupMenu
.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
call _SetPages
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
.endif
_ret_:
xor eax,eax
ret
WndProc endp
;-------------------------------------------------
;-------------------------------------------
_OnVScroll proc wParam,lParam
local sci:SCROLLINFO
push ebx
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
sub ebx,dwVisibleLines
.elseif ax==SB_PAGEDOWN
add ebx,dwVisibleLines
.elseif ax==SB_THUMBPOSITION || ax==SB_THUMBTRACK
mov ebx,sci.nTrackPos
.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
pop ebx
ret
_OnVScroll endp
;------------------------------------------
_OnLeftButtonDown proc uses edx wParam,lParam
;鼠标左键按下,重新设置dwBlockStart(如果按住Shift则不设置dwBlockStart)和dwBlockEnd
invoke _Point2Pos,lParam
.if dl>=2 && dh==0
.if !(wParam & MK_SHIFT)
mov dwBlockStart,eax
.endif
mov dwBlockEnd,eax
or FLAG_ALL,FLAG_DRAGING
and FLAG_ALL,not (FLAG_INPUTLOWBYTE or FLAG_BLOCKSEL)
.endif
ret
_OnLeftButtonDown endp
;-------------------------------------
_OnMouseMove proc uses edx wParam,lParam
;鼠标移动的时候,如果有按住左键,则设置选择区
.if FLAG_ALL & FLAG_DRAGING
invoke _Point2Pos,lParam
.if dl>=2 && dh==0
mov dwBlockEnd,eax
.endif
call _ReDraw
.endif
ret
_OnMouseMove endp
;---------------------------------------
_OnLeftButtonUp proc uses edx wParam,lParam
;左键松开,如果不是处于拖动状态,则重新设置dwBlockStart,dwBlockEnd
invoke _Point2Pos,lParam
.if dl>=2 && dh==0
.if eax!=dwCurPos
m2m dwPrePos,dwCurPos
.endif
mov dwBlockEnd,eax
mov dwCurPos,eax
.if !(FLAG_ALL & FLAG_DRAGING)
mov dwBlockStart,eax
.endif
;避免[开始]在[结束]的后面
.if eax<dwBlockStart
xchg eax,dwBlockStart
mov dwBlockEnd,eax
.endif
and FLAG_ALL,not FLAG_DRAGING
call _ReDraw
.endif
ret
_OnLeftButtonUp endp
;------------------------------------------------------------------------------
_OnRightButtonUp proc wParam,lParam
;右键弹出菜单
Local @pt:POINTL
.if !(FLAG_ALL & FLAG_DRAGING)
invoke GetCursorPos,addr @pt
invoke GetSubMenu,hMenu,1
invoke TrackPopupMenu,eax,TPM_LEFTBUTTON or TPM_RIGHTBUTTON ,@pt.x,@pt.y,0,hWnd,NULL
.endif
ret
_OnRightButtonUp endp
;---------------------------
_OnKeyDown proc uses ecx wParam,lParam
;处理翻页,方向键移动光标
mov eax,wParam
mov ecx,dwCurPos
.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_HOME ;行的结束
and ecx,not 0fh
.elseif eax==VK_END ;行的开始
or ecx,0fh
.elseif eax==VK_PGUP;向上/下翻页,不用设置光标
invoke SendMessage,hWnd,WM_VSCROLL ,SB_PAGEUP,0
ret
.elseif eax==VK_PGDN
invoke SendMessage,hWnd,WM_VSCROLL ,SB_PAGEDOWN ,0
ret
.else
ret
.endif
invoke _SetPos,ecx
ret
_OnKeyDown endp
;-----------------------------------
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -