📄 property.asm
字号:
dd -1,0
dd -1 xor (DS_CENTER or DS_CENTERMOUSE),DS_CENTERMOUSE
dd -1,0
OriePgb db 'Horizontal,Vertical',0
dd -1 xor PBS_VERTICAL,0
dd -1,0
dd -1 xor PBS_VERTICAL,PBS_VERTICAL
dd -1,0
OrieUdn db 'Vertical,Horizontal',0
dd -1 xor UDS_HORZ,0
dd -1,0
dd -1 xor UDS_HORZ,UDS_HORZ
dd -1,0
SortLsv db 'None,Ascending,Descending',0
dd -1 xor (LVS_SORTASCENDING or LVS_SORTDESCENDING),0
dd -1,0
dd -1 xor (LVS_SORTASCENDING or LVS_SORTDESCENDING),LVS_SORTASCENDING
dd -1,0
dd -1 xor (LVS_SORTASCENDING or LVS_SORTDESCENDING),LVS_SORTDESCENDING
dd -1,0
OwneCbo db 'None,Fixed,Variable',0
dd -1 xor (CBS_OWNERDRAWFIXED or CBS_OWNERDRAWVARIABLE),0
dd -1,0
dd -1 xor (CBS_OWNERDRAWFIXED or CBS_OWNERDRAWVARIABLE),CBS_OWNERDRAWFIXED
dd -1,0
dd -1 xor (CBS_OWNERDRAWFIXED or CBS_OWNERDRAWVARIABLE),CBS_OWNERDRAWVARIABLE
dd -1,0
szPropErr db 'Invalid property value.',0
szStyleWarn db 'WARNING!!',0Dh,'Some styles can make dialog editor unstable. Save before use.',0
StyleEx dd 0
StyleOfs dd 0
StyleTxt dd 0
StylePos dd 0
szStyleExTxt db ',,,,'
db ',,,,'
db ',,,,'
db ',WS_EX_APPWINDOW,WS_EX_STATICEDGE,WS_EX_CONTROLPARENT,'
db ',WS_EX_LEFTSCROLLBAR,WS_EX_RTLREADING,WS_EX_RIGHT,'
db ',WS_EX_CONTEXTHELP,WS_EX_CLIENTEDGE,WS_EX_WINDOWEDGE,'
db 'WS_EX_TOOLWINDOW,WS_EX_MDICHILD,WS_EX_TRANSPARENT,WS_EX_ACCEPTFILES,'
db 'WS_EX_TOPMOST,WS_EX_NOPARENTNOTIFY,,WS_EX_DLGMODALFRAME',0
szStyleTxt db 'WS_POPUP,WS_CHILD,WS_MINIMIZE,WS_VISIBLE,'
db 'WS_DISABLED,WS_CLIPSIBLINGS,WS_CLIPCHILDREN,WS_MAXIMIZE,'
db 'WS_BORDER,WS_DLGFRAME,WS_VSCROLL,WS_HSCROLL,'
db 'WS_SYSMENU,WS_THICKFRAME,WS_GROUP,WS_TABSTOP',0
.data?
lbtxtbuffer db 4096 dup(?)
szLbString db 64 dup(?)
hPrpCboDlg dd ?
OldPrpCboDlgProc dd ?
hPrpLstDlg dd ?
OldPrpLstDlgProc dd ?
hPrpEdtDlgCld dd ?
OldPrpEdtDlgCldProc dd ?
hPrpLstDlgCld dd ?
OldPrpLstDlgCldProc dd ?
hPrpBtnDlgCld dd ?
OldPrpBtnDlgCldProc dd ?
tempbuff db 256 dup(?)
.code
PropertyStyleTxt proc hWin:HWND,lpBuff:DWORD
LOCAL buffer[1024]:BYTE
LOCAL buffer1[64]:BYTE
mov eax,StyleOfs
.if StyleEx
push eax
invoke lstrcpy,addr buffer,addr szStyleExTxt
pop eax
mov eax,(DIALOG ptr [eax]).exstyle
.else
push eax
invoke lstrcpy,addr buffer,addr szStyleTxt
pop eax
mov eax,(DIALOG ptr [eax]).style
.endif
mov ecx,32
mov edx,lpBuff
.while ecx
mov byte ptr [edx],'0'
shl eax,1
jnc @f
mov byte ptr [edx],'1'
@@:
inc edx
dec ecx
.endw
mov byte ptr [edx],0
invoke SetDlgItemText,hWin,IDC_EDTSTYLE,lpBuff
mov eax,StylePos
inc eax
invoke SendDlgItemMessage,hWin,IDC_EDTSTYLE,EM_SETSEL,StylePos,eax
mov eax,StylePos
inc eax
.while eax
push eax
invoke GetStrItem,addr buffer,addr buffer1
pop eax
dec eax
.endw
invoke SetDlgItemText,hWin,IDC_STCTXT,addr buffer1
ret
PropertyStyleTxt endp
PropertyDlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCAL buffer[33]:BYTE
LOCAL hCtl:HWND
LOCAL rect:RECT
LOCAL prect:RECT
mov eax,uMsg
.if eax==WM_INITDIALOG
mov StylePos,0
invoke GetWindowRect,hPrpLstDlg,addr prect
invoke GetWindowRect,hWin,addr rect
;width
mov eax,rect.left
sub rect.right,eax
;height
mov eax,rect.top
sub rect.bottom,eax
;left
mov eax,prect.right
sub eax,rect.right ;width
jnc @f
xor eax,eax
@@:
mov rect.left,eax
;Top
mov eax,rect.top
sub eax,95
jnc @f
xor eax,eax
@@:
mov rect.top,eax
invoke MoveWindow,hWin,rect.left,rect.top,rect.right,rect.bottom,TRUE
invoke SendMessage,hWin,WM_SETTEXT,0,StyleTxt
invoke SetDlgItemText,hWin,IDC_STCWARN,addr szStyleWarn
invoke PropertyStyleTxt,hWin,addr buffer
invoke GetDlgItem,hWin,IDC_BTNLEFT
mov hCtl,eax
invoke ImageList_GetIcon,hMnuIml,0,ILD_NORMAL
invoke SendMessage,hCtl,BM_SETIMAGE,IMAGE_ICON,eax
invoke GetDlgItem,hWin,IDC_BTNRIGHT
mov hCtl,eax
invoke ImageList_GetIcon,hMnuIml,1,ILD_NORMAL
invoke SendMessage,hCtl,BM_SETIMAGE,IMAGE_ICON,eax
invoke GetDlgItem,hWin,IDC_BTNSET
mov hCtl,eax
invoke ImageList_GetIcon,hMnuIml,2,ILD_NORMAL
invoke SendMessage,hCtl,BM_SETIMAGE,IMAGE_ICON,eax
.elseif eax==WM_COMMAND
mov eax,wParam
mov edx,eax
shr edx,16
and eax,0FFFFh
.if edx==BN_CLICKED
.if eax==IDCANCEL
invoke SendMessage,hWin,WM_CLOSE,NULL,NULL
.elseif eax==IDC_BTNLEFT
dec StylePos
and StylePos,31
mov eax,StylePos
inc eax
invoke SendDlgItemMessage,hWin,IDC_EDTSTYLE,EM_SETSEL,StylePos,eax
invoke PropertyStyleTxt,hWin,addr buffer
.elseif eax==IDC_BTNRIGHT
inc StylePos
and StylePos,31
mov eax,StylePos
inc eax
invoke SendDlgItemMessage,hWin,IDC_EDTSTYLE,EM_SETSEL,StylePos,eax
invoke PropertyStyleTxt,hWin,addr buffer
.elseif eax==IDC_BTNSET
mov ecx,StylePos
mov eax,80000000h
shr eax,cl
mov ecx,StyleOfs
.if StyleEx
and eax,000777FDh
xor (DIALOG ptr [ecx]).exstyle,eax
.else
and eax,0FFFFFFFFh
xor (DIALOG ptr [ecx]).style,eax
.endif
.if eax
invoke GetWindowLong,hPrpLstDlg,GWL_USERDATA
mov hCtl,eax
invoke UpdateCtl,hCtl
invoke PropertyStyleTxt,hWin,addr buffer
.endif
.endif
.endif
.elseif eax==WM_CLOSE
invoke EndDialog,hWin,NULL
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
PropertyDlgProc endp
UpdateCbo proc uses esi,lpData:DWORD
LOCAL nInx:DWORD
LOCAL buffer[128]:BYTE
LOCAL buffer1[512]:BYTE
LOCAL buffer2[64]:BYTE
invoke SendMessage,hPrpCboDlg,CB_RESETCONTENT,0,0
mov esi,lpData
add esi,sizeof DLGHEAD
assume esi:ptr DIALOG
@@:
mov eax,[esi].hwnd
.if eax
.if eax!=-1
mov al,[esi].idname
.if al
invoke lstrcpy,addr buffer,addr [esi].idname
.else
invoke ResEdBinToDec,[esi].id,addr buffer
.endif
invoke lstrcpy,addr buffer1,addr szCtlText
mov eax,[esi].ntype
inc eax
.while eax
push eax
invoke GetStrItem,addr buffer1,addr buffer2
pop eax
dec eax
.endw
push esi
invoke lstrlen,addr buffer
lea esi,buffer
add esi,eax
mov al,' '
mov [esi],al
inc esi
invoke lstrcpy,esi,addr buffer2
pop esi
invoke SendMessage,hPrpCboDlg,CB_ADDSTRING,0,addr buffer
mov nInx,eax
invoke SendMessage,hPrpCboDlg,CB_SETITEMDATA,nInx,[esi].hwnd
.endif
add esi,sizeof DIALOG
jmp @b
.endif
assume esi:nothing
ret
UpdateCbo endp
SetCbo proc hCtl:DWORD
LOCAL nInx:DWORD
invoke SendMessage,hPrpCboDlg,CB_GETCOUNT,0,0
mov nInx,eax
@@:
.if nInx
dec nInx
invoke SendMessage,hPrpCboDlg,CB_GETITEMDATA,nInx,0
.if eax==hCtl
invoke SendMessage,hPrpCboDlg,CB_SETCURSEL,nInx,0
.endif
jmp @b
.endif
ret
SetCbo endp
PropListSetTxt proc uses esi,hWin:HWND
LOCAL nInx:DWORD
LOCAL buffer[512]:BYTE
invoke SendMessage,hWin,LB_GETCURSEL,0,0
.if eax!=LB_ERR
mov nInx,eax
invoke SendMessage,hWin,LB_GETTEXT,nInx,addr buffer
lea esi,buffer
@@:
mov al,[esi]
inc esi
cmp al,09h
jne @b
invoke SendMessage,hWin,LB_GETITEMDATA,nInx,0
.if eax==PRP_STR_CAPTION || eax==1005 || eax==1006
invoke SendMessage,hPrpEdtDlgCld,EM_LIMITTEXT,MaxCap-1,0
.else
invoke SendMessage,hPrpEdtDlgCld,EM_LIMITTEXT,31,0
.endif
invoke SetWindowText,hPrpEdtDlgCld,esi
.endif
ret
PropListSetTxt endp
PropListSetPos proc
LOCAL rect:RECT
LOCAL nInx:DWORD
LOCAL lbid:DWORD
invoke ShowWindow,hPrpEdtDlgCld,SW_HIDE
invoke ShowWindow,hPrpBtnDlgCld,SW_HIDE
invoke SendMessage,hPrpLstDlg,LB_GETCURSEL,0,0
.if eax!=LB_ERR
mov nInx,eax
invoke SendMessage,hPrpLstDlg,LB_GETTEXT,nInx,addr lbtxtbuffer
mov ecx,offset lbtxtbuffer
mov edx,offset szLbString
.while byte ptr [ecx]!=VK_TAB
mov al,[ecx]
mov [edx],al
inc ecx
inc edx
.endw
mov byte ptr [edx],0
invoke SendMessage,hPrpLstDlg,LB_GETITEMRECT,nInx,addr rect
invoke SendMessage,hPrpLstDlg,LB_GETITEMDATA,nInx,0
mov lbid,eax
.if (eax>=PRP_BOOL_SYSMENU && eax<=499) || eax==1000 || eax==1003 || eax==1004 || eax==1007 || eax>65535
sub rect.right,lbHt
mov eax,rect.right
sub eax,rect.left
.if eax<lbTp+32-lbHt
mov rect.right,lbTp+32-lbHt
.endif
invoke SetWindowPos,hPrpBtnDlgCld,HWND_TOP,rect.right,rect.top,lbHt,lbHt,0
invoke ShowWindow,hPrpBtnDlgCld,SW_SHOWNOACTIVATE
.else
invoke PropListSetTxt,hPrpLstDlg
.if lbid==1002 || lbid==1005 || lbid==1006
sub rect.right,lbHt-1
invoke SetWindowPos,hPrpBtnDlgCld,HWND_TOP,rect.right,rect.top,lbHt,lbHt,0
invoke ShowWindow,hPrpBtnDlgCld,SW_SHOWNOACTIVATE
.endif
mov rect.left,lbTp+1
sub rect.right,lbTp+1
invoke SetWindowPos,hPrpEdtDlgCld,HWND_TOP,rect.left,rect.top,rect.right,lbHt-1,0
invoke ShowWindow,hPrpEdtDlgCld,SW_SHOWNOACTIVATE
invoke SendMessage,hPrpEdtDlgCld,EM_GETRECT,0,addr rect
mov rect.left,1
invoke SendMessage,hPrpEdtDlgCld,EM_SETRECT,0,addr rect
.endif
xor eax,eax
.endif
ret
PropListSetPos endp
TxtLstFalseTrue proc uses esi,CtlVal:DWORD,lpVal:DWORD
invoke SendMessage,hPrpLstDlgCld,LB_RESETCONTENT,0,0
invoke SendMessage,hPrpLstDlgCld,LB_ADDSTRING,0,addr szFalse
mov eax,lpVal
invoke SendMessage,hPrpLstDlgCld,LB_SETITEMDATA,0,eax
invoke SendMessage,hPrpLstDlgCld,LB_ADDSTRING,0,addr szTrue
mov eax,lpVal
add eax,8
invoke SendMessage,hPrpLstDlgCld,LB_SETITEMDATA,1,eax
mov esi,lpVal
mov eax,[esi]
xor eax,-1
and eax,CtlVal
.if eax==[esi+4]
invoke SendMessage,hPrpLstDlgCld,LB_SETCURSEL,0,0
.else
invoke SendMessage,hPrpLstDlgCld,LB_SETCURSEL,1,0
.endif
ret
TxtLstFalseTrue endp
TxtLstMulti proc uses esi,CtlValSt:DWORD,CtlValExSt:DWORD,lpVal:DWORD
LOCAL buffer[256]:BYTE
LOCAL buffer1[64]:BYTE
LOCAL nInx:DWORD
invoke SendMessage,hPrpLstDlgCld,LB_RESETCONTENT,0,0
invoke lstrcpy,addr buffer,lpVal
invoke lstrlen,lpVal
add lpVal,eax
inc lpVal
@@:
invoke GetStrItem,addr buffer,addr buffer1
invoke SendMessage,hPrpLstDlgCld,LB_ADDSTRING,0,addr buffer1
mov nInx,eax
invoke SendMessage,hPrpLstDlgCld,LB_SETITEMDATA,nInx,lpVal
mov esi,lpVal
mov eax,[esi]
xor eax,-1
and eax,CtlValSt
.if eax==[esi+4]
mov eax,[esi+8]
xor eax,-1
and eax,CtlValExSt
.if eax==[esi+12]
invoke SendMessage,hPrpLstDlgCld,LB_SETCURSEL,nInx,0
.endif
.endif
add lpVal,16
mov al,buffer[0]
or al,al
jne @b
ret
TxtLstMulti endp
PropTxtLst proc uses esi edi,hCtl:DWORD,lbid:DWORD
LOCAL nType:DWORD
LOCAL buffer[32]:BYTE
invoke GetWindowLong,hCtl,GWL_USERDATA
mov esi,eax
assume esi:ptr DIALOG
push [esi].ntype
pop nType
invoke SetWindowLong,hPrpLstDlgCld,GWL_USERDATA,hCtl
mov eax,lbid
.if eax==PRP_BOOL_SYSMENU
invoke TxtLstFalseTrue,[esi].style,addr SysMDlg
.elseif eax==PRP_BOOL_MAXBUTTON
invoke TxtLstFalseTrue,[esi].style,addr MaxBDlg
.elseif eax==PRP_BOOL_MINBUTTON
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -