📄 menuview.cpp
字号:
// MenuView.cpp: implementation of the CMenuView class.
//
//////////////////////////////////////////////////////////////////////
#include "MenuView.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMenuView::CMenuView()
{
}
CMenuView::CMenuView(CGameDoc* pDoc)
{
SetDocument(pDoc);
}
CMenuView::~CMenuView()
{
}
bool CMenuView::OnInitData()
{
m_pScreen = IDISPLAY_GetDestination(((CGameApp*)GETAPPINSTANCE())->m_pIDisplay);
// 存放背景
IBITMAP_CreateCompatibleBitmap(m_pScreen, &m_pbmDbd[0], (uint16)BACKGROUND_WIDTH, (uint16)BACKGROUND_HEIGTH);
// 存放菜单选择
IBITMAP_CreateCompatibleBitmap(m_pScreen, &m_pbmDbd[1], (uint16)16, (uint16)7);
// 这片菜单字
// IBITMAP_CreateCompatibleBitmap(m_pScreen, &m_pbmDbd[2], (uint16)330, (uint16)15);
BEGIN_CHECK
{
CHECK_NULL(m_pBitmap[MAINMENUBG_INDEX], CBitmap::CreateInstance());
CHECK_NULL(m_pBitmap[MENUSELECT_INDEX], CBitmap::CreateInstance());
CHECK_NULL(m_pBitmap[MENUTEXT_INDEX], CBitmap::CreateInstance());
}
CATCH_CHECK
{
CUSTOM_RELEASE(m_pBitmap[MAINMENUBG_INDEX]);
CUSTOM_RELEASE(m_pBitmap[MENUSELECT_INDEX]);
CUSTOM_RELEASE(m_pBitmap[MENUTEXT_INDEX]);
}
END_CHECK
if (LoadMenuBmpRes())
{
// 先取原图存入内存
IBITMAP_BltIn(m_pbmDbd[0], 0, 0, BACKGROUND_WIDTH, BACKGROUND_HEIGTH, m_pBitmap[MAINMENUBG_INDEX]->m_pIBitmap,
0, 0, AEE_RO_COPY);
IBITMAP_BltIn(m_pbmDbd[1], 0, 0, 16, 7, m_pBitmap[MENUSELECT_INDEX]->m_pIBitmap,
0, 0, AEE_RO_COPY);
// IBITMAP_BltIn(m_pbmDbd[2], 0, 0, 330, 15, m_pBitmap[MENUTEXT_INDEX]->m_pIBitmap,
// 0, 0, AEE_RO_COPY);
m_pbmDbd[2] = LoadBmpResData(IDB_MENUTEXT);
// m_pDoc->GetTransparentColor(m_pBitmap[MENUTEXT_INDEX]);
m_pDoc->GetTransparentColor(m_pbmDbd[2]);
IBITMAP_SetTransparencyColor(m_pbmDbd[1], m_pDoc->m_Color);
IBITMAP_SetTransparencyColor(m_pbmDbd[2],m_pDoc->m_Color);
if (m_pBitmap[MENUSELECT_INDEX])
{
CUSTOM_RELEASE(m_pBitmap[MENUSELECT_INDEX]);
m_pBitmap[MENUSELECT_INDEX] = NULL;
}
if (m_pBitmap[MENUTEXT_INDEX])
{
CUSTOM_RELEASE(m_pBitmap[MENUTEXT_INDEX]);
m_pBitmap[MENUTEXT_INDEX] = NULL;
}
}
else
{
CUSTOM_RELEASE(m_pBitmap[MAINMENUBG_INDEX]);
CUSTOM_RELEASE(m_pBitmap[MENUSELECT_INDEX]);
CUSTOM_RELEASE(m_pBitmap[MENUTEXT_INDEX]);
// 释放资源
for (int i = 0; i < 3; i++)
{
if (m_pbmDbd[i])
{
IBITMAP_Release(m_pbmDbd[i]);
m_pbmDbd[i] = NULL;
}
}
if (m_pScreen)
{
IBITMAP_Release(m_pScreen);
m_pScreen = NULL;
}
}
// 将键盘按键全部清空
m_pDoc->GetKeyControl()->InitData();
m_eCurMenu = EMENU_START;// 初始化当前菜单为开始
m_nSelectIndex = 0;
// 画背景
// IBITMAP_BltIn(m_pScreen, 0, 0, BACKGROUND_WIDTH, BACKGROUND_HEIGTH, m_pbmDbd[0],
// 0, 0, AEE_RO_COPY);
AEERect trect;
trect.x = 0;
trect.y = 0;
trect.dx = BACKGROUND_WIDTH;
trect.dy = BACKGROUND_HEIGTH;
DrawTrans(((CGameApp*)GETAPPINSTANCE())->m_pIDisplay, &trect, m_pbmDbd[0]);
return true;
}
void CMenuView::OnResume()
{
CBaseView::OnResume();
}
void CMenuView::OnSetTimer()
{
// 设置定时器
SetTimer(TIME_VIEW, (PFNNOTIFY)(CMenuView::HandleTimer));
}
void CMenuView::OnStartView()
{
// 初始化对象
if (!OnInitData())
{
// Release();
return;
}
m_pDoc->SetCurView(this);
// 设置定时器
CALLBACK_Init(&m_cbTimer, (PFNNOTIFY)HandleTimer, this);
OnSetTimer();
}
void CMenuView::OnSuspend()
{
// 结束定时器
CALLBACK_Cancel(&m_cbTimer);
// // 释放资源
CBaseView::OnSuspend();
}
void CMenuView::OnTimer()
{
// 获取应用程序指针
CGameApp* pApp = (CGameApp*) GETAPPINSTANCE();
if (pApp == NULL)
{
return;
}
// 重新计算数据
if (m_pDoc == NULL)
return;
// 在Doc里处理按键事件
if (!m_pDoc->UpdateMenuView())
return;
OnDraw();
BEGIN_CHECK
{
CHECK_ERROR(ISHELL_SetTimerEx(pApp->m_pIShell, TIME_VIEW, &m_cbTimer));
}
CATCH_CHECK
{
return;
}
END_CHECK
}
bool CMenuView::SetTimer(int32 dwInterval, PFNNOTIFY pfnCallback)
{
CGameApp* pApp = NULL;
BEGIN_CHECK
{
// 取app指针
CHECK_NULL(pApp, (CGameApp*) GETAPPINSTANCE());
CHECK_ERROR(ISHELL_SetTimerEx(pApp->m_pIShell, dwInterval, &m_cbTimer));
}
CATCH_CHECK
{
return false;
}
END_CHECK
return true;
}
void CMenuView::HandleTimer(void* pView)
{
((CMenuView* )pView)->OnTimer();
}
void CMenuView::FreeResourse()
{
// 设置定时器结束标志
m_pDoc->SetExitTimer(true);
// 结束定时器
CALLBACK_Cancel(&m_cbTimer);
// 释放位图资源
if (m_pBitmap[MAINMENUBG_INDEX])
CUSTOM_RELEASE(m_pBitmap[MAINMENUBG_INDEX]);
if (m_pBitmap[MENUSELECT_INDEX])
CUSTOM_RELEASE(m_pBitmap[MENUSELECT_INDEX]);
if (m_pBitmap[MENUTEXT_INDEX])
CUSTOM_RELEASE(m_pBitmap[MENUTEXT_INDEX]);
// 释放资源
for (int8 i = 0; i < 3; i++)
{
if (m_pbmDbd[i])
{
IBITMAP_Release(m_pbmDbd[i]);
m_pbmDbd[i] = NULL;
}
}
if (m_pScreen)
{
IBITMAP_Release(m_pScreen);
m_pScreen = NULL;
}
}
int8 CMenuView::GetMenuIndex(MAINMENU eCurMenu)
{
int nIndex = 0;
switch (eCurMenu)
{
case EMENU_START:
nIndex = 1;
break;
case EMENU_CONTINUE:
nIndex = 2;
break;
case EMENU_HELP:
nIndex = 3;
break;
case EMENU_ABOUT:
nIndex = 4;
break;
case EMENU_STOP:
nIndex = 5;
break;
default:
break;
}
return nIndex;
}
MAINMENU CMenuView::GetMenuFromIndex(int8 nIndex)
{
switch (nIndex)
{
case 1:
return EMENU_START;
case 2:
return EMENU_CONTINUE;
case 3:
return EMENU_HELP;
case 4:
return EMENU_ABOUT;
case 5:
return EMENU_STOP;
default:
return EMENU_START;
}
}
void CMenuView::ExitView(int nViewID)
{
CGameApp* pApp = NULL;
pApp = (CGameApp*) GETAPPINSTANCE();
// 设置定时器结束标志
m_pDoc->SetExitTimer(true);
// 结束定时器
CALLBACK_Cancel(&m_cbTimer);
// 释放位图资源
CUSTOM_RELEASE(m_pBitmap[MAINMENUBG_INDEX]);
CUSTOM_RELEASE(m_pBitmap[MENUSELECT_INDEX]);
CUSTOM_RELEASE(m_pBitmap[MENUTEXT_INDEX]);
if (nViewID != ID_VIEW_STOP)
m_pDoc->SwitchView(nViewID);
else
ISHELL_CloseApplet(((CGameApp*)GETAPPINSTANCE())->m_pIShell, false);
}
boolean CMenuView::LoadMenuBmpRes()
{
BEGIN_CHECK
{
// 加载位图资源
CHECK_ERROR(m_pBitmap[MAINMENUBG_INDEX]->Load(IDB_MENUBG));
CHECK_ERROR(m_pBitmap[MENUSELECT_INDEX]->Load(IDB_SELECT));
// CHECK_ERROR(m_pBitmap[MENUTEXT_INDEX]->Load(IDB_MENUTEXT));
}
CATCH_CHECK
{
CUSTOM_RELEASE(m_pBitmap[MAINMENUBG_INDEX]);
CUSTOM_RELEASE(m_pBitmap[MENUSELECT_INDEX]);
CUSTOM_RELEASE(m_pBitmap[MENUTEXT_INDEX]);
// return false;
}
return true;
}
void CMenuView::OnDraw()
{
CGameApp* pApp = NULL;
BEGIN_CHECK
{
// 取app指针
CHECK_NULL(pApp, (CGameApp*) GETAPPINSTANCE());
}
CATCH_CHECK
{
return;
}
END_CHECK
// 画菜单
DrawMenu();
IDISPLAY_Update (((CGameApp*)GETAPPINSTANCE())->m_pIDisplay);
}
void CMenuView::DrawMenu()
{
IBITMAP_BltIn(m_pScreen, 55, 106, 66, 15,
m_pbmDbd[0], 55, 106, AEE_RO_COPY);
IBITMAP_BltIn(m_pScreen, 44, 110, 8, 7,
m_pbmDbd[1], 0, 0, AEE_RO_TRANSPARENT);
IBITMAP_BltIn(m_pScreen, 124, 110, 8, 7,
m_pbmDbd[1], 8, 0, AEE_RO_TRANSPARENT);
IBITMAP_BltIn(m_pScreen, 55, 106, 66, 15,
m_pbmDbd[2], 66*(m_eCurMenu-1), 0, AEE_RO_TRANSPARENT);
}
void CMenuView::DrawTrans(IDisplay *pIDisplay, AEERect *pRect, IBitmap *pTransBmp)
{
// IBitmap* pDeviceScreen;
IBitmap* pMemScreen;
int16 x;
int16 y;
NativeColor ncScreen;
NativeColor ncTransBmp;
uint8 Screen[3];
uint8 TransBmp[3];
int8 A = 100;
IBITMAP_CreateCompatibleBitmap(m_pScreen, &pMemScreen, pRect->dx, pRect->dy);
IBITMAP_BltIn(pMemScreen, 0, 0, pRect->dx, pRect->dy, m_pScreen, pRect->x, pRect->y, AEE_RO_COPY);
IDISPLAY_BitBlt(pIDisplay, pRect->x, pRect->y, pRect->dx, pRect->dy, pTransBmp, 0, 0, AEE_RO_COPY);
for ( x = 0; x < pRect->dx; x++)
{
for ( y = 0; y < pRect->dy; y++)
{
IBITMAP_GetPixel(pMemScreen, x, y, &ncScreen);
IBITMAP_GetPixel(m_pScreen, x + pRect->x, y + pRect->y, &ncTransBmp);
Screen[0] = (uint8)(ncScreen & 0x1F);
Screen[1] = (uint8)((ncScreen >>5) & 0x3F);
Screen[2] = (uint8)((ncScreen >>11) & 0x1F);
TransBmp[0] = (uint8)(ncTransBmp & 0x1F);
TransBmp[1] = (uint8)((ncTransBmp >>5) & 0x3F);
TransBmp[2] = (uint8)((ncTransBmp >>11) & 0x1F);
// Screen[0] = (Screen[0] >> 1) + (TransBmp[0] >> 1);
// Screen[1] = (Screen[1] >> 1) + (TransBmp[1] >> 1);
// Screen[2] = (Screen[2] >> 1) + (TransBmp[2] >> 1);
Screen[0] = (Screen[0] * (100 - A))/100 + (TransBmp[0] * A)/100;
Screen[1] = (Screen[1] * (100 - A))/100 + (TransBmp[1] * A)/100;
Screen[2] = (Screen[2] * (100 - A))/100 + (TransBmp[2] * A)/100;
ncScreen = (uint32)(Screen[2] << 11) + (uint32)(Screen[1] << 5) + (uint32)Screen[0];
IBITMAP_DrawPixel(m_pScreen, x + pRect->x, y + pRect->y, ncScreen, AEE_RO_COPY);
}
}
IBITMAP_Release(pMemScreen);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -