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

📄 popmenu.c

📁 brew一些源码
💻 C
字号:
/*
包明辉 CPopMenu , 弹出式文字菜单。
2006_8_23
*/
#include "PopMenu.h"
CPopMenu* CPopMenu_New(AEEApplet* pThis , AEERect* pRect)
{
	CPopMenu*	pRet = NULL;
	if(NULL == pThis || NULL == pRect)//验证参数的正确性
		return NULL;
	pRet = (CPopMenu*)MALLOC(sizeof(CPopMenu));
	if(!pRet)
		return NULL;
	MEMSET(pRet , 0 , sizeof(CPopMenu));
	if(SUCCESS != IDISPLAY_GetDeviceBitmap(pThis->m_pIDisplay , (void*)&pRet->m_pDevBit))
	{
		POPMENU_FREE(pRet);
		return NULL;
	}
	//给pMenu初始化数据
	pRet->m_pThis = pThis;
	pRet->m_pRect = pRect;
	return pRet;
}
boolean	CPopMenu_SetItems(CPopMenu* pThis , const char* pResFile , uint16* pnIDItem , uint16 nItems)	
{
	int16		i;
	if(NULL == pThis || NULL == pResFile || NULL == pnIDItem || 0 == nItems)
		return FALSE;
	
	CPopMenu_ClearItems(pThis);
	pThis->m_pItems = (CPopItem*)MALLOC(nItems * sizeof(CPopItem));
	if(NULL == pThis->m_pItems)
		return FALSE;
	MEMSET(pThis->m_pItems , 0 , nItems * sizeof(CPopItem));
	for(i = 0 ; i < nItems ; i++)
	{
		ISHELL_LoadResString(pThis->m_pThis->m_pIShell , pResFile , pnIDItem[i] , pThis->m_pItems[i].m_szAeName , POPMENU_ITEMMAX_CHAR * sizeof(AECHAR));
		pThis->m_pItems[i].m_bAble = TRUE;
		pThis->m_pItems[i].m_nID = pnIDItem[i];
	}
	//给pMenu初始化数据
	pThis->m_nItemCount = nItems;
	return TRUE;
}
void CPopMenu_ClearItems(CPopMenu* pThis)
{
	if(NULL == pThis)
	{
		return;
	}
	DrawClear(pThis);
	FREEIF(pThis->m_pItems);
	pThis->m_nItemCount = 0;
}
void PopMenu_SetItemAble(CPopMenu* pThis , uint16 nIndex , boolean bFlag)
{
	if(NULL == pThis)
		return;
	if(NULL == pThis->m_pItems)
		return;
	if(nIndex >= pThis->m_nItemCount)
		return;
	pThis->m_pItems[nIndex].m_bAble = bFlag;
}
void CPopMenu_Release(CPopMenu** ppThis)
{
	if(ppThis && *ppThis)
	{
		CPopMenu_ClearItems(*ppThis);
		if((*ppThis)->m_pDevBit)
			IBITMAP_Release((*ppThis)->m_pDevBit);
		FREEIF(*ppThis);
		*ppThis = NULL;
	}
}
boolean	CPopMenu_IsActive(CPopMenu* pThis)
{
	return pThis->m_bActive;
}
void CPopMenu_SetActive(CPopMenu* pThis , boolean bFlag)
{
	if(NULL == pThis)
		return;
	if(pThis->m_bActive == bFlag)	//防止重复设置
		return;
	if(bFlag)
	{
		AEERect		tagRect;
		if(FALSE == CPopMenu_Init(pThis))
			return;
		//////////////////////////////////////////////////////////////////////////
		//创建pThis->m_pBitMap菜单背景
		SETAEERECT(&tagRect , 0 , 0 , pThis->m_tagMen.dx , pThis->m_tagMen.dy);
		IBITMAP_BltIn(pThis->m_pBitMap , 0 , 0 , (int)pThis->m_tagMen.dx , (int)pThis->m_tagMen.dy , pThis->m_pDevBit , (int)pThis->m_tagMen.x , (int)pThis->m_tagMen.y , AEE_RO_COPY);
		AlphaBitmap(pThis->m_pThis->m_pIDisplay , 12 , pThis->m_pBitMap , MAKE_RGB(0 , 0 , 0) , &tagRect);
		AlphaBitmap(pThis->m_pThis->m_pIDisplay , 8 , pThis->m_pDevBit , MAKE_RGB(0 , 0 , 0) , pThis->m_pRect);
		IDISPLAY_SetDestination(pThis->m_pThis->m_pIDisplay , pThis->m_pBitMap);
		IDISPLAY_DrawRect(pThis->m_pThis->m_pIDisplay , &tagRect , MAKE_RGB(255 , 255 , 255) , MAKE_RGB(255 , 255 , 255) , IDF_RECT_FRAME);
		IDISPLAY_SetDestination(pThis->m_pThis->m_pIDisplay , NULL);
#ifdef POPMENU_ACTION
		IBITMAP_BltIn(pThis->m_pBiMatBack , 0 , 0 , (int)pThis->m_tagMen.dx , (int)pThis->m_tagMen.dy , pThis->m_pBitMap , 0 , 0 , AEE_RO_COPY);
		{
			uint16		i;
			uint16		j;
			IDISPLAY_SetDestination(pThis->m_pThis->m_pIDisplay , pThis->m_pBiMatBack);
			IDISPLAY_SetColor(pThis->m_pThis->m_pIDisplay , CLR_USER_TEXT , MAKE_RGB(255 , 255 , 255));
			j = pThis->m_nFrist;
			for(i = 0 ; i < pThis->m_nPgSiz ; i++)
			{
				while(j < pThis->m_nItemCount)
				{
					if(pThis->m_pItems[j].m_bAble)
						break;
					j++;
				}
				IDISPLAY_DrawText(pThis->m_pThis->m_pIDisplay , AEE_FONT_BOLD , 
				pThis->m_pItems[j].m_szAeName , -1 , POPMENU_ITEM_XPIC , (int)(POPMENU_ITEM_YPIC + (i * POPMENU_ITEMBET)) , NULL , IDF_TEXT_TRANSPARENT);
				j++;
			}
			IDISPLAY_SetDestination(pThis->m_pThis->m_pIDisplay , NULL);
		}
		pThis->t_nStep = 0;
		DrawAction(pThis);
#else
		CPopMenu_ReDraw(pThis);
#endif
	}
	else
	{
#ifdef POPMENU_ACTION 
		pThis->t_nStep = 100;
#endif
		DrawClear(pThis);
	}
	pThis->m_bActive = bFlag;
}
void CPopMenu_Draw(CPopMenu* pThis)
{
	if(NULL == pThis)
		return;
	if(pThis->m_bActive)
		CPopMenu_ReDraw(pThis);
}

#ifdef POPMENU_ACTION
void	DrawAction(CPopMenu* pThis)
{
	if(16 < pThis->t_nStep)
	{
		if(pThis->m_bActive)
			CPopMenu_ReDraw(pThis);
		return;
	}
	pThis->t_nStep++;
	AlphaBitmapEx(pThis->m_pThis->m_pIDisplay , pThis->t_nStep , NULL , pThis->m_pBiMatBack , pThis->m_tagMen.x , pThis->m_tagMen.y , FALSE);
	IDISPLAY_Update(pThis->m_pThis->m_pIDisplay);
	ISHELL_SetTimer(pThis->m_pThis->m_pIShell , 60 , (PFNNOTIFY)DrawAction , (void*)pThis);		
}
#endif

boolean CPopMenu_HandleEvent(CPopMenu* pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
	if(FALSE == pMe->m_bActive)
		return FALSE;
	if(EVT_KEY == eCode) 
	{
#ifdef POPMENU_ACTION 
		pMe->t_nStep = 100;
#endif
		switch(wParam) 
		{
		case AVK_DOWN:
			pMe->m_nIndex = (pMe->m_nIndex + 1) % pMe->m_nNowCo; 
			break;
		case AVK_UP:
			pMe->m_nIndex = (pMe->m_nIndex + pMe->m_nNowCo - 1) % pMe->m_nNowCo;
			break;
		case AVK_LEFT:
			pMe->m_nIndex = 0;
			break;
		case AVK_RIGHT:
			pMe->m_nIndex = pMe->m_nNowCo - 1;
			break;
		case AVK_SELECT:
		case AVK_SOFT2:
			ISHELL_PostEvent(pMe->m_pThis->m_pIShell , ISHELL_ActiveApplet(pMe->m_pThis->m_pIShell) , MY_COMMAND , (word)pMe->m_nNowCm , (dword)0);
			pMe->m_bActive = FALSE;
			return TRUE;
		default:
			return FALSE;
		}
		CPopMenu_ReDraw(pMe);
		return TRUE;
	}
	return FALSE;
}


void CPopMenu_SetPoint(CPopMenu* pThis , int nx , int ny)
{
	pThis->m_x = nx;
	pThis->m_y = ny;
}
void CPopMenu_SetItemAble(CPopMenu* pThis , uint16 nIndex , boolean bFlag)
{
	if(NULL == pThis)
		return;
	if(NULL == pThis->m_pItems || nIndex >= pThis->m_nItemCount)
		return;
	pThis->m_pItems[nIndex].m_bAble = bFlag;
}
boolean CPopMenu_Init(CPopMenu* pThis)
{
	boolean		bFirst = TRUE;
	int			i , j;
	DrawClear(pThis);
	pThis->m_nNowCo = 0;
	for(i = 0 ; i < pThis->m_nItemCount ; i++)
	{
		if(pThis->m_pItems[i].m_bAble)
		{
			if(bFirst)
			{
				pThis->m_nFrist = i;
				bFirst = FALSE;
			}
			pThis->m_nNowCo++;
		}
	}
	pThis->m_nPgSiz = MIN(pThis->m_nNowCo , POPMENU_ITEM_COUNT);
	if(0 == pThis->m_nNowCo)
		return FALSE;
	j = 0;
	for(i = (int)pThis->m_nItemCount - 1 ; i >= 0 ; i--)
	{
		if(pThis->m_pItems[i].m_bAble)
		{
			j++;
			if(j >= pThis->m_nPgSiz)
			{
				pThis->m_nLastd = i;
				break;
			}
		}
	}
	pThis->m_nLastd = (pThis->m_nFrist < pThis->m_nLastd) ? pThis->m_nLastd : pThis->m_nFrist;
	pThis->m_nIndex = 0;
	pThis->m_nPaeIx = 0;
	pThis->m_nNowIx = pThis->m_nFrist;
	pThis->m_nNowCm = pThis->m_nFrist;
	pThis->m_tagMen.x = pThis->m_x;
	pThis->m_tagMen.y = pThis->m_y - (pThis->m_nPgSiz * POPMENU_ITEMBET);
	pThis->m_tagMen.dx = POPMENU_ITEM_WIDTH;
	pThis->m_tagMen.dy = pThis->m_nPgSiz * POPMENU_ITEMBET;
	if(SUCCESS != IBITMAP_CreateCompatibleBitmap(pThis->m_pDevBit , (void*)&pThis->m_pBitMap , pThis->m_tagMen.dx , pThis->m_tagMen.dy))
		return FALSE;
#ifdef POPMENU_ACTION
	if(SUCCESS != IBITMAP_CreateCompatibleBitmap(pThis->m_pDevBit , (void*)&pThis->m_pBiMatBack , pThis->m_tagMen.dx , pThis->m_tagMen.dy))
	{
		DrawClear(pThis);
		return FALSE;
	}
#endif
	return TRUE;
}
//////////////////////////////////////////////////////////////////////////
//私有函数
void DrawClear(CPopMenu* pThis)
{
	if(NULL == pThis)
		return;
	if(pThis->m_pBitMap)
		IBITMAP_Release(pThis->m_pBitMap);
	pThis->m_pBitMap = NULL;
#ifdef POPMENU_ACTION
	if(pThis->m_pBiMatBack)
		IBITMAP_Release(pThis->m_pBiMatBack);
	pThis->m_pBiMatBack = NULL;
#endif

	MEMSET(&pThis->m_tagMen , 0 , sizeof(AEERect));
	pThis->m_bActive = FALSE;
	pThis->m_nIndex = 0;
	pThis->m_nFrist = 0;			//菜单第一项索引
	pThis->m_nLastd = 0;			//菜单最后一项索引
	pThis->m_nNowIx = 0;			//菜单当前索引项
	pThis->m_nPaeIx = 0;			//当前页索引
	pThis->m_nNowCo = 0;			//当前可见菜单数目
	pThis->m_nPgSiz = 0;			//当前叶数
}
void CPopMenu_ReDraw(CPopMenu* pThis)
{
	uint16	nNowIndex;
	uint16	i , j = 0;
	uint16	nPaeIx = pThis->m_nPaeIx;
	AEERect	tagRect;

	if(NULL == pThis->m_pBitMap)
		return;
	
	if(nPaeIx >= pThis->m_nIndex)
		nPaeIx = pThis->m_nIndex;
	else if((nPaeIx + pThis->m_nPgSiz) < (pThis->m_nIndex + 1))
		nPaeIx = pThis->m_nIndex - pThis->m_nPgSiz + 1;
	if(nPaeIx != pThis->m_nPaeIx)
	{
		j = 0;
		for(i = pThis->m_nFrist ; i < pThis->m_nItemCount ; i ++)
		{
			if(pThis->m_pItems[i].m_bAble)
			{
				j++;
				if(j > nPaeIx)
				{
					pThis->m_nNowIx = i;
					break;
				}
			}
		}
		pThis->m_nNowIx = MIN(pThis->m_nNowIx , pThis->m_nLastd);
		pThis->m_nPaeIx = nPaeIx;
	}
	IDISPLAY_BitBlt(pThis->m_pThis->m_pIDisplay , (int)pThis->m_tagMen.x , (int)pThis->m_tagMen.y , (int)pThis->m_tagMen.dx , (int)pThis->m_tagMen.dy , pThis->m_pBitMap , 0 , 0 , AEE_RO_COPY);
	IDISPLAY_SetColor(pThis->m_pThis->m_pIDisplay , CLR_USER_TEXT , MAKE_RGB(255 , 255 , 255));
	nNowIndex = pThis->m_nIndex - pThis->m_nPaeIx;
	j = pThis->m_nNowIx;
	for(i = 0 ; i < pThis->m_nPgSiz ; i++)
	{ 
		while(j < pThis->m_nItemCount)
		{
			
			if(pThis->m_pItems[j].m_bAble)
			{
				if(i == nNowIndex)
					pThis->m_nNowCm = j;
				break;
			}
			j++;
		}
		IDISPLAY_DrawText(pThis->m_pThis->m_pIDisplay , AEE_FONT_BOLD , 
		pThis->m_pItems[j].m_szAeName , -1 , pThis->m_tagMen.x + POPMENU_ITEM_XPIC , (int)(pThis->m_tagMen.y + POPMENU_ITEM_YPIC + (i * POPMENU_ITEMBET)) , NULL , IDF_TEXT_TRANSPARENT);
		j++;
	}
	//IDISPLAY_SetColor(pThis->m_pThis->m_pIDisplay , CLR_USER_TEXT , color);
	//////////////////////////////////////////////////////////////////////////
	//显示高亮
	if(pThis->m_nPgSiz == pThis->m_nNowCo)//不用绘制滚动条
	{
		SETAEERECT(&tagRect , (pThis->m_tagMen.x + 1) , (pThis->m_tagMen.y + (nNowIndex * POPMENU_ITEMBET) + 1) , POPMENU_ITEM_WIDTH - 2 , POPMENU_ITEMBET - 2);
		IDISPLAY_DrawRect(pThis->m_pThis->m_pIDisplay , &tagRect , MAKE_RGB(255 , 255 , 0) , MAKE_RGB(255 , 0 , 0) , IDF_RECT_FRAME);
	}
	else
	{
		SETAEERECT(&tagRect , (pThis->m_tagMen.x + 1) , (pThis->m_tagMen.y + (nNowIndex * POPMENU_ITEMBET) + 1) , POPMENU_ITEM_WIDTH - 7 , POPMENU_ITEMBET - 2);
		IDISPLAY_DrawRect(pThis->m_pThis->m_pIDisplay , &tagRect , MAKE_RGB(255 , 255 , 0) , MAKE_RGB(255 , 0 , 0) , IDF_RECT_FRAME);
		tagRect.x = pThis->m_tagMen.x + pThis->m_tagMen.dx - 5;
		tagRect.y = pThis->m_tagMen.y + 1;
		tagRect.dx = POPMENU_SCROLL_WIDTH;
		tagRect.dy = pThis->m_tagMen.dy - 2;
		IDISPLAY_FillRect(pThis->m_pThis->m_pIDisplay , &tagRect , MAKE_RGB(0 , 0 , 0));
		tagRect.dy = (pThis->m_nPgSiz * pThis->m_tagMen.dy)/ pThis->m_nNowCo;
		tagRect.y = pThis->m_tagMen.y + ((pThis->m_nPaeIx * (pThis->m_tagMen.dy - 2)) / pThis->m_nNowCo) + 1;
		IDISPLAY_FillRect(pThis->m_pThis->m_pIDisplay , &tagRect , MAKE_RGB(255 , 255 , 255));
	}
	//////////////////////////////////////////////////////////////////////////
	//把绘制好的菜单弄到屏幕上
	IDISPLAY_Update(pThis->m_pThis->m_pIDisplay);
}

⌨️ 快捷键说明

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