📄 ppbitmap.cpp
字号:
// PPBitmap.cpp: implementation of the CPPBitmap class.
//
//////////////////////////////////////////////////////////////////////
#include "PPBitmap.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPPBitmap::CPPBitmap()
{
m_pIBitmap = NULL;
}
CPPBitmap::CPPBitmap(IBitmap* pIBitmap)
{
m_pIBitmap = pIBitmap;
}
CPPBitmap::~CPPBitmap()
{
}
CPPBitmap* CPPBitmap::CreateInstance()
{
CPPBitmap* pObj = new CPPBitmap();
// 如果实例创建成功,调用初始化函数
// if (pObj)
// {
// if (!pObj->InitData())
// {
// pObj->Release();
// pObj = NULL;
// }
// }
// 返回实例指针
return pObj;
}
boolean CPPBitmap::Load(int nResID)
{
// 首先释放原有资源
// FreeData();
// 载入图片
CPPGameApp* pApp = NULL;
IShell* pIShell = NULL;
BEGIN_CHECK
{
CHECK_NULL(pApp, (CPPGameApp*)GETAPPINSTANCE());
CHECK_NULL(pIShell, pApp->m_pIShell);
CHECK_NULL(m_pIBitmap, ISHELL_LoadResBitmap(pIShell, PP_RES_FILE, nResID));
}
CATCH_CHECK
{
CUSTOM_RELEASE(pApp);
ISHELL_Release(pIShell);
IBITMAP_Release(m_pIBitmap);
return EFAILED;
}
END_CHECK
return SUCCESS;
}
void CPPBitmap::FreeData()
{
if (m_pIBitmap)
IBITMAP_Release(m_pIBitmap);
}
int CPPBitmap::Draw(int nDrawX, int nDrawY, int nDrawAlign, AEERasterOp rop /* = AEE_RO_TRANSPARENT */)
{
int nReturn;
// 获取图片大小
AEEBitmapInfo bmpInfo;
nReturn = GetBMPInfo(bmpInfo);
if (nReturn != SUCCESS)
return nReturn;
// 获取显示的设备
IBitmap* pScreen;
nReturn = IDISPLAY_GetDeviceBitmap(((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay, &pScreen);
if (nReturn != SUCCESS)
{
IRELEASE(pScreen, BITMAP);
return nReturn;
}
CPPBitmap bmpDisplay(pScreen);
// 绘图
BltIn(bmpDisplay.m_pIBitmap, nDrawX, nDrawY, bmpInfo.cx, bmpInfo.cy, 0, 0, rop);
IDISPLAY_Update(((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay);
IRELEASE(pScreen, BITMAP);
return SUCCESS;
}
int CPPBitmap::Draw(boolean bSheer, int nDrawX, int nDrawY, int nSrcX, int nSrcY, AEERasterOp rop)
{
IBitmap* pbmScreen = NULL;
IBitmap* pbmDdb = NULL;
NativeColor color;
AEEBitmapInfo bi;
pbmScreen = IDISPLAY_GetDestination(((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay);
IBITMAP_GetInfo(m_pIBitmap, &bi, sizeof(bi));
IBITMAP_CreateCompatibleBitmap(pbmScreen, &pbmDdb, (uint16)bi.cx, (uint16)bi.cy);
IBITMAP_BltIn(pbmDdb, 0, 0, bi.cx, bi.cy, m_pIBitmap, nSrcX, nSrcY, AEE_RO_COPY);
if (bSheer)
{
IBITMAP_GetPixel(pbmDdb, 0, 0, &color);
IBITMAP_SetTransparencyColor(pbmDdb,color);
}
IBITMAP_BltIn(pbmScreen, nDrawX, nDrawY, bi.cx, bi.cy, pbmDdb, 0, 0, AEE_RO_TRANSPARENT);
IDISPLAY_Update (((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay);
IBITMAP_Release(pbmDdb);
IBITMAP_Release(pbmScreen);
return SUCCESS;
}
int CPPBitmap::GetBMPInfo(AEEBitmapInfo& bmpInfo)
{
if (m_pIBitmap == NULL)
{
return EBADCLASS;
}
return IBITMAP_GetInfo(m_pIBitmap, &bmpInfo, sizeof(bmpInfo));
}
int CPPBitmap::GetTopLeftCoord(AEEPoint& ptTopLeft, int nDrawX, int nDrawY, int nDrawAlign)
{
// 获取计算需要使用的图片大小
AEEBitmapInfo bmpInfo;
int nReturn = GetBMPInfo(bmpInfo);
if (nReturn != SUCCESS)
{
return nReturn;
}
// 计算横坐标
switch (nDrawAlign & EDD_ALIGNHORZ_MASK)
{
// 右对齐时,图片左上角坐标等于图片显示坐标减去图片宽度
case EDD_ALIGN_RIGHT:
ptTopLeft.x = nDrawX - (int)bmpInfo.cx;
break;
// 居中对齐时,图片左上角坐标等于图片显示坐标减去图片宽度一半
case EDD_ALIGN_CENTER:
ptTopLeft.x = nDrawX - (int)bmpInfo.cx / 2;
break;
// 缺省情况下使用左对齐
case EDD_ALIGN_LEFT:
default:
ptTopLeft.x = nDrawX;
break;
}
// 计算纵坐标
switch (nDrawAlign & EDD_ALIGNVERT_MASK)
{
// 底部对齐时,图片左上角坐标等于图片显示坐标减去图片宽度
case EDD_ALIGN_BOTTOM:
ptTopLeft.y = nDrawY - (int)bmpInfo.cy;
break;
// 居中对齐时,图片左上角坐标等于图片显示坐标减去图片宽度一半
case EDD_ALIGN_MIDDLE:
ptTopLeft.y = nDrawY - (int)bmpInfo.cy / 2;
break;
// 缺省情况下使用顶部对齐
case EDD_ALIGN_TOP:
default:
ptTopLeft.y = nDrawX;
break;
}
return SUCCESS;
}
int CPPBitmap::BltIn(IBitmap* pDest, int xDest, int yDest, int dx, int dy,
int xSrc, int ySrc, AEERasterOp rop)
{
if (m_pIBitmap == NULL)
{
return EBADCLASS;
}
return IBITMAP_BltIn(pDest, xDest, yDest, dx, dy, m_pIBitmap, xSrc, ySrc, rop);
}
void CPPBitmap::Release()
{
FreeData();
if (this)
delete this;
}
int CPPBitmap::Draw(int nDrawX, int nDrawY, int dx, int dy, int xSrc, int ySrc, AEERasterOp rop)
{
IBitmap* pbmScreen = NULL;
IBitmap* pbmDdb = NULL;
NativeColor color;
AEEBitmapInfo bi;
pbmScreen = IDISPLAY_GetDestination(((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay);
IBITMAP_GetInfo(m_pIBitmap, &bi, sizeof(bi));
IBITMAP_CreateCompatibleBitmap(pbmScreen, &pbmDdb, (uint16)bi.cx, (uint16)bi.cy);
IBITMAP_BltIn(pbmDdb, 0, 0, dx, dy, m_pIBitmap, xSrc, ySrc, AEE_RO_COPY);
IBITMAP_GetPixel(pbmDdb, 0, 0, &color);
IBITMAP_SetTransparencyColor(pbmDdb,color);
IBITMAP_BltIn(pbmScreen, nDrawX, nDrawY, dx, dy, pbmDdb, 0, 0, AEE_RO_TRANSPARENT);
IDISPLAY_Update (((CPPGameApp*)GETAPPINSTANCE())->m_pIDisplay);
IBITMAP_Release(pbmDdb);
IBITMAP_Release(pbmScreen);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -