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

📄 wndproc.asm

📁 一个十六进制编辑器源代码,cool!
💻 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 + -