📄 popmenu.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 + -