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

📄 dlgedit.asm

📁 汇编资源编辑器
💻 ASM
📖 第 1 页 / 共 5 页
字号:

	invoke GetWindowLong,hDEd,DEWM_MEMORY
	.if eax
		mov		esi,eax
		add		esi,sizeof DLGHEAD
		assume esi:ptr DIALOG
	  @@:
		add		esi,sizeof DIALOG
		cmp		[esi].hwnd,0
		je		@f
		cmp		[esi].hwnd,-1
		je		@b
		mov		eax,nTab
		.if eax<=[esi].tab
			inc		[esi].tab
		.endif
		jmp		@b
	  @@:
	.endif
	assume esi:nothing
	ret

InsertTab endp

DeleteTab proc uses esi,nTab:DWORD

	invoke GetWindowLong,hDEd,DEWM_MEMORY
	.if eax
		mov		esi,eax
		add		esi,sizeof DLGHEAD
		assume esi:ptr DIALOG
	  @@:
		add		esi,sizeof DIALOG
		cmp		[esi].hwnd,0
		je		@f
		cmp		[esi].hwnd,-1
		je		@b
		mov		eax,nTab
		.if eax<[esi].tab
			dec		[esi].tab
		.endif
		jmp		@b
	  @@:
	.endif
	assume esi:nothing
	ret

DeleteTab endp

FindTab proc uses esi,nTab:DWORD,hMem:HWND
	LOCAL	hCtl:HWND

	xor		edx,edx
	mov		hCtl,edx
	mov		eax,hMem
	.if eax
		mov		esi,eax
		add		esi,sizeof DLGHEAD
		assume esi:ptr DIALOG
	  @@:
		add		esi,sizeof DIALOG
		cmp		[esi].hwnd,0
		je		@f
		cmp		[esi].hwnd,-1
		je		@b
		mov		eax,nTab
		cmp		eax,[esi].tab
		jne		@b
		mov		eax,[esi].hwnd
		mov		hCtl,eax
		mov		edx,esi
	  @@:
	.endif
	mov		eax,hCtl
	assume esi:nothing
	ret

FindTab endp

UpdateDialog proc uses esi,hDlg:HWND
	LOCAL	hCtl:HWND

	invoke GetWindowLong,hDlg,GWL_USERDATA
	mov		esi,eax
	push	esi
  @@:
	mov		eax,(DIALOG ptr [esi]).hwnd
	.if eax
		.if eax!=-1
			mov		hCtl,eax
			invoke SetWindowLong,hCtl,GWL_USERDATA,esi
		.endif
		add		esi,sizeof DIALOG
		jmp		@b
	.endif
	pop		esi
  @@:
	mov		eax,(DIALOG ptr [esi]).hwnd
	.if eax
		.if eax!=-1
			mov		hCtl,eax
			invoke SetWindowPos,hCtl,HWND_TOP,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE
		.endif
		add		esi,sizeof DIALOG
		jmp		@b
	.endif
	mov		esi,offset hSizeing
	.while esi<offset hSizeing+8*4
		.if dword ptr [esi]
			invoke SetWindowPos,dword ptr [esi],HWND_TOP,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE
		.endif
		add		esi,4
	.endw
	ret

UpdateDialog endp

FindParent proc hWin:HWND

  @@:
	invoke GetWindowLong,hWin,GWL_USERDATA
	mov		eax,(DIALOG ptr [eax]).ntype
	.if !eax
		mov		eax,hWin
		ret
	.endif
	invoke GetParent,hWin
	mov		hWin,eax
	jmp		@b

FindParent endp

FetchParent proc hWin:HWND

	invoke GetWindowLong,hWin,GWL_USERDATA
	mov		eax,(DIALOG ptr [eax]).hpar
	ret

FetchParent endp

GetTypePtr proc nType:DWORD

	push	edx
	mov		eax,size TYPES
	mov		edx,nType
	mul		edx
	add		eax,offset ctltypes
	pop		edx
	ret

GetTypePtr endp

SetChanged proc fChanged:DWORD,hWin:HWND
	LOCAL	hDC:HDC
	LOCAL	hBr:DWORD
	LOCAL	rect:RECT

	.if !hWin
		mov		eax,hDEd
		mov		hWin,eax
	.endif
	invoke GetWindowLong,hWin,DEWM_MEMORY
	.if eax
		.if fChanged==2
			push	(DLGHEAD ptr [eax]).changed
			pop		fChanged
		.else
			push	fChanged
			pop		(DLGHEAD ptr [eax]).changed
		.endif
		invoke GetDC,hWin
		mov		hDC,eax
		.if fChanged
			mov		eax,40A040h
		.else
			invoke GetWindowLong,hWin,DEWM_READONLY
			.if eax
				mov		eax,0FFh
			.else
				invoke GetSysColor,COLOR_WINDOW
			.endif
		.endif
		invoke CreateSolidBrush,eax
		mov		hBr,eax
		mov		rect.left,1
		mov		rect.top,1
		mov		rect.right,6
		mov		rect.bottom,6
		invoke FillRect,hDC,addr rect,hBr
		invoke ReleaseDC,hWin,hDC
		invoke DeleteObject,hBr
	.endif
	invoke NotifyParent
	ret

SetChanged endp

UpdateSize proc uses esi,hWin:HWND,x:DWORD,y:DWORD,ccx:DWORD,ccy:DWORD
	LOCAL	fChanged:DWORD

	mov		fChanged,FALSE
	invoke GetWindowLong,hWin,GWL_USERDATA
	mov		esi,eax
	assume esi:ptr DIALOG
	;Posotion & Size
	mov		eax,[esi].x
	.if eax!=x
		mov		fChanged,TRUE
	.endif
	mov		eax,[esi].y
	.if eax!=y
		mov		fChanged,TRUE
	.endif
	mov		eax,[esi].ccx
	.if eax!=ccx
		mov		fChanged,TRUE
	.endif
	mov		eax,[esi].ccy
	.if eax!=ccy
		mov		fChanged,TRUE
	.endif
	push	x
	pop		[esi].x
	push	y
	pop		[esi].y
	push	ccx
	pop		[esi].ccx
	push	ccy
	pop		[esi].ccy
	.if fChanged
		xor		eax,eax
		mov		[esi].dux,eax
		mov		[esi].duy,eax
		mov		[esi].duccx,eax
		mov		[esi].duccy,eax
		invoke SetChanged,TRUE,0
	.endif
	assume esi:nothing
	ret

UpdateSize endp

DestroySizeingRect proc uses edi

	mov		edi,offset hSizeing
	mov		ecx,8
  @@:
	mov		eax,[edi]
	.if eax
		push	ecx
		invoke DestroyWindow,eax
		pop		ecx
	.endif
	xor		eax,eax
	mov		[edi],eax
	add		edi,4
	loop	@b
	mov		hReSize,0
	invoke PropertyList,0
	invoke SendMessage,hDEd,WM_LBUTTONDOWN,0,0
	ret

DestroySizeingRect endp

DialogTltSize proc uses esi,ccx:DWORD,ccy:DWORD
	LOCAL	buffer[32]:BYTE
	LOCAL	pt:POINT
	LOCAL	hDC:HDC
	LOCAL	len:DWORD
	LOCAL	hOldFont:DWORD

	.if fShowSizePos
		invoke GetCursorPos,addr mpt
		add		mpt.y,15
		add		mpt.x,15
		lea		esi,buffer
		mov		al,' '
		mov		[esi],al
		inc		esi
		invoke ResEdBinToDec,ccx,esi
		invoke lstrlen,esi
		add		esi,eax
		mov		al,','
		mov		[esi],al
		inc		esi
		mov		al,' '
		mov		[esi],al
		inc		esi
		invoke ResEdBinToDec,ccy,esi
		invoke lstrlen,esi
		add		esi,eax
		mov		eax,'  '
		mov		[esi],eax
		invoke GetDC,hTlt
		mov		hDC,eax
		invoke SendMessage,hTlt,WM_GETFONT,0,0
		invoke SelectObject,hDC,eax
		mov		hOldFont,eax
		invoke lstrlen,addr buffer
		mov		len,eax
		invoke GetTextExtentPoint32,hDC,addr buffer,len,addr pt
		invoke SelectObject,hDC,hOldFont
		invoke ReleaseDC,hTlt,hDC
		invoke SetWindowText,hTlt,addr buffer
		invoke MoveWindow,hTlt,mpt.x,mpt.y,pt.x,15,TRUE
		invoke ShowWindow,hTlt,SW_SHOWNA
		invoke InvalidateRect,hTlt,NULL,TRUE
		invoke UpdateWindow,hTlt
	.endif
	ret

DialogTltSize endp

SizeX proc nInc:DWORD

	.if fSnapToGrid
		xor		edx,edx
		idiv	Gridcx
		imul	Gridcx
		add		eax,nInc
	.endif
	ret

SizeX endp

SizeY proc nInc:DWORD

	.if fSnapToGrid
		xor		edx,edx
		idiv	Gridcy
		imul	Gridcy
		add		eax,nInc
	.endif
	ret

SizeY endp

SizeingProc proc uses edi,hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
	LOCAL	nInx:DWORD
	LOCAL	pt:POINT
	LOCAL	parpt:POINT
	LOCAL	fChanged:DWORD

	.if uMsg>=WM_MOUSEFIRST && uMsg<=WM_MOUSELAST
		invoke GetWindowLong,hWin,GWL_USERDATA
		mov		nInx,eax
		shr		nInx,16
		and		eax,0FFFFh
		.if eax
			invoke LoadCursor,0,eax
			invoke SetCursor,eax
			.if uMsg==WM_LBUTTONDOWN
				.if fSizeing==FALSE
					mov		fSizeing,TRUE
					invoke PropertyList,0
					mov		eax,lParam
					and		eax,0FFFFh
					cwde
					mov		MousePtDown.x,eax
					mov		eax,lParam
					shr		eax,16
					cwde
					mov		MousePtDown.y,eax
					mov		ParPt.x,0
					mov		ParPt.y,0
					invoke GetWindowLong,hDEd,DEWM_DIALOG
					mov		edx,eax
					invoke ClientToScreen,edx,addr ParPt
					invoke GetWindowRect,hReSize,addr CtlRect
					invoke GetWindowLong,hReSize,GWL_USERDATA
					mov		edi,eax
					assume edi:ptr DIALOG
					mov		eax,[edi].ntype
					.if eax==7 || eax==24
						mov		eax,[edi].ccy
						add		eax,CtlRect.top
						mov		CtlRect.bottom,eax
					.endif
					invoke CopyRect,addr SizeRect,addr CtlRect
					invoke DlgDrawRect,hReSize,addr SizeRect,0,0
					invoke SetCapture,hWin
					invoke SendMessage,hWin,WM_MOUSEMOVE,wParam,lParam
				.endif
			.elseif uMsg==WM_LBUTTONUP
				.if fSizeing
					mov		fSizeing,FALSE
					invoke ReleaseCapture
					invoke DlgDrawRect,hReSize,addr SizeRect,2,0
					mov		eax,SizeRect.left
					sub		SizeRect.right,eax
					mov		eax,SizeRect.top
					sub		SizeRect.bottom,eax
					mov		eax,ParPt.x
					sub		SizeRect.left,eax
					mov		eax,ParPt.y
					sub		SizeRect.top,eax
					invoke GetWindowLong,hReSize,GWL_USERDATA
					mov		edi,eax
					assume edi:ptr DIALOG
					mov		fChanged,FALSE
					mov		eax,[edi].ntype
					.if eax
						mov		eax,SizeRect.left
						.if eax!=[edi].x
							mov		[edi].x,eax
							mov		fChanged,TRUE
						.endif
						mov		eax,SizeRect.top
						.if eax!=[edi].y
							mov		[edi].y,eax
							mov		fChanged,TRUE
						.endif
					.endif
					mov		eax,SizeRect.right
					.if eax!=[edi].ccx
						mov		[edi].ccx,eax
						mov		fChanged,TRUE
					.endif
					mov		eax,SizeRect.bottom
					.if eax!=[edi].ccy
						mov		[edi].ccy,eax
						mov		fChanged,TRUE
					.endif
					.if fChanged
						xor		eax,eax
						mov		[edi].dux,eax
						mov		[edi].duy,eax
						mov		[edi].duccx,eax
						mov		[edi].duccy,eax
						invoke UpdateCtl,hReSize
						mov		hReSize,eax
					.else
						invoke PropertyList,hReSize
					.endif
					invoke ShowWindow,hTlt,SW_HIDE
					assume edi:nothing
					xor		eax,eax
					ret
				.endif
			.elseif uMsg==WM_MOUSEMOVE
				.if fSizeing
					mov		parpt.x,0
					mov		parpt.y,0
					invoke GetWindowLong,hDEd,DEWM_DIALOG
					mov		edx,eax
					invoke ClientToScreen,edx,addr parpt
					invoke CopyRect,addr SizeRect,addr CtlRect
					mov		eax,lParam
					and		eax,0FFFFh
					cwde
					sub		eax,MousePtDown.x
					mov		pt.x,eax
					mov		eax,lParam
					shr		eax,16
					cwde
					sub		eax,MousePtDown.y
					mov		pt.y,eax
					mov		eax,nInx
					.if eax==0
						mov		eax,pt.x
						add		SizeRect.left,eax
						mov		eax,SizeRect.left
						sub		eax,parpt.x
						invoke SizeX,0
						add		eax,parpt.x
						mov		SizeRect.left,eax
						mov		eax,pt.y
						add		SizeRect.top,eax
						mov		eax,SizeRect.top
						sub		eax,parpt.y
						invoke SizeY,0
						add		eax,parpt.y
						mov		SizeRect.top,eax
					.elseif eax==1
						mov		eax,pt.y
						add		SizeRect.top,eax
						mov		eax,SizeRect.top
						sub		eax,parpt.y
						invoke SizeY,0
						add		eax,parpt.y
						mov		SizeRect.top,eax
					.elseif eax==2
						mov		eax,pt.x
						add		SizeRect.right,eax
						mov		eax,SizeRect.right
						sub		eax,SizeRect.left
						invoke SizeX,1

						add		eax,SizeRect.left
						mov		SizeRect.right,eax
						mov		eax,pt.y
						add		SizeRect.top,eax
						mov		eax,SizeRect.top
						sub		eax,parpt.y
						invoke SizeY,0
						add		eax,parpt.y
						mov		SizeRect.top,eax
					.elseif eax==3
						mov		eax,pt.x
						add		SizeRect.left,eax
						mov		eax,SizeRect.left
						sub		eax,parpt.x
						invoke SizeX,0
						add		eax,parpt.x




						mov		SizeRect.left,eax
					.elseif eax==4
						mov		eax,pt.x
						add		SizeRect.right,eax
						mov		eax,SizeRect.right
						sub		eax,SizeRect.left
						invoke SizeX,1
						add		eax,SizeRect.left
						mov		SizeRect.right,eax
					.elseif eax==5
						mov		eax,pt.x
						add		SizeRect.left,eax
						mov		eax,SizeRect.left
						sub		eax,parpt.x
						invoke SizeX,0
						add		eax,parpt.x
						mov		SizeRect.left,eax
						mov		eax,pt.y
						add		SizeRect.bottom,eax
						mov		eax,SizeRect.bottom
						sub		eax,SizeRect.top
						invoke SizeY,1
						add		eax,SizeRect.top
						mov		SizeRect.bottom,eax
					.elseif eax==6
						mov		eax,pt.y
						add		SizeRect.bottom,eax
						mov		eax,SizeRect.bottom
						sub		eax,SizeRect.top
						invoke SizeY,1
						add		eax,SizeRect.top
						mov		SizeRect.bottom,eax
					.elseif eax==7
						mov		eax,pt.x
						add		SizeRect.right,eax
						mov		eax,SizeRect.right
						sub		eax,SizeRect.left
						invoke SizeX,1
						add		eax,SizeRect.left

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -