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

📄 mmires_text.cpp

📁 Resource editor base speadrum Chinese mobile
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -