📄 dlgedit.asm
字号:
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 + -