📄 mmires_text.cpp
字号:
// MMIRes_Text.cpp: implementation of the CMMIRes class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "resourceeditor.h"
#include "MMIRes.h"
#include "Converter.h"
BOOL CMMIRes::AddText( LPCTSTR pszID, CStringArray & arrContent )
{
_ASSERTE( pszID != NULL && !TextIDIsExist(pszID) );
/*
PTEXTINFO pTextInfo = new TEXT_INFO_T;
if( pTextInfo == NULL )
return FALSE;
memset( pTextInfo, 0, sizeof(TEXT_INFO_T));
strcpy(pTextInfo->szEnglish, (LPCSTR)(LPCTSTR)arrContent[0]);
// SimpleChinese
LPCSTR pMulti = arrContent[1].GetBuffer(0);
int nUcs2Size = MultiByteToWideChar(CP_ACP, 0, pMulti, -1, NULL, 0);
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 = arrContent[2].GetBuffer(0);
nUcs2Size = MultiByteToWideChar(CP_ACP, 0, pMulti, -1, NULL, 0);
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;
int nSize = 2 * sizeof(char *) + strlen(pTextInfo->szEnglish) + 1 +
(UCHAR)pTextInfo->szSimpleChinese[0] + 1+
(UCHAR)pTextInfo->szTraditionalChinese[0] + 1;
m_Resource.ToolUsedInfo.nUsedSize += nSize;
m_mapText.SetAt( pszID, pTextInfo );*/
return TRUE;
}
/*
* ASCII: char char char
* Unicode16: 1Byte(0x80,以后可扩展为0x81,0x82),2Bytes(Unicode码所占字节数,不包含结尾0x00 0x00),unicode16 unicode16
*/
BOOL CMMIRes::AddTextEx( LPCTSTR pszID, CStringArray & arrContent )
{
_ASSERTE( pszID != NULL && !TextIDIsExist(pszID) );
PTEXTINFOEX pTextInfoEx = new TEXT_INFO_T_EX;
if( pTextInfoEx == NULL )
return FALSE;
memset( pTextInfoEx, 0, sizeof(TEXT_INFO_T_EX));
//语言的指针所占的字节数
int nSize=g_theApp.m_nUsedLangNum * sizeof(char *);
CConverter conv;
int nStrSize = 0;
int nMaxBuf = (MAX_TEXT_LEN + 8)/2;
_TCHAR *psz = new _TCHAR[nMaxBuf];
memset(psz,0,sizeof(_TCHAR)*nMaxBuf);
for(int i=0; i<arrContent.GetSize();i++)
{
memset(psz,0,sizeof(TCHAR)*nMaxBuf);
//判断是否为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(pTextInfoEx->szLanguage[i], szLang);
nSize += (strlen(pTextInfoEx->szLanguage[i]) + 1);
}
else //Unicode
{
CString str = arrContent[i];
if(1 == g_theApp.m_nPrecomposed) //紧缩格式
{
nStrSize = FoldString(MAP_PRECOMPOSED,str,-1,NULL,0);
FoldString(MAP_PRECOMPOSED,str,-1,psz,nStrSize);
nStrSize = (nStrSize - 1)*2; //字节数,没有结尾字符
}
else if(2 == g_theApp.m_nPrecomposed) //非紧缩格式
{
nStrSize = FoldString(MAP_COMPOSITE, str, -1, NULL, 0);
FoldString(MAP_COMPOSITE, str, -1, psz, nStrSize);
nStrSize = (nStrSize - 1)*2; //字节数,没有结尾字符
}
if( nStrSize < 0 || nStrSize > MAX_TEXT_LEN - 3 )
{
_stprintf(m_szErrMsg, _T("Exceed the text buffer size %d!"), MAX_TEXT_LEN );
if(psz != NULL)
delete [] psz;
return FALSE;
}
pTextInfoEx->szLanguage[i][0] = (UCHAR)0x80;
LPWORD lpwStrSize=(LPWORD) (pTextInfoEx->szLanguage[i]+1);
*lpwStrSize = (WORD)nStrSize;
LPTSTR pUcs2 = (LPTSTR)(pTextInfoEx->szLanguage[i]+3);
if(g_theApp.m_nPrecomposed != 0)
memcpy(pUcs2,psz,nStrSize);
else
memcpy(pUcs2,(LPCTSTR)str,nStrSize);
nSize += (nStrSize + 3);
}
}
if(psz != NULL)
delete [] psz;
m_Resource.ToolUsedInfo.nUsedSize += nSize;
m_mapTextEx.SetAt( pszID, pTextInfoEx );
return TRUE;
}
BOOL CMMIRes::GetTextOne( LPCTSTR pszID, CStringArray & arrContent )
{
arrContent.RemoveAll();
PTEXTINFOONE pTextInfoOne = NULL;
if( !m_mapTextOne.Lookup(pszID, pTextInfoOne) )
return FALSE;
arrContent.Add( pTextInfoOne->szEnglish );
//SimpleChinese
char szWide[ MAX_TEXT_LEN + 1 ] = { 0 };
int nWideNum = (UCHAR)pTextInfoOne->szSimpleChinese[0];
memcpy(szWide, pTextInfoOne->szSimpleChinese + 1, nWideNum);
nWideNum /= 2;
CConverter conv;
conv.BigEdnToLitEdn((LPWORD)szWide, nWideNum );
char szMulti[ MAX_TEXT_LEN + 1 ] = { 0 };
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)szWide, nWideNum, szMulti, MAX_TEXT_LEN, NULL, NULL);
arrContent.Add(szMulti);
return TRUE;
}
BOOL CMMIRes::GetText( LPCTSTR pszID, CStringArray & arrContent )
{
arrContent.RemoveAll();
PTEXTINFO pTextInfo = NULL;
if( !m_mapText.Lookup(pszID, pTextInfo) )
return FALSE;
arrContent.Add( pTextInfo->szEnglish );
//SimpleChinese
char szWide[ MAX_TEXT_LEN + 1 ] = { 0 };
int nWideNum = (UCHAR)pTextInfo->szSimpleChinese[0];
memcpy(szWide, pTextInfo->szSimpleChinese + 1, nWideNum);
nWideNum /= 2;
CConverter conv;
conv.BigEdnToLitEdn((LPWORD)szWide, nWideNum );
char szMulti[ MAX_TEXT_LEN + 1 ] = { 0 };
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)szWide, nWideNum, szMulti, MAX_TEXT_LEN, NULL, NULL);
arrContent.Add(szMulti);
//TraditionalChinese
char sztWide[ MAX_TEXT_LEN + 1 ] = { 0 };
int nWideNumt = (UCHAR)pTextInfo->szTraditionalChinese[0];
memcpy(sztWide, pTextInfo->szTraditionalChinese + 1, nWideNumt);
nWideNumt /= 2;
CConverter convt;
convt.BigEdnToLitEdn((LPWORD)sztWide, nWideNumt );
char sztMulti[ MAX_TEXT_LEN + 1 ] = { 0 };
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)sztWide, nWideNumt, sztMulti, MAX_TEXT_LEN, NULL, NULL);
arrContent.Add(sztMulti);
return TRUE;
}
BOOL CMMIRes::GetTextEx( LPCTSTR pszID, CStringArray & arrContent )
{
arrContent.RemoveAll();
PTEXTINFOEX pTextInfoEx = NULL;
if( !m_mapTextEx.Lookup(pszID, pTextInfoEx) )
return FALSE;
CConverter conv;
int nStrSize = 0;
for(int i = 0; i < g_theApp.m_nUsedLangNum; i++)
{
if((UCHAR)pTextInfoEx->szLanguage[i][0]<0x80) //ASCII
{
_TCHAR szWide[ MAX_TEXT_LEN + 1] = { 0 };
MultiByteToWideChar(CP_ACP,0,pTextInfoEx->szLanguage[i],-1,szWide,MAX_TEXT_LEN+1);
arrContent.Add( szWide );
}
else //Unicode
{
_TCHAR szWide[ MAX_TEXT_LEN/2 + 1] = { 0 };
LPWORD lpwStrSize=(LPWORD) (pTextInfoEx->szLanguage[i]+1);
WORD wStrSize = *lpwStrSize;
nStrSize = wStrSize;
memcpy(szWide, pTextInfoEx->szLanguage[i] +3 , nStrSize);
nStrSize /= 2;
//conv.BigEdnToLitEdn((LPWORD)szWide, nStrSize );
arrContent.Add(szWide);
}
/*
if(g_theApp.m_nArrLangCBN[i]==1)
{
_TCHAR szWide[ MAX_TEXT_LEN + 1] = { 0 };
MultiByteToWideChar(CP_ACP,0,pTextInfoEx->szLanguage[i],-1,szWide,MAX_TEXT_LEN+1);
arrContent.Add( szWide );
}
else
{
_TCHAR szWide[ MAX_TEXT_LEN/2 + 1] = { 0 };
int nWideNum = (UCHAR)pTextInfoEx->szLanguage[i][0];
memcpy(szWide, pTextInfoEx->szLanguage[i] +1 , nWideNum);
nWideNum /= 2;
CConverter conv;
conv.BigEdnToLitEdn((LPWORD)szWide, nWideNum );
arrContent.Add(szWide); //alread unicode;
}
*/
}
return TRUE;
}
BOOL CMMIRes::DeleteText( LPCTSTR pszID )
{
_ASSERTE( pszID != NULL );
PTEXTINFO pTextInfo = NULL;
if( !m_mapText.Lookup(pszID, pTextInfo) )
return TRUE;
m_Resource.ToolUsedInfo.nUsedSize -= 2 * sizeof(char *);
m_Resource.ToolUsedInfo.nUsedSize -= ( strlen(pTextInfo->szEnglish) + 1 +
pTextInfo->szSimpleChinese[0] + 1 +
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -