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

📄 menuedit.asm

📁 汇编资源编辑器
💻 ASM
📖 第 1 页 / 共 2 页
字号:

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 + -