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

📄 menustack.c

📁 以栈结构实现的多级菜单
💻 C
字号:
#include "MenuStack.h"
#include "Menulist_res.h"
#include "AEEModGen.h"
#include "AEEAppGen.h"
/////////////////////////////////////////////////////////////

static boolean IMENUSTACK_MoveIntoSubMenu(IMenuStack* pStack);
/////////////////////////////////////////////////////////////
IMenuStack* IMENUSTACK_CreateInstance(TMenuItem* pItem,PFNMENUREDRAWHDL *pRedrawCb,PFNGETSELITEM *pGetSelCb)
{
	IMenuStack* pStack=NULL;
	AEEApplet*  pApp=(AEEApplet*)GETAPPINSTANCE();
	if(!pApp) 
		return NULL;
    pStack=MALLOCREC(IMenuStack);
	if(!pStack)
		return NULL;

	pStack->m_pStack=ISTACK_CreateInstance();
	if(!pStack->m_pStack)
	{
		IMENUSTACK_Release(&pStack);
		return NULL;
	}

	if(SUCCESS!=ISHELL_CreateInstance(pApp->m_pIShell,AEECLSID_MENUCTL,(void**)&pStack->m_pCtl))
	{
		IMENUSTACK_Release(&pStack);
		return NULL;
	}

	pStack->m_pGetSelCb=pGetSelCb;
	pStack->m_pRedrawCb=pRedrawCb;
	ISTACK_PushOnStack(pStack->m_pStack,(void*)pItem);
	return pStack;
}
void IMENUSTACK_Release(IMenuStack** pStack)
{
	if(*pStack)
	{
		if((*pStack)->m_pCtl)
			IMENUCTL_Release((*pStack)->m_pCtl);
		ISTACK_Release(&(*pStack)->m_pStack);
		FREEIF(*pStack);
	}
}
boolean IMENUSTACK_Redraw(IMenuStack* pStack)
{
	int nLoop=0;
	uint16 uiSel=0;
	CtlAddItem ai;
	TMenuItem* pMenu; 

	if((!pStack)||(!pStack->m_pCtl)) 
		return FALSE;
	IMENUCTL_DeleteAll(pStack->m_pCtl);

	pMenu=(TMenuItem*)ISTACK_GetTopElement(pStack->m_pStack);
	if(!pMenu)
		return FALSE;

	ai.pImage = NULL;
	while(MENUITEM_NULL!=pMenu[nLoop].tItemId)
	{
		if(pStack->m_pRedrawCb)
			ai.pText = pStack->m_pRedrawCb(pMenu[nLoop].uiResourceId);
		else
			ai.pText = NULL;
		ai.wImage = pMenu[nLoop].tImageId;
		ai.wText = pMenu[nLoop].uiResourceId;
		ai.wItemID = pMenu[nLoop].tItemId;
		ai.wFont = AEE_FONT_NORMAL;
		if(ai.wImage)
			ai.pszResImage = MENULIST_RES_FILE;
		else
			ai.pszResImage = NULL;
		ai.pszResText = MENULIST_RES_FILE;		

		IMENUCTL_AddItemEx(pStack->m_pCtl, &ai);
		FREEIF(ai.pText);
		nLoop++;
	}
	if(pStack->m_pGetSelCb)
	{
		uiSel=pStack->m_pGetSelCb(pMenu);
		if(uiSel>0)
			IMENUCTL_SetSel(pStack->m_pCtl,uiSel);
	}

	IMENUCTL_SetActive(pStack->m_pCtl,TRUE);
	IMENUCTL_Redraw(pStack->m_pCtl);
	return TRUE;
}
boolean IMENUSTACK_HandleEvent(IMenuStack* pStack,AEEEvent eCode,uint16 wParam,uint32 dwParam)
{
	if(!pStack||!pStack->m_pCtl)
		return FALSE;
	switch(eCode)
	{
	case EVT_KEY:
		if(AVK_CLR==wParam)
		{
			ISTACK_PopFromStack(pStack->m_pStack);
			return IMENUSTACK_Redraw(pStack);		
		}
		else
			return IMENUCTL_HandleEvent(pStack->m_pCtl,eCode,wParam,dwParam);
	case EVT_COMMAND:
		return IMENUSTACK_MoveIntoSubMenu(pStack);
	default:
		return FALSE;
	}
}
//////////////////////////////////////////////////////////////////////////////
static boolean IMENUSTACK_MoveIntoSubMenu(IMenuStack* pStack)
{
	TMenuItem* pList;
	TMenuItemId itemId;
	int        SeekLoop=0;

	if(!pStack)
		return FALSE;

	itemId=IMENUCTL_GetSel(pStack->m_pCtl);

	pList=(TMenuItem*)ISTACK_GetTopElement(pStack->m_pStack);
	if(!pList)
		return FALSE;

	while((itemId!=pList[SeekLoop].tItemId)&&
		  (MENUITEM_NULL!=pList[SeekLoop].tItemId))
	SeekLoop++;
	if(MENUITEM_NULL==pList[SeekLoop].tItemId)
		return FALSE;

	if(pList[SeekLoop].ChildFunc)
		if(FALSE==pList[SeekLoop].ChildFunc())
			return FALSE;

	if(!pList[SeekLoop].ptChildMenu)
		return FALSE;
	if(!ISTACK_PushOnStack(pStack->m_pStack,(void*)pList[SeekLoop].ptChildMenu))
		return FALSE;

	return IMENUSTACK_Redraw(pStack);
}

⌨️ 快捷键说明

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