⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menuedit.asm

📁 汇编资源编辑器
💻 ASM
📖 第 1 页 / 共 2 页
字号:
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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -