📄 project.asm
字号:
.data
szDialog db 'Dialog',0
szMenu db 'Menu',0
szMisc db 'Misc',0
szResource db 'Resource',0
szIncludeFile db 'Include file',0
szStringTable db 'Stringtable',0
.data?
hPrjTrv dd ?
OldTreeViewProc dd ?
hRoot dd ?
hNodeDlg dd ?
hNodeMnu dd ?
hNodeMisc dd ?
.code
ProjectDblClick proc hWin:HWND,lParam:LPARAM
LOCAL buffer[64]:BYTE
LOCAL tvht:TV_HITTESTINFO
LOCAL tvi:TV_ITEMEX
LOCAL hTvi:HWND
mov eax,lParam
and eax,0FFFFh
mov tvht.pt.x,eax
mov eax,lParam
shr eax,16
mov tvht.pt.y,eax
invoke SendMessage,hWin,TVM_HITTEST,0,addr tvht
.if eax
mov hTvi,eax
mov eax,tvht.flags
and eax,TVHT_ONITEM
.if eax
m2m tvi.hItem,tvht.hItem
mov tvi.imask,TVIF_PARAM or TVIF_TEXT
lea eax,buffer
mov tvi.pszText,eax
mov tvi.cchTextMax,sizeof buffer
invoke SendMessage,hWin,TVM_GETITEM,0,addr tvi
.if tvi.lParam
mov eax,tvi.lParam
.if [eax].PROJECT.ntype==TPE_DIALOG
invoke SendMessage,hDEd,DEM_OPEN,0,eax
.elseif [eax].PROJECT.ntype==TPE_MENU
invoke SendMessage,hDEd,MEM_OPEN,0,eax
.elseif [eax].PROJECT.ntype==TPE_VERSION
invoke DialogBoxParam,hInstance,IDD_DLGVERSION,hWin,offset VersionEditProc,eax
.elseif [eax].PROJECT.ntype==TPE_ACCEL
invoke DialogBoxParam,hInstance,IDD_DLGACCEL,hWin,offset AccelEditProc,eax
.elseif [eax].PROJECT.ntype==TPE_INCLUDE
invoke DialogBoxParam,hInstance,IDD_DLGINCLUDE,hWin,offset IncludeEditProc,eax
.elseif [eax].PROJECT.ntype==TPE_RESOURCE
invoke DialogBoxParam,hInstance,IDD_DLGRESOURCE,hWin,offset ResourceEditProc,eax
.elseif [eax].PROJECT.ntype==TPE_STRING
invoke DialogBoxParam,hInstance,IDD_DLGSTRING,hWin,offset StringEditProc,eax
.endif
.endif
.endif
.endif
ret
ProjectDblClick endp
TreeViewProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
mov eax,uMsg
.if eax==WM_LBUTTONDBLCLK
invoke ProjectDblClick,hWin,lParam
.endif
invoke CallWindowProc,OldTreeViewProc,hWin,uMsg,wParam,lParam
ret
TreeViewProc endp
Do_Project proc hWin:HWND
invoke CreateWindowEx,0,addr szTreeViewClass,NULL,WS_CHILD or WS_VISIBLE or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or TVS_HASLINES or TVS_HASBUTTONS or TVS_SHOWSELALWAYS,0,0,0,0,hWin,0,hInstance,0
mov hPrjTrv,eax
invoke SetWindowLong,hPrjTrv,GWL_WNDPROC,offset TreeViewProc
mov OldTreeViewProc,eax
invoke SendMessage,hPrjTrv,TVM_SETIMAGELIST,0,hPrjIml
ret
Do_Project endp
ProjectSize proc ccx:DWORD,ccy:DWORD
invoke MoveWindow,hPrjTrv,0,0,ccx,ccy,TRUE
ret
ProjectSize endp
Do_TreeViewAddNode proc hWin:HWND,lhPar:DWORD,lhInsAfter:DWORD,pszText:DWORD,pidSel:DWORD,pidNosel:DWORD,lParam:LPARAM
LOCAL tvins:TV_INSERTSTRUCT
m2m tvins.hParent,lhPar
m2m tvins.hInsertAfter,lhInsAfter
m2m tvins.item.lParam,lParam
mov tvins.item._mask,TVIF_TEXT or TVIF_IMAGE or TVIF_SELECTEDIMAGE or TVIF_PARAM
m2m tvins.item.pszText,pszText
m2m tvins.item.iImage,pidSel
m2m tvins.item.iSelectedImage,pidNosel
invoke SendMessage,hWin,TVM_INSERTITEM,0,addr tvins
ret
Do_TreeViewAddNode endp
AddProjectNode proc nType:DWORD,lpName:DWORD,lParam:DWORD
mov eax,nType
.if eax==TPE_DIALOG
.if !hNodeDlg
invoke Do_TreeViewAddNode,hPrjTrv,hRoot,TVI_SORT,offset szDialog,0,0,0
mov hNodeDlg,eax
.endif
invoke Do_TreeViewAddNode,hPrjTrv,hNodeDlg,TVI_SORT,lpName,1,1,lParam
.elseif eax==TPE_MENU
.if !hNodeMnu
invoke Do_TreeViewAddNode,hPrjTrv,hRoot,TVI_SORT,offset szMenu,0,0,0
mov hNodeMnu,eax
.endif
invoke Do_TreeViewAddNode,hPrjTrv,hNodeMnu,TVI_SORT,lpName,2,2,lParam
.elseif eax==TPE_INCLUDE || eax==TPE_ACCEL || eax==TPE_VERSION || eax==TPE_RESOURCE || eax==TPE_STRING
.if !hNodeMisc
invoke Do_TreeViewAddNode,hPrjTrv,hRoot,TVI_SORT,offset szMisc,0,0,0
mov hNodeMisc,eax
.endif
mov eax,nType
.if eax==TPE_RESOURCE
mov eax,3
.elseif eax==TPE_ACCEL
mov eax,4
.elseif eax==TPE_VERSION
mov eax,5
.elseif eax==TPE_STRING
mov eax,6
.else
mov eax,7
.endif
invoke Do_TreeViewAddNode,hPrjTrv,hNodeMisc,TVI_SORT,lpName,eax,eax,lParam
.endif
ret
AddProjectNode endp
ExpandProjectNodes proc hNode:DWORD
invoke SendMessage,hPrjTrv,TVM_EXPAND,TVE_EXPAND,hRoot
.if hNodeDlg
mov eax,hNode
.if eax==hNodeDlg || !eax
invoke SendMessage,hPrjTrv,TVM_EXPAND,TVE_EXPAND,hNodeDlg
.endif
.endif
.if hNodeMnu
mov eax,hNode
.if eax==hNodeMnu || !eax
invoke SendMessage,hPrjTrv,TVM_EXPAND,TVE_EXPAND,hNodeMnu
.endif
.endif
.if hNodeMisc
mov eax,hNode
.if eax==hNodeMisc || !eax
invoke SendMessage,hPrjTrv,TVM_EXPAND,TVE_EXPAND,hNodeMisc
.endif
.endif
ret
ExpandProjectNodes endp
OpenProject proc uses esi,lpFileName:DWORD,hRCMem:DWORD
LOCAL hProMem:DWORD
LOCAL buffer[16]:BYTE
invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,16384
mov hProMem,eax
invoke GlobalLock,hProMem
invoke AddTypeMem,hProMem,64*1024,TPE_NAME
invoke ParseRCMem,hRCMem,hProMem
invoke GlobalUnlock,hRCMem
invoke GlobalFree,hRCMem
invoke lstrlen,lpFileName
mov edx,lpFileName
.while byte ptr [edx+eax]!='\' && eax
dec eax
.endw
.if byte ptr [edx+eax]=='\'
inc eax
.endif
lea edx,[edx+eax]
push edx
invoke lstrcpyn,offset szProjectPath,lpFileName,eax
invoke SetCurrentDirectory,offset szProjectPath
pop edx
mov esi,hProMem
invoke Do_TreeViewAddNode,hPrjTrv,TVI_ROOT,TVI_FIRST,edx,0,0,esi
mov hRoot,eax
.while [esi].PROJECT.hmem
.if [esi].PROJECT.ntype==TPE_DIALOG
mov eax,[esi].PROJECT.hmem
lea edx,[eax+sizeof DLGHEAD].DIALOG.idname
.if !byte ptr [edx]
lea edx,buffer
invoke ResEdBinToDec,[eax+sizeof DLGHEAD].DIALOG.id,edx
lea edx,buffer
.endif
invoke AddProjectNode,TPE_DIALOG,edx,esi
.elseif [esi].PROJECT.ntype==TPE_MENU
mov eax,[esi].PROJECT.hmem
lea edx,[eax].MNUHEAD.menuname
.if !byte ptr [edx]
lea edx,buffer
invoke ResEdBinToDec,[eax].MNUHEAD.menuid,edx
lea edx,buffer
.endif
invoke AddProjectNode,TPE_MENU,edx,esi
.elseif [esi].PROJECT.ntype==TPE_INCLUDE
invoke AddProjectNode,TPE_INCLUDE,offset szIncludeFile,esi
.elseif [esi].PROJECT.ntype==TPE_ACCEL
mov eax,[esi].PROJECT.hmem
lea edx,[eax].ACCELMEM.szname
.if !byte ptr [edx]
lea edx,buffer
invoke ResEdBinToDec,[eax].ACCELMEM.value,edx
lea edx,buffer
.endif
invoke AddProjectNode,TPE_ACCEL,edx,esi
.elseif [esi].PROJECT.ntype==TPE_VERSION
mov eax,[esi].PROJECT.hmem
lea edx,[eax].VERSIONMEM.szname
.if !byte ptr [edx]
lea edx,buffer
invoke ResEdBinToDec,[eax].VERSIONMEM.value,edx
lea edx,buffer
.endif
invoke AddProjectNode,TPE_VERSION,edx,esi
.elseif [esi].PROJECT.ntype==TPE_RESOURCE
invoke AddProjectNode,TPE_RESOURCE,offset szResource,esi
.elseif [esi].PROJECT.ntype==TPE_STRING
invoke AddProjectNode,TPE_STRING,offset szStringTable,esi
.endif
add esi,sizeof PROJECT
.endw
invoke ExpandProjectNodes,NULL
mov eax,hProMem
ret
OpenProject endp
CloseProject proc uses esi,hProMem:DWORD
invoke GetWindowLong,hDEd,DEWM_DIALOG
.if eax
push eax
invoke DestroySizeingRect
pop eax
invoke DestroyWindow,eax
.endif
invoke SetWindowLong,hDEd,DEWM_DIALOG,0
invoke SetWindowLong,hDEd,DEWM_MEMORY,0
.if hRoot
invoke SendMessage,hPrjTrv,TVM_DELETEITEM,0,TVI_ROOT
mov hRoot,0
mov hNodeDlg,0
mov hNodeMnu,0
mov hNodeMisc,0
.endif
mov esi,hProMem
.if esi
.while [esi].PROJECT.hmem
invoke GlobalUnlock,[esi].PROJECT.hmem
invoke GlobalFree,[esi].PROJECT.hmem
mov [esi].PROJECT.hmem,0
add esi,sizeof PROJECT
.endw
invoke GlobalUnlock,hProMem
invoke GlobalFree,hProMem
mov hProMem,0
.endif
ret
CloseProject endp
ExportProject proc lpRCMem:DWORD,lpProMem:DWORD
LOCAL hMem:DWORD
mov esi,lpProMem
.while [esi].PROJECT.hmem
.if ![esi].PROJECT.delete
.if [esi].PROJECT.ntype==TPE_NAME
mov eax,[esi].PROJECT.hmem
invoke ExportNamesNames,eax
.if eax
mov hMem,eax
invoke lstrcat,lpRCMem,hMem
invoke GlobalUnlock,hMem
invoke GlobalFree,hMem
.endif
.elseif [esi].PROJECT.ntype==TPE_DIALOG
mov eax,[esi].PROJECT.hmem
invoke ExportDialogNames,eax
.if eax
mov hMem,eax
invoke lstrcat,lpRCMem,hMem
invoke GlobalUnlock,hMem
invoke GlobalFree,hMem
.endif
.elseif [esi].PROJECT.ntype==TPE_MENU
mov eax,[esi].PROJECT.hmem
invoke ExportMenuNames,eax
.if eax
mov hMem,eax
invoke lstrcat,lpRCMem,hMem
invoke GlobalUnlock,hMem
invoke GlobalFree,hMem
.endif
.elseif [esi].PROJECT.ntype==TPE_VERSION
mov eax,[esi].PROJECT.hmem
invoke ExportVersionNames,eax
.if eax
mov hMem,eax
invoke lstrcat,lpRCMem,hMem
invoke GlobalUnlock,hMem
invoke GlobalFree,hMem
.endif
.elseif [esi].PROJECT.ntype==TPE_ACCEL
mov eax,[esi].PROJECT.hmem
invoke ExportAccelNames,eax
.if eax
mov hMem,eax
invoke lstrcat,lpRCMem,hMem
invoke GlobalUnlock,hMem
invoke GlobalFree,hMem
.endif
; .elseif [esi].PROJECT.ntype==TPE_INCLUDE
; mov eax,[esi].PROJECT.hmem
; invoke ExportInclude,eax
; .if eax
; mov hMem,eax
; invoke lstrcat,lpRCMem,hMem
; invoke GlobalUnlock,hMem
; invoke GlobalFree,hMem
; .endif
.elseif [esi].PROJECT.ntype==TPE_RESOURCE
mov eax,[esi].PROJECT.hmem
invoke ExportResourceNames,eax
.if eax
mov hMem,eax
invoke lstrcat,lpRCMem,hMem
invoke GlobalUnlock,hMem
invoke GlobalFree,hMem
.endif
.elseif [esi].PROJECT.ntype==TPE_STRING
mov eax,[esi].PROJECT.hmem
invoke ExportStringNames,eax
.if eax
mov hMem,eax
invoke lstrcat,lpRCMem,hMem
invoke GlobalUnlock,hMem
invoke GlobalFree,hMem
.endif
.endif
.endif
add esi,sizeof PROJECT
.endw
mov esi,lpProMem
.while [esi].PROJECT.hmem
.if ![esi].PROJECT.delete
.if [esi].PROJECT.ntype==TPE_DIALOG
mov eax,[esi].PROJECT.hmem
invoke ExportDialog,eax
.if eax
mov hMem,eax
invoke lstrcat,lpRCMem,hMem
invoke GlobalUnlock,hMem
invoke GlobalFree,hMem
.endif
.elseif [esi].PROJECT.ntype==TPE_MENU
mov eax,[esi].PROJECT.hmem
invoke ExportMenu,eax
.if eax
mov hMem,eax
invoke lstrcat,lpRCMem,hMem
invoke GlobalUnlock,hMem
invoke GlobalFree,hMem
.endif
.elseif [esi].PROJECT.ntype==TPE_VERSION
mov eax,[esi].PROJECT.hmem
invoke ExportVersion,eax
.if eax
mov hMem,eax
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -