📄 mmires_anim.cpp
字号:
// MMIRes_Anim.cpp: implementation of the CMMIRes class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "resourceeditor.h"
#include "MMIRes.h"
#include "mmi_anim_def.h"
CString CMMIRes::MakeAnimID(LPCTSTR pszDirName)
{
_ASSERTE( pszDirName != NULL );
LPCTSTR pFind = _tcsrchr(pszDirName, _T('\\'));
if( NULL == pFind )
pFind = pszDirName;
else
pFind++;
CString strDirName = pFind;
int nLeft = strDirName.ReverseFind(_T('.'));
if( nLeft > 0 )
strDirName = strDirName.Left(nLeft);
strDirName.MakeUpper();
return strDirName;
}
BOOL CMMIRes::AddAnim( LPCTSTR pszID, LPCTSTR pszDirName )
{
_ASSERTE( pszID != NULL && !AnimIsExist(pszID) );
_ASSERTE( pszDirName != NULL );
PANIMINFO pAnimInfo = NULL;
UINT nRGB = 0;
if(m_mapAnim.GetCount() != 0)
{
POSITION pos = m_mapAnim.GetStartPosition();
CString strKey;
if(pos != NULL)
{
m_mapAnim.GetNextAssoc( pos, strKey, pAnimInfo );
_ASSERTE( pAnimInfo != NULL );
CBmpProcessor bmpProc;
nRGB = bmpProc.GetAnimTransColor(pAnimInfo->pCompressed);
}
}
LPBYTE pAnim = NULL;
int nSize = 0;
int nNum = 0;
if( m_bmpProcessor.CompressMovie(pszDirName, pAnim, nSize, nNum, nRGB) )
{
PANIMINFO pAnimInfo = new ANIM_INFO_T;
if( pAnimInfo == NULL )
{
_tcscpy(m_szErrMsg, _T("memory no enough!"));
m_bmpProcessor.ReleaseCompressedStream(pAnim);
return FALSE;
}
pAnimInfo->pCompressed = pAnim;
pAnimInfo->nSize = nSize;
pAnimInfo->nFrameNum = nNum;
m_mapAnim.SetAt(pszID, pAnimInfo);
m_Resource.ToolUsedInfo.nUsedSize += ( sizeof(ANIM_FLAG_T) + sizeof(uint8 *) +
pAnimInfo->nSize );
return TRUE;
}
else
{
_tcscpy(m_szErrMsg, _T("CompressMovie fail!"));
}
return FALSE;
}
BOOL CMMIRes::ExportAnim( LPCTSTR pszID, LPCTSTR pszDirName )
{
PANIMINFO pAnimInfo =NULL;
VERIFY( m_mapAnim.Lookup(pszID, pAnimInfo) );
if(m_bmpProcessor.UnCompressMovie(pAnimInfo->pCompressed,pszDirName))
{
_tcscpy(m_szErrMsg, _T("UnCompressMovie failed!"));
return FALSE;
}
return TRUE;
}
BOOL CMMIRes::DeleteAnim(LPCTSTR pszID)
{
_ASSERTE( pszID != NULL );
PANIMINFO pAnimInfo = NULL;
if( !m_mapAnim.Lookup(pszID, pAnimInfo) )
return TRUE;
m_Resource.ToolUsedInfo.nUsedSize -= (sizeof(ANIM_FLAG_T) + sizeof(uint8 *) + pAnimInfo->nSize);
m_bmpProcessor.ReleaseCompressedStream( pAnimInfo->pCompressed );
delete pAnimInfo;
return m_mapAnim.RemoveKey(pszID);
}
BOOL CMMIRes::ReplaceAnim( LPCTSTR pszID, LPCTSTR pszDirName, int bCheckLimit /* = FALSE */,
PUINT pOldSize /* = NULL */, PUINT pNewSize /* = NULL */ )
{
_ASSERTE( pszID != NULL && AnimIsExist(pszID) );
_ASSERTE( pszDirName != NULL );
PANIMINFO pAnimInfo = NULL;
UINT nRGB = 0;
if(m_mapAnim.GetCount() != 0)
{
POSITION pos = m_mapAnim.GetStartPosition();
CString strKey;
if(pos != NULL)
{
m_mapAnim.GetNextAssoc( pos, strKey, pAnimInfo );
_ASSERTE( pAnimInfo != NULL );
CBmpProcessor bmpProc;
nRGB = bmpProc.GetAnimTransColor(pAnimInfo->pCompressed);
}
}
LPBYTE pAnim = NULL;
int nSize = 0;
int nNum = 0;
if( m_bmpProcessor.CompressMovie(pszDirName, pAnim, nSize, nNum, nRGB) )
{
PANIMINFO pAnimInfo = NULL;
VERIFY( m_mapAnim.Lookup(pszID, pAnimInfo) );
if( bCheckLimit && m_Resource.ToolUsedInfo.nMaxLimitSize > 0 )
{
UINT nMaxSize = m_Resource.ToolUsedInfo.nUsedSize;
nMaxSize += ( nSize - pAnimInfo->nSize );
if( nMaxSize > m_Resource.ToolUsedInfo.nMaxLimitSize )
{
_stprintf(m_szErrMsg, _T("Exceed the limit size %d!"), m_Resource.ToolUsedInfo.nMaxLimitSize );
m_bmpProcessor.ReleaseCompressedStream(pAnim);
return FALSE;
}
}
m_Resource.ToolUsedInfo.nUsedSize += ( nSize- pAnimInfo->nSize );
if( pOldSize != NULL ) *pOldSize = pAnimInfo->nSize;
if( pNewSize != NULL ) *pNewSize = nSize;
m_bmpProcessor.ReleaseCompressedStream(pAnimInfo->pCompressed);
pAnimInfo->pCompressed = pAnim;
pAnimInfo->nSize = nSize;
pAnimInfo->nFrameNum = nNum;
return TRUE;
}
_tcscpy(m_szErrMsg, _T("Compress movie fail!") );
return FALSE;
}
BOOL CMMIRes::AnimIsExist( LPCTSTR pszID)
{
_ASSERTE( pszID != NULL );
PANIMINFO pAnimInfo = NULL;
return m_mapAnim.Lookup(pszID, pAnimInfo);
}
int CMMIRes::CalcAnimResSize(void)
{
int nCount = m_mapAnim.GetCount();
int nSize = sizeof(MMI_ANIM_DATA_T);
nSize += sizeof(ANIM_FLAG_T) * nCount;
nSize += sizeof(uint8 *) * nCount;
CString strKey;
PANIMINFO pAnimInfo = NULL;
POSITION pos = m_mapAnim.GetStartPosition();
while( pos != NULL )
{
m_mapAnim.GetNextAssoc( pos, strKey, pAnimInfo );
_ASSERTE( pAnimInfo != NULL );
nSize += pAnimInfo->nSize;
}
return nSize;
}
BOOL CMMIRes::AnimRecompress(UINT nTransColor /*= 0*/ )
{
CString strKey;
PANIMINFO pAnimInfo = NULL;
POSITION pos = m_mapAnim.GetStartPosition();
CBmpProcessor bmpPrc;
BOOL bRet = TRUE;
//存放动画的临时文件夹
_TCHAR szPathTemp[_MAX_PATH];
::GetModuleFileName(NULL, szPathTemp, _MAX_PATH);
LPTSTR pFind = _tcsrchr(szPathTemp, _T('\\'));
_tcscpy( pFind + 1, _T("AnimTemp") );
while( pos != NULL )
{
m_mapAnim.GetNextAssoc( pos, strKey, pAnimInfo );
_ASSERTE( pAnimInfo != NULL );
bmpPrc.UnCompressMovie(pAnimInfo->pCompressed,szPathTemp);
delete []pAnimInfo->pCompressed;
bmpPrc.CompressMovie(szPathTemp,pAnimInfo->pCompressed,pAnimInfo->nSize,
pAnimInfo->nFrameNum,nTransColor);
if(!DeleteDirectory(szPathTemp))
{
bRet = FALSE;
break;
}
}
return bRet;
}
BOOL CMMIRes::DeleteDirectory(LPCTSTR lpszDirName)// DeleteDirectory(_T("c:\\aaa"))
{
CFileFind tempFind;
_TCHAR tempFileFind[MAX_PATH] = {0};
_stprintf(tempFileFind,_T("%s\\*.*"),lpszDirName);
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
{
_TCHAR foundFileName[MAX_PATH] = {0};
_tcscpy(foundFileName,tempFind.GetFileName().GetBuffer(MAX_PATH));
if(tempFind.IsDirectory())
{
_TCHAR tempDir[MAX_PATH] = {0};
_stprintf(tempDir,_T("%s\\%s"),lpszDirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{
_TCHAR tempFileName[MAX_PATH] = {0};
_stprintf(tempFileName,_T("%s\\%s"),lpszDirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
tempFind.Close();
if(!RemoveDirectory(lpszDirName))
{
AfxMessageBox(IDS_ERR_DELETE_DIR_FAIL);
return FALSE;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -