📄 mmires_text.cpp
字号:
pTextInfo->szTraditionalChinese[0] + 1 );
delete pTextInfo;
m_mapText.RemoveKey(pszID);
return TRUE;
}
BOOL CMMIRes::DeleteTextEx( LPCTSTR pszID )
{
_ASSERTE( pszID != NULL );
PTEXTINFOEX pTextInfoEx = NULL;
if( !m_mapTextEx.Lookup(pszID, pTextInfoEx) )
return TRUE;
//语言的指针所占的字节数
m_Resource.ToolUsedInfo.nUsedSize -= g_theApp.m_nUsedLangNum * sizeof(char *);
CConverter conv;
int nStrSize = 0;
for(int i =1; i < g_theApp.m_nUsedLangNum; i++)
{
if((UCHAR)pTextInfoEx->szLanguage[i][0]<0x80) //ASCII
{
m_Resource.ToolUsedInfo.nUsedSize -= (strlen(pTextInfoEx->szLanguage[i]) + 1 );
}
else //Unicode
{
LPWORD lpwStrSize=(LPWORD) (pTextInfoEx->szLanguage[i]+1);
WORD wStrSize = *lpwStrSize;
nStrSize = wStrSize;
m_Resource.ToolUsedInfo.nUsedSize -= (nStrSize + 3);
}
/*
if(g_theApp.m_nArrLangCBN[i]==1)
m_Resource.ToolUsedInfo.nUsedSize -= (strlen(pTextInfoEx->szLanguage[0]) + 1 );
else
m_Resource.ToolUsedInfo.nUsedSize -= ( pTextInfoEx->szLanguage[i][0]+1 );
*/
}
delete []pTextInfoEx;
m_mapTextEx.RemoveKey(pszID);
return TRUE;
}
BOOL CMMIRes::ReplaceText( LPCTSTR pszID, CStringArray & arrContent, int bCheckLimit /* = FALSE */ )
{
_ASSERTE( pszID != NULL );
PTEXTINFO pTextInfo = NULL;
VERIFY( m_mapText.Lookup(pszID, pTextInfo) );
strcpy(pTextInfo->szEnglish, (LPCSTR)(LPCTSTR)arrContent[0]);
//SimpleChinese
LPCSTR pMulti = (LPCSTR)arrContent[1].GetBuffer(0);
int nUcs2Size = MultiByteToWideChar(CP_ACP, 0, pMulti, -1, NULL, 0);
int nDeltaSize = strlen(pMulti) + 1 + (nUcs2Size - 1) * 2 + 1;
nDeltaSize -= (strlen(pTextInfo->szEnglish) + 1 + (UCHAR)pTextInfo->szSimpleChinese[0] + 1);
if( bCheckLimit && m_Resource.ToolUsedInfo.nMaxLimitSize > 0 )
{
UINT nMaxSize = m_Resource.ToolUsedInfo.nUsedSize + nDeltaSize;
if( nMaxSize > m_Resource.ToolUsedInfo.nMaxLimitSize )
{
_stprintf(m_szErrMsg, _T("Exceed the limit size %d!"), m_Resource.ToolUsedInfo.nMaxLimitSize );
return FALSE;
}
}
m_Resource.ToolUsedInfo.nUsedSize += nDeltaSize;
LPWSTR pUcs2 = (LPWSTR)(&(pTextInfo->szSimpleChinese[1]));
MultiByteToWideChar( CP_ACP, 0, pMulti, -1, pUcs2, nUcs2Size);
arrContent[1].ReleaseBuffer();
nUcs2Size--;
if( nUcs2Size < 0 || nUcs2Size * 2 > MAX_TEXT_LEN - 1 )
{
_stprintf(m_szErrMsg, _T("Exceed the text buffer size %d!"), MAX_TEXT_LEN );
return FALSE;
}
CConverter conv;
conv.LitEdnToBigEdn( pUcs2, nUcs2Size );
if( nUcs2Size == 0 )
pTextInfo->szSimpleChinese[0] = 1;
else
pTextInfo->szSimpleChinese[0] = nUcs2Size * 2;
//TraditionalChinese
pMulti = (LPCSTR)arrContent[2].GetBuffer(0);
nUcs2Size = MultiByteToWideChar(CP_ACP, 0, pMulti, -1, NULL, 0);
nDeltaSize = strlen(pMulti) + 1 + (nUcs2Size - 1) * 2 + 1;
nDeltaSize -= (strlen(pTextInfo->szEnglish) + 1 + (UCHAR)pTextInfo->szSimpleChinese[0] + 1 + (UCHAR)pTextInfo->szTraditionalChinese[0] + 1);
if( bCheckLimit && m_Resource.ToolUsedInfo.nMaxLimitSize > 0 )
{
UINT nMaxSize = m_Resource.ToolUsedInfo.nUsedSize + nDeltaSize;
if( nMaxSize > m_Resource.ToolUsedInfo.nMaxLimitSize )
{
_stprintf(m_szErrMsg, _T("Exceed the limit size %d!"), m_Resource.ToolUsedInfo.nMaxLimitSize );
return FALSE;
}
}
m_Resource.ToolUsedInfo.nUsedSize += nDeltaSize;
pUcs2 = (LPWSTR)(&(pTextInfo->szTraditionalChinese[1]));
MultiByteToWideChar( CP_ACP, 0, pMulti, -1, pUcs2, nUcs2Size);
arrContent[2].ReleaseBuffer();
nUcs2Size--;
if( nUcs2Size < 0 || nUcs2Size * 2 > MAX_TEXT_LEN - 1 )
{
_stprintf(m_szErrMsg, _T("Exceed the text buffer size %d!"), MAX_TEXT_LEN );
return FALSE;
}
CConverter convt;
convt.LitEdnToBigEdn( pUcs2, nUcs2Size );
if( nUcs2Size == 0 )
pTextInfo->szTraditionalChinese[0] = 1;
else
pTextInfo->szTraditionalChinese[0] = nUcs2Size * 2;
return TRUE;
}
BOOL CMMIRes::ReplaceTextEx( LPCTSTR pszID, CStringArray & arrContent, int bCheckLimit /* = FALSE */ )
{
_ASSERTE( pszID != NULL );
PTEXTINFOEX pTextInfoEx = NULL;
PTEXTINFOEX pTextInfoExNew = (PTEXTINFOEX)new TEXT_INFO_T_EX;
if(pTextInfoExNew==NULL)
{
delete []pTextInfoExNew;
return FALSE;
}
VERIFY( m_mapTextEx.Lookup(pszID, pTextInfoEx) );
int nOldSize = 0;
int nNewSize = 0;
CConverter conv;
int nStrSize = 0;
for(int i=0; i < g_theApp.m_nUsedLangNum; i++)
{
//判断是否为ASCII的0扩展的Unicode码
CString str = arrContent.GetAt(i);
nStrSize = str.GetLength()*2;
char *p = (LPSTR)(LPCTSTR)str;
int nIndex=0;
for(nIndex= 0;nIndex<nStrSize;nIndex += 2)
{
if(!((UCHAR)*(p+nIndex) < 0x80 && (UCHAR)*(p+nIndex+1) == 0))
break;
}
if(nIndex>=nStrSize)//ASCII
{
if( nStrSize/2 < 0 || nStrSize/2 > MAX_TEXT_LEN)
{
_stprintf(m_szErrMsg, _T("Exceed the text buffer size %d!"), MAX_TEXT_LEN );
return FALSE;
}
char szLang[MAX_TEXT_LEN +1] = {0};
WideCharToMultiByte(CP_ACP,0,arrContent[i],-1,szLang,MAX_TEXT_LEN +1,NULL,NULL);
strcpy(pTextInfoExNew->szLanguage[i], szLang);
nNewSize += (strlen(pTextInfoExNew->szLanguage[i]) + 1);
}
else //Unicode
{
if( nStrSize < 0 || nStrSize > MAX_TEXT_LEN - 3 )
{
_stprintf(m_szErrMsg, _T("Exceed the text buffer size %d!"), MAX_TEXT_LEN );
return FALSE;
}
pTextInfoExNew->szLanguage[i][0] = (UCHAR)0x80;
LPWORD lpwStrSize=(LPWORD) (pTextInfoExNew->szLanguage[i]+1);
*lpwStrSize = (WORD)nStrSize;
LPTSTR pUcs2 = (LPTSTR)(pTextInfoExNew->szLanguage[i]+3);
memcpy(pUcs2,arrContent[i],nStrSize);
//conv.LitEdnToBigEdn( (LPWORD)(pTextInfoEx->szLanguage[i]+1), nStrSize/2+1 ); //Unicode的字节数也需要转化Big
nNewSize += (nStrSize + 3);
}
if((UCHAR)pTextInfoEx->szLanguage[i][0]<0x80) //ASCII
{
nOldSize += (strlen(pTextInfoEx->szLanguage[i]) + 1 );
}
else //Unicode
{
LPWORD lpwStrSize=(LPWORD) (pTextInfoEx->szLanguage[i]+1);
WORD wStrSize = *lpwStrSize;
nStrSize = wStrSize;
nOldSize += (nStrSize + 3);
}
/* if(g_theApp.m_nArrLangCBN[i]==1)
{
char szLang[MAX_TEXT_LEN +1] = {0};
WideCharToMultiByte(CP_ACP,0,arrContent[i],-1,szLang,MAX_TEXT_LEN +1,NULL,NULL);
strcpy(pTextInfoExNew->szLanguage[i], szLang);
nNewSize += (strlen(pTextInfoExNew->szLanguage[i]) + 1);
nOldSize += (strlen(pTextInfoEx->szLanguage[i]) + 1);
}
else
{
LPTSTR pUcs2 = (LPTSTR)(&(pTextInfoExNew->szLanguage[i][1]));
int nUcs2Size = arrContent.GetAt(i).GetLength();
memcpy(pUcs2,arrContent[i],nUcs2Size*2);
if( nUcs2Size < 0 || nUcs2Size*2 > MAX_TEXT_LEN - 1 )
{
_stprintf(m_szErrMsg, _T("Exceed the text buffer size %d!"), MAX_TEXT_LEN );
delete []pTextInfoExNew;
return FALSE;
}
CConverter conv;
conv.LitEdnToBigEdn( pUcs2, nUcs2Size );
if( nUcs2Size == 0 )
pTextInfoExNew->szLanguage[i][0] = 1;
else
pTextInfoExNew->szLanguage[i][0] = nUcs2Size * 2;
nNewSize += ((UCHAR)pTextInfoExNew->szLanguage[i][0] + 1);
nOldSize += ((UCHAR)pTextInfoEx->szLanguage[i][0] + 1);
}
*/
}
for(int j=g_theApp.m_nUsedLangNum;j<MAX_LANG_NUM;j++)
strcpy(pTextInfoExNew->szLanguage[j], "");
int nDelSize = nNewSize - nOldSize;
if( bCheckLimit && m_Resource.ToolUsedInfo.nMaxLimitSize > 0 )
{
UINT nMaxSize = m_Resource.ToolUsedInfo.nUsedSize + nDelSize;
if( nMaxSize > m_Resource.ToolUsedInfo.nMaxLimitSize )
{
_stprintf(m_szErrMsg, _T("Exceed the limit size %d!"), m_Resource.ToolUsedInfo.nMaxLimitSize );
delete []pTextInfoExNew;
return FALSE;
}
}
m_Resource.ToolUsedInfo.nUsedSize += nDelSize;
memcpy(pTextInfoEx,pTextInfoExNew,sizeof(TEXT_INFO_T_EX));
delete []pTextInfoExNew;
pTextInfoExNew =NULL;
return TRUE;
}
BOOL CMMIRes::TextIDIsExist( LPCTSTR pszID )
{
_ASSERTE( pszID != NULL );
PTEXTINFOEX pTextInfoEx = NULL;
return m_mapTextEx.Lookup(pszID, pTextInfoEx);
}
/*
int CMMIRes::CalcTextResSize(void)
{
int nCount = m_mapText.GetCount();
int nSize = sizeof(KSP_TEXT_T) * TT_MAX_NUM;
nSize += sizeof(char *) * nCount;
nSize += sizeof(uint8 *) * nCount;
CString strKey;
PTEXTINFO pTextInfo = NULL;
POSITION pos = m_mapText.GetStartPosition();
while( pos != NULL )
{
m_mapText.GetNextAssoc( pos, strKey, pTextInfo );
_ASSERTE( pTextInfo != NULL );
nSize += strlen(pTextInfo->szEnglish) + 1 + (UCHAR)pTextInfo->szSimpleChinese[0] + (UCHAR)pTextInfo->szTraditionalChinese[0];
}
return nSize;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -