?? menuedit.asm
字號:
MenuUpdate endp
DlgMenuEditProc proc uses esi edi,hWin:HWND,uMsg:UINT,wParam:WPARAM, lParam:LPARAM
LOCAL hCtl:DWORD
LOCAL buffer[64]:byte
LOCAL buffer1[256]:byte
LOCAL val:DWORD
.if uMsg==WM_INITDIALOG
mov eax,lParam
mov hMnuMem,eax
mov eax,[eax].MNUHEAD.changed
push eax
invoke SendDlgItemMessage,hWin,IDC_EDTMENUNAME,EM_LIMITTEXT,31,0
invoke SendDlgItemMessage,hWin,IDC_EDTITEMCAPTION,EM_LIMITTEXT,31,0
invoke SendDlgItemMessage,hWin,IDC_EDTITEMNAME,EM_LIMITTEXT,31,0
invoke GetDlgItem,hWin,IDC_BTNL
mov hCtl,eax
invoke ImageList_GetIcon,hMnuIml,0,ILD_NORMAL
invoke SendMessage,hCtl,BM_SETIMAGE,IMAGE_ICON,eax
invoke GetDlgItem,hWin,IDC_BTNR
mov hCtl,eax
invoke ImageList_GetIcon,hMnuIml,1,ILD_NORMAL
invoke SendMessage,hCtl,BM_SETIMAGE,IMAGE_ICON,eax
invoke GetDlgItem,hWin,IDC_BTNU
mov hCtl,eax
invoke ImageList_GetIcon,hMnuIml,2,ILD_NORMAL
invoke SendMessage,hCtl,BM_SETIMAGE,IMAGE_ICON,eax
invoke GetDlgItem,hWin,IDC_BTND
mov hCtl,eax
invoke ImageList_GetIcon,hMnuIml,3,ILD_NORMAL
invoke SendMessage,hCtl,BM_SETIMAGE,IMAGE_ICON,eax
mov esi,hMnuMem
invoke SetDlgItemText,hWin,IDC_EDTMENUNAME,addr (MNUHEAD ptr [esi]).menuname
invoke SetDlgItemInt,hWin,IDC_EDTMENUID,(MNUHEAD ptr [esi]).menuid,FALSE
invoke SetDlgItemInt,hWin,IDC_EDTSTARTID,(MNUHEAD ptr [esi]).startid,FALSE
invoke GetDlgItem,hWin,IDC_LSTMNU
mov hCtl,eax
invoke SendMessage,hCtl,LB_SETTABSTOPS,6,addr MnuTabs
add esi,sizeof MNUHEAD
mov nMnuInx,0
@@:
mov eax,(MNUITEM ptr [esi]).itemflag
.if eax
invoke SendMessage,hCtl,LB_INSERTSTRING,nMnuInx,addr szNULL
invoke SendMessage,hCtl,LB_SETITEMDATA,nMnuInx,esi
invoke SendMessage,hCtl,LB_SETCURSEL,nMnuInx,0
mov eax,LBN_SELCHANGE
shl eax,16
or eax,IDC_LSTMNU
invoke SendMessage,hWin,WM_COMMAND,eax,0
add esi,sizeof MNUITEM
inc nMnuInx
jmp @b
.endif
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_ADDSTRING,0,addr szNULL
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_SETITEMDATA,eax,0
mov nMnuInx,0
invoke SendMessage,hCtl,LB_SETCURSEL,nMnuInx,0
mov eax,LBN_SELCHANGE
shl eax,16
or eax,IDC_LSTMNU
invoke SendMessage,hWin,WM_COMMAND,eax,0
pop eax
.if !eax
mov eax,hMnuMem
mov [eax].MNUHEAD.changed,FALSE
.endif
.elseif uMsg==WM_CLOSE
invoke EndDialog,hWin,wParam
.elseif uMsg==WM_COMMAND
mov edx,wParam
movzx eax,dx
shr edx,16
.if edx==BN_CLICKED
.if eax==IDCANCEL
invoke SendMessage,hWin,WM_CLOSE,FALSE,0
.elseif eax==IDOK
invoke MenuUpdate,hWin
invoke SendMessage,hWin,WM_CLOSE,TRUE,0
.elseif eax==IDC_BTNL
invoke MnuGetMem,hWin
.if eax
mov esi,eax
mov eax,(MNUITEM ptr[esi]).level
.if eax
dec (MNUITEM ptr[esi]).level
invoke SendMessage,hWin,WM_COMMAND,(EN_CHANGE shl 16) or IDC_EDTITEMCAPTION,0
.endif
.endif
.elseif eax==IDC_BTNR
invoke MnuGetMem,hWin
.if eax
mov esi,eax
mov eax,(MNUITEM ptr[esi]).level
.if eax<5
inc (MNUITEM ptr[esi]).level
invoke SendMessage,hWin,WM_COMMAND,(EN_CHANGE shl 16) or IDC_EDTITEMCAPTION,0
.endif
.endif
.elseif eax==IDC_BTNU
.if nMnuInx
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_GETITEMDATA,nMnuInx,0
.if eax
mov esi,eax
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_DELETESTRING,nMnuInx,0
dec nMnuInx
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_INSERTSTRING,nMnuInx,addr szNULL
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_SETITEMDATA,nMnuInx,esi
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_SETCURSEL,nMnuInx,0
invoke SendMessage,hWin,WM_COMMAND,(LBN_SELCHANGE shl 16) or IDC_LSTMNU,0
.endif
.endif
.elseif eax==IDC_BTND
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_GETCOUNT,0,0
dec eax
.if eax!=nMnuInx
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_GETITEMDATA,nMnuInx,0
.if eax
mov esi,eax
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_DELETESTRING,nMnuInx,0
inc nMnuInx
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_INSERTSTRING,nMnuInx,addr szNULL
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_SETITEMDATA,nMnuInx,esi
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_SETCURSEL,nMnuInx,0
invoke SendMessage,hWin,WM_COMMAND,(LBN_SELCHANGE shl 16) or IDC_LSTMNU,0
.endif
.endif
.elseif eax==IDC_BTNINSERT
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_INSERTSTRING,nMnuInx,addr szNULL
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_SETCURSEL,nMnuInx,0
invoke SendMessage,hWin,WM_COMMAND,(LBN_SELCHANGE shl 16) or IDC_LSTMNU,0
.elseif eax==IDC_BTNDELETE
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_GETCOUNT,0,0
dec eax
.if eax!=nMnuInx
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_GETITEMDATA,nMnuInx,0
.if eax
mov esi,eax
mov (MNUITEM ptr [esi]).itemflag,-1
.endif
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_DELETESTRING,nMnuInx,0
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_SETCURSEL,nMnuInx,0
.if eax!=LB_ERR
invoke SendMessage,hWin,WM_COMMAND,(LBN_SELCHANGE shl 16) or IDC_LSTMNU,0
.endif
.endif
.elseif eax==IDC_CHKCHECKED
invoke MnuGetMem,hWin
.if eax
mov esi,eax
and (MNUITEM ptr [esi]).nstate,-1 xor MFS_CHECKED
invoke SendDlgItemMessage,hWin,IDC_CHKCHECKED,BM_GETCHECK,0,0
.if eax==BST_CHECKED
or (MNUITEM ptr [esi]).nstate,MFS_CHECKED
.endif
.endif
.elseif eax==IDC_CHKGRAYED
invoke MnuGetMem,hWin
.if eax
mov esi,eax
and (MNUITEM ptr [esi]).nstate,-1 xor MFS_GRAYED
invoke SendDlgItemMessage,hWin,IDC_CHKGRAYED,BM_GETCHECK,0,0
.if eax==BST_CHECKED
or (MNUITEM ptr [esi]).nstate,MFS_GRAYED
.endif
.endif
.elseif eax==IDC_CHKDISABLED
invoke MnuGetMem,hWin
.if eax
mov esi,eax
and (MNUITEM ptr [esi]).nstate,-1 xor MFS_DISABLED
invoke SendDlgItemMessage,hWin,IDC_CHKDISABLED,BM_GETCHECK,0,0
.if eax==BST_CHECKED
or (MNUITEM ptr [esi]).nstate,MFS_DISABLED
.endif
.endif
.elseif eax==IDC_CHKRIGHTALIGN
invoke MnuGetMem,hWin
.if eax
mov esi,eax
and (MNUITEM ptr [esi]).ntype,-1 xor MFT_RIGHTJUSTIFY
invoke SendDlgItemMessage,hWin,IDC_CHKRIGHTALIGN,BM_GETCHECK,0,0
.if eax==BST_CHECKED
or (MNUITEM ptr [esi]).ntype,MFT_RIGHTJUSTIFY
.endif
.endif
.elseif eax==IDC_CHKRADIO
invoke MnuGetMem,hWin
.if eax
mov esi,eax
and (MNUITEM ptr [esi]).ntype,-1 xor MFT_RADIOCHECK
invoke SendDlgItemMessage,hWin,IDC_CHKRADIO,BM_GETCHECK,0,0
.if eax==BST_CHECKED
or (MNUITEM ptr [esi]).ntype,MFT_RADIOCHECK
.endif
.endif
.elseif eax==IDC_CHKOWNERDRAW
invoke MnuGetMem,hWin
.if eax
mov esi,eax
and (MNUITEM ptr [esi]).ntype,-1 xor MFT_OWNERDRAW
invoke SendDlgItemMessage,hWin,IDC_CHKOWNERDRAW,BM_GETCHECK,0,0
.if eax==BST_CHECKED
or (MNUITEM ptr [esi]).ntype,MFT_OWNERDRAW
.endif
.endif
.endif
.elseif edx==EN_CHANGE
.if eax==IDC_EDTITEMCAPTION
invoke MnuGetMem,hWin
.if eax
mov esi,eax
invoke GetDlgItemText,hWin,IDC_EDTITEMCAPTION,addr buffer,64
invoke lstrcpy,addr (MNUITEM ptr [esi]).itemcaption,addr buffer
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_DELETESTRING,nMnuInx,0
lea edi,buffer1
mov ecx,(MNUITEM ptr [esi]).level
.if ecx
mov al,'.'
@@:
stosb
stosb
loop @b
.endif
invoke lstrcpy,edi,addr buffer
invoke SendDlgItemMessage,hWin,IDC_HOTMENU,HKM_GETHOTKEY,0,0
.if al
mov word ptr buffer,VK_TAB
mov edx,eax
invoke MnuSaveAccel,edx,addr buffer[1]
invoke lstrcat,addr buffer1,addr buffer
.endif
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_INSERTSTRING,nMnuInx,addr buffer1
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_SETITEMDATA,nMnuInx,esi
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_SETCURSEL,nMnuInx,0
.endif
.elseif eax==IDC_EDTITEMNAME
invoke MnuGetMem,hWin
.if eax
mov esi,eax
invoke GetDlgItemText,hWin,IDC_EDTITEMNAME,addr (MNUITEM ptr [esi]).itemname,32
.endif
.elseif eax==IDC_EDTITEMID
invoke MnuGetMem,hWin
.if eax
mov esi,eax
invoke GetDlgItemInt,hWin,IDC_EDTITEMID,addr val,FALSE
m2m (MNUITEM ptr [esi]).itemid,eax
.endif
.elseif eax==IDC_EDTMENUNAME
mov esi,hMnuMem
invoke GetDlgItemText,hWin,IDC_EDTMENUNAME,addr (MNUHEAD ptr [esi]).menuname,32
.elseif eax==IDC_EDTMENUID
mov esi,hMnuMem
invoke GetDlgItemInt,hWin,IDC_EDTMENUID,addr val,FALSE
m2m (MNUHEAD ptr [esi]).menuid,eax
.elseif eax==IDC_EDTSTARTID
mov esi,hMnuMem
invoke GetDlgItemInt,hWin,IDC_EDTSTARTID,addr val,FALSE
m2m (MNUHEAD ptr [esi]).startid,eax
.elseif eax==IDC_HOTMENU
invoke MnuGetMem,hWin
.if eax
mov esi,eax
invoke SendDlgItemMessage,hWin,IDC_HOTMENU,HKM_GETHOTKEY,0,0
mov (MNUITEM ptr [esi]).shortcut,eax
invoke SendMessage,hWin,WM_COMMAND,(EN_CHANGE shl 16) or IDC_EDTITEMCAPTION,0
.endif
.endif
.elseif edx==LBN_SELCHANGE
.if eax==IDC_LSTMNU
mov fMnuSel,TRUE
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_GETCURSEL,0,0
mov nMnuInx,eax
invoke SendDlgItemMessage,hWin,IDC_LSTMNU,LB_GETITEMDATA,nMnuInx,0
.if !eax
invoke SendDlgItemMessage,hWin,IDC_HOTMENU,HKM_SETHOTKEY,0,0
invoke SetDlgItemText,hWin,IDC_EDTITEMCAPTION,addr szNULL
invoke SetDlgItemText,hWin,IDC_EDTITEMNAME,addr szMnuItemName
invoke MnuGetFreeID
invoke SetDlgItemInt,hWin,IDC_EDTITEMID,eax,FALSE
invoke SendDlgItemMessage,hWin,IDC_CHKCHECKED,BM_SETCHECK,BST_UNCHECKED,0
invoke SendDlgItemMessage,hWin,IDC_CHKGRAYED,BM_SETCHECK,BST_UNCHECKED,0
invoke SendDlgItemMessage,hWin,IDC_CHKDISABLED,BM_SETCHECK,BST_UNCHECKED,0
invoke SendDlgItemMessage,hWin,IDC_CHKRIGHTALIGN,BM_SETCHECK,BST_UNCHECKED,0
invoke SendDlgItemMessage,hWin,IDC_CHKRADIO,BM_SETCHECK,BST_UNCHECKED,0
invoke SendDlgItemMessage,hWin,IDC_CHKOWNERDRAW,BM_SETCHECK,BST_UNCHECKED,0
.else
mov esi,eax
invoke SendDlgItemMessage,hWin,IDC_HOTMENU,HKM_SETHOTKEY,(MNUITEM ptr [esi]).shortcut,0
invoke SetDlgItemText,hWin,IDC_EDTITEMCAPTION,addr (MNUITEM ptr [esi]).itemcaption
invoke SetDlgItemText,hWin,IDC_EDTITEMNAME,addr (MNUITEM ptr [esi]).itemname
invoke SetDlgItemInt,hWin,IDC_EDTITEMID,(MNUITEM ptr [esi]).itemid,FALSE
test (MNUITEM ptr [esi]).nstate,MFS_CHECKED
.if !ZERO?
mov eax,BST_CHECKED
.else
mov eax,BST_UNCHECKED
.endif
invoke SendDlgItemMessage,hWin,IDC_CHKCHECKED,BM_SETCHECK,eax,0
test (MNUITEM ptr [esi]).nstate,MFS_GRAYED
.if !ZERO?
mov eax,BST_CHECKED
.else
mov eax,BST_UNCHECKED
.endif
invoke SendDlgItemMessage,hWin,IDC_CHKGRAYED,BM_SETCHECK,eax,0
test (MNUITEM ptr [esi]).nstate,MFS_DISABLED
.if !ZERO?
mov eax,BST_CHECKED
.else
mov eax,BST_UNCHECKED
.endif
invoke SendDlgItemMessage,hWin,IDC_CHKDISABLED,BM_SETCHECK,eax,0
test (MNUITEM ptr [esi]).ntype,MFT_RIGHTJUSTIFY
.if !ZERO?
mov eax,BST_CHECKED
.else
mov eax,BST_UNCHECKED
.endif
invoke SendDlgItemMessage,hWin,IDC_CHKRIGHTALIGN,BM_SETCHECK,eax,0
test (MNUITEM ptr [esi]).ntype,MFT_RADIOCHECK
.if !ZERO?
mov eax,BST_CHECKED
.else
mov eax,BST_UNCHECKED
.endif
invoke SendDlgItemMessage,hWin,IDC_CHKRADIO,BM_SETCHECK,eax,0
test (MNUITEM ptr [esi]).ntype,MFT_OWNERDRAW
.if !ZERO?
mov eax,BST_CHECKED
.else
mov eax,BST_UNCHECKED
.endif
invoke SendDlgItemMessage,hWin,IDC_CHKOWNERDRAW,BM_SETCHECK,eax,0
.endif
mov fMnuSel,FALSE
.endif
.endif
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgMenuEditProc endp
SaveMenu proc uses esi edi,hSrc:DWORD,hDest:DWORD
mov esi,hSrc
mov edi,hDest
invoke RtlZeroMemory,edi,MaxMem
mov ecx,sizeof MNUHEAD
rep movsb
@@:
mov eax,(MNUITEM ptr [esi]).itemflag
.if eax
mov ecx,sizeof MNUITEM
.if eax!=-1
rep movsb
.else
add esi,ecx
.endif
jmp @b
.endif
ret
SaveMenu endp
CreateMnu proc uses ebx esi edi,hWin:HWND,lpProItemMem:DWORD
LOCAL hMem:DWORD
LOCAL buffer[MAX_PATH]:BYTE
mov eax,lpProItemMem
.if !eax
invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,MaxMem
mov hMem,eax
invoke GlobalLock,hMem
mov esi,hMem
invoke lstrcpy,addr (MNUHEAD ptr [esi]).menuname,addr szMnuName
push MnuID
pop (MNUHEAD ptr [esi]).menuid
push MnuItemID
pop (MNUHEAD ptr [esi]).startid
invoke DialogBoxParam,hInstance,IDD_DLGMENUEDIT,hWin,addr DlgMenuEditProc,hMem
.if eax
mov eax,hMem
mov [eax].MNUHEAD.changed,TRUE
.else
invoke GlobalUnlock,hMem
invoke GlobalFree,hMem
xor eax,eax
.endif
.else
invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,MaxMem
mov ebx,eax
invoke GlobalLock,ebx
;Copy menu
mov eax,lpProItemMem
mov eax,[eax].PROJECT.hmem
mov hMem,eax
invoke SaveMenu,hMem,ebx
invoke DialogBoxParam,hInstance,IDD_DLGMENUEDIT,hWin,addr DlgMenuEditProc,hMem
.if eax
mov edx,hMem
mov [edx].MNUHEAD.changed,TRUE
invoke GetProjectItemName,lpProItemMem,addr buffer
invoke SetProjectItemName,lpProItemMem,addr buffer
.else
;Restore copy
invoke SaveMenu,ebx,hMem
.endif
invoke GlobalUnlock,ebx
invoke GlobalFree,ebx
mov eax,hMem
.endif
ret
CreateMnu endp
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -