📄 menuedit.asm
字号:
IDD_DLGMENUEDIT equ 1500
IDC_EDTMENUNAME equ 2503
IDC_EDTMENUID equ 2505
IDC_EDTSTARTID equ 2507
IDC_EDTITEMCAPTION equ 2512
IDC_HOTMENU equ 2513
IDC_EDTITEMNAME equ 2516
IDC_EDTITEMID equ 2518
IDC_BTNINSERT equ 2519
IDC_BTNDELETE equ 2520
IDC_BTNL equ 2521
IDC_BTNR equ 2522
IDC_BTNU equ 2523
IDC_BTND equ 2524
IDC_LSTMNU equ 2525
IDC_CHKCHECKED equ 2526
IDC_CHKGRAYED equ 2527
IDC_CHKDISABLED equ 2508
IDC_CHKRIGHTALIGN equ 2500
IDC_CHKRADIO equ 2509
IDC_CHKOWNERDRAW equ 2530
.data
szMnuErr db 'Menu skipped a level.',0
szMnuName db 'IDR_MENU',0
MnuID dd 10000
MnuItemID dd 10001
szMnuItemName db 'IDM_',0
szShift db 'Shift+',0
szCtrl db 'Ctrl+',0
szAlt db 'Alt+',0
hMnuMem dd 0
nMnuInx dd 0
fMnuSel dd FALSE
MnuTabs dd 115,120,125,130,135,140
.code
MnuSaveDefine proc uses esi,lpName:DWORD,lpID:DWORD
LOCAL buffer[16]:BYTE
LOCAL val:DWORD
mov esi,lpName
mov al,[esi]
.if al
mov esi,lpID
mov eax,[esi]
.if eax
invoke SaveStr,edi,addr szDEFINE
add edi,eax
mov al,' '
stosb
invoke SaveStr,edi,lpName
add edi,eax
mov al,' '
stosb
m2m val,[esi]
invoke ResEdBinToDec,val,addr buffer
invoke SaveStr,edi,addr buffer
add edi,eax
mov ax,0A0Dh
stosw
.endif
.endif
ret
MnuSaveDefine endp
MnuSpc proc val:DWORD
push eax
push ecx
mov eax,val
inc eax
add eax,eax
mov ecx,eax
mov al,' '
rep stosb
pop ecx
pop eax
ret
MnuSpc endp
MnuSaveAccel proc uses esi edi,nAccel:DWORD,lpDest:DWORD
mov esi,nAccel
mov edi,lpDest
shr esi,9
.if CARRY?
invoke SaveStr,edi,offset szShift
add edi,eax
.endif
shr esi,1
.if CARRY?
invoke SaveStr,edi,offset szCtrl
add edi,eax
.endif
shr esi,1
.if CARRY?
invoke SaveStr,edi,offset szAlt
add edi,eax
.endif
mov eax,nAccel
movzx eax,al
.if eax>='A' && eax<='Z'
stosb
.elseif eax>=VK_F1 && eax<=VK_F12
mov byte ptr [edi],'F'
inc edi
sub eax,VK_F1-1
invoke ResEdBinToDec,eax,edi
invoke lstrlen,edi
lea edi,[edi+eax]
.endif
mov byte ptr [edi],0
mov eax,edi
sub eax,lpDest
ret
MnuSaveAccel endp
MnuSaveItem proc uses ebx,lpItem:DWORD
LOCAL val:DWORD
invoke SaveStr,edi,lpItem
add edi,eax
mov al,' '
stosb
mov al,22h
stosb
.if byte ptr (MNUITEM ptr [esi]).itemcaption!='-'
invoke SaveStr,edi,addr (MNUITEM ptr [esi]).itemcaption
add edi,eax
.endif
mov eax,(MNUITEM ptr [esi]).shortcut
.if eax
mov val,eax
mov ax,'t\'
stosw
invoke MnuSaveAccel,val,edi
add edi,eax
.endif
mov al,22h
stosb
mov ebx,edi
mov al,','
stosb
mov al,(MNUITEM ptr [esi]).itemname
.if !al
m2m val,(MNUITEM ptr [esi]).itemid
.if val!=0 && val!=-1
invoke SaveVal,val,FALSE
mov ebx,edi
.endif
.else
invoke SaveStr,edi,addr (MNUITEM ptr [esi]).itemname
add edi,eax
mov ebx,edi
.endif
mov al,','
stosb
;MFT_
mov edx,(MNUITEM ptr [esi]).ntype
.if byte ptr (MNUITEM ptr [esi]).itemcaption=='-'
or edx,MFT_SEPARATOR
.endif
.if edx
invoke SaveHexVal,edx,FALSE
mov ebx,edi
.endif
mov al,','
stosb
;MFS_
mov eax,(MNUITEM ptr [esi]).nstate
.if eax
invoke SaveHexVal,eax,FALSE
mov ebx,edi
.endif
mov edi,ebx
mov ax,0A0Dh
stosw
ret
MnuSaveItem endp
ExportMenuNames proc uses esi edi,hMem:DWORD
invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,1024*100
mov edi,eax
invoke GlobalLock,edi
push edi
mov esi,hMem
invoke MnuSaveDefine,addr (MNUHEAD ptr [esi]).menuname,addr (MNUHEAD ptr [esi]).menuid
add esi,sizeof MNUHEAD
@@:
mov eax,(MNUITEM ptr [esi]).itemflag
.if eax
.if eax!=-1
invoke MnuSaveDefine,addr (MNUITEM ptr [esi]).itemname,addr (MNUITEM ptr [esi]).itemid
.endif
add esi,sizeof MNUITEM
jmp @b
.endif
mov byte ptr [edi],0
pop eax
ret
ExportMenuNames endp
ExportMenu proc uses esi edi,hMem:DWORD
LOCAL val:DWORD
LOCAL level:DWORD
invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,1024*100
mov edi,eax
invoke GlobalLock,edi
push edi
mov esi,hMem
mov al,(MNUHEAD ptr [esi]).menuname
.if al
invoke SaveStr,edi,addr (MNUHEAD ptr [esi]).menuname
add edi,eax
.else
m2m val,(MNUHEAD ptr [esi]).menuid
invoke SaveVal,val,FALSE
.endif
mov al,' '
stosb
invoke SaveStr,edi,addr szMENUEX
add edi,eax
mov ax,0A0Dh
stosw
invoke SaveStr,edi,addr szBEGIN
add edi,eax
mov ax,0A0Dh
stosw
mov level,0
add esi,sizeof MNUHEAD
Nx:
mov eax,(MNUITEM ptr [esi]).itemflag
.if eax
.if eax!=-1
mov eax,(MNUITEM ptr [esi]).level
.if eax!=level
invoke MessageBox,hDEd,addr szMnuErr,addr szAppName,MB_OK or MB_ICONERROR
jmp MnExEx
.endif
push esi
@@:
add esi,sizeof MNUITEM
mov eax,(MNUITEM ptr [esi]).itemflag
.if eax
.if eax==-1
jmp @b
.endif
mov eax,(MNUITEM ptr [esi]).level
.endif
mov val,eax
pop esi
invoke MnuSpc,level
.if eax>level
invoke MnuSaveItem,addr szPOPUP
.else
invoke MnuSaveItem,addr szMENUITEM
.endif
mov eax,val
.if eax>level
sub eax,level
.if eax!=1
invoke MessageBox,hDEd,addr szMnuErr,addr szAppName,MB_OK or MB_ICONERROR
jmp MnExEx
.endif
invoke MnuSpc,level
m2m level,val
invoke SaveStr,edi,addr szBEGIN
add edi,eax
mov ax,0A0Dh
stosw
.elseif eax<level
@@:
mov eax,val
.if eax!=level
dec level
invoke MnuSpc,level
invoke SaveStr,edi,addr szEND
add edi,eax
mov ax,0A0Dh
stosw
jmp @b
.endif
.endif
add esi,sizeof MNUITEM
jmp Nx
.endif
.endif
invoke SaveStr,edi,addr szEND
add edi,eax
mov eax,0A0Dh
stosd
pop eax
ret
MnExEx:
pop edi
invoke GlobalUnlock,edi
invoke GlobalFree,edi
xor eax,eax
ret
ExportMenu endp
MnuGetFreeMem proc uses esi
mov esi,hMnuMem
add esi,sizeof MNUHEAD
sub esi,sizeof MNUITEM
@@:
add esi,sizeof MNUITEM
mov eax,(MNUITEM ptr [esi]).itemflag
.if eax==-1
xor eax,eax
.endif
or eax,eax
jne @b
mov eax,esi
ret
MnuGetFreeMem endp
MnuGetFreeID proc uses esi
LOCAL nId:DWORD
mov esi,hMnuMem
m2m nId,(MNUHEAD ptr [esi]).startid
add esi,sizeof MNUHEAD
sub esi,sizeof MNUITEM
@@:
add esi,sizeof MNUITEM
mov eax,(MNUITEM ptr [esi]).itemflag
cmp eax,-1
je @b
.if eax
mov eax,(MNUITEM ptr [esi]).itemid
.if eax==nId
inc nId
mov esi,hMnuMem
add esi,sizeof MNUHEAD
sub esi,sizeof MNUITEM
.endif
jmp @b
.endif
mov eax,nId
ret
MnuGetFreeID endp
MnuGetMem proc uses esi,hWin:HWND
LOCAL val:DWORD
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_GETCURSEL,0,0
mov nMnuInx,eax
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_GETITEMDATA,nMnuInx,0
.if !eax
.if fMnuSel==FALSE
invoke MnuGetFreeMem
mov esi,eax
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_SETITEMDATA,nMnuInx,esi
mov (MNUITEM ptr [esi]).itemflag,1
invoke GetDlgItemText,hWin,IDC_EDTITEMCAPTION,addr (MNUITEM ptr [esi]).itemcaption,64
invoke GetDlgItemText,hWin,IDC_EDTITEMNAME,addr (MNUITEM ptr [esi]).itemname,32
invoke GetDlgItemInt,hWin,IDC_EDTITEMID,addr val,FALSE
m2m (MNUITEM ptr [esi]).itemid,eax
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_GETCOUNT,0,0
.if eax
dec eax
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_GETITEMDATA,eax,0
.if eax
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_ADDSTRING,0,addr szNULL
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_SETITEMDATA,eax,0
.endif
.endif
mov eax,esi
.endif
.endif
ret
MnuGetMem endp
MenuUpdate proc uses esi edi,hWin:HWND
LOCAL hMem:DWORD
LOCAL nInx:DWORD
invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,MaxMem
mov hMem,eax
invoke GlobalLock,hMem
mov esi,hMnuMem
mov edi,hMem
mov ecx,sizeof MNUHEAD
rep movsb
mov nInx,0
@@:
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_GETITEMDATA,nInx,0
.if eax!=LB_ERR
.if eax
mov esi,eax
mov eax,(MNUITEM ptr [esi]).itemflag
.if eax!=-1
mov ecx,sizeof MNUITEM
rep movsb
.endif
.endif
inc nInx
jmp @b
.endif
mov esi,hMem
mov edi,hMnuMem
mov ecx,MaxMem/4
rep movsd
invoke GlobalUnlock,hMem
invoke GlobalFree,hMem
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -