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

📄 menuview.cpp

📁 看到有兄弟提出的半透明算法
💻 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 + -