0
点赞
收藏
分享

微信扫一扫

WTL资源管理(语言管理)


概述:

CLanguageManager 主要实现语言和字体的管理,语言使用了文本形式存储。如下格式

firstpage.static.usedmem=已用空间
firstpage.static.remainmem=剩余空间
firstpage.button.refeshdevlist=刷新设备列表
firstpage.button.tipinfos=请将您的设备连到电脑
firstpage.button.tipconning=正在查找设备,请稍后

字体的的格式如下:

default_font=微软雅黑,-14,600
icool_font_gdione=微软雅黑,-12,500
icool_font_gditwo=微软雅黑,-14,500
icool_font_gdithree=微软雅黑,-16,500
icool_font_gdifour=微软雅黑,-20,500
icool_font_gdifive=微软雅黑,-10,500
icool_font_gdiplusone=微软雅黑,12,0
icool_font_gdiplustwo=微软雅黑,14,0
icool_font_gdiplusthree=微软雅黑,16,0
icool_font_gdiplusfour=微软雅黑,20,0
icool_font_gdiplusfive=微软雅黑,10,0
icool_font_gdiplussix=微软雅黑,8,0
icool_font_gdiplusseven=微软雅黑,13,0

代码实现如下:

LanguageManager.h 的实现

#ifndef     STRINGMANAGER__H
#define STRINGMANAGER__H

#include <string>
#include <map>
#include <set>
#include <vector>
#include "pch.h"
#include <xutility>

#define FONTFAMILY_MAXLEN 64

typedef struct
{
WCHAR szFontFamily[FONTFAMILY_MAXLEN];
double fSize;
int nStyle;
} rmFont;

class CLanguageManager
{
private:

/**
*@method CStringMgr
*@brief CStringMgr类的够着函数
*
*@param void
*@return
*/
CLanguageManager(void);

/**
*@method ~CStringMgr
*@brief CStringMgr类的析构函数
*
*@param void
*@return
*/
~CLanguageManager(void);


CLanguageManager& operator=( CLanguageManager& );

CLanguageManager( const CLanguageManager& );

public:

/**
*@brief 返回字符串管理类实例
*@return CLanguageManager&
*@retval 字符串管理类实例
*/
static CLanguageManager& instance( void )
{
static CLanguageManager strMgr;
return strMgr;
}

/**
*@method LoadStringFile
*@brief 加载字符串文件
*
*@param const std::wstring & wstrStringFile,字符串文件名
*@return void
*/
void LoadStringFile( const std::wstring& wstrStringFile );

/**
*@method LoadFontFile
*@brief 加载字体资源文件
*
*@param const std::wstring & wstrStringFile
*@return void
*/
void LoadFontFile( const std::wstring& wstrStringFile );

/**
*@method Init
*@brief 初始化,获取共有多少种语言环境的字符串
*
*@param void
*@return void
*/
void Init( void );

/**
*@method Unload
*@brief 卸载字符串文件
*
*@param void
*@return void
*/
void Unload( void );

/**
*@method GetString
*@brief 获取字符串
*
*@param const std::wstring & wstrUri,字符串标示
*@param std::wstring & wstrStr,字符串
*@return void
*/
bool GetString( const std::wstring& wstrUri, std::wstring& wstrStr );

/**
*@method GetFontEx
*@brief 获取字体
*
*@param const std::wstring & wstrUri,字体的标识符
*@param std::wstring & wstrFontFamily,字体
*@param double & fSize,字体大小
*@param int& nFontStyle,字体风格,参考MSDN关于FontStyle的说明
*@return extern "C" void RESMGR_API
*/
bool GetFontEx
(
const std::wstring& wstrUri,
std::wstring& wstrFontFamily,
double& fSize,
int& nFontStyle
);

/**
*@method String2Font
*@brief 将字符串转换为字体,格式为“字体,字号,风格”
*
*@param std::wstring str
*@param rmFont & ft
*@return void
*/
bool String2Font( const std::wstring& str, rmFont& ft );

/**
*@method SetLanguage
*@brief 设置语言环境,
*
*@param const std::wstring & wstrLang,语言环境
*@return void
*/
bool SetLanguage( const std::wstring& wstrLang );

/**
*@method GetLanguage
*@brief 获取语言环境
*
*@param std::wstring & wstrLang,语言环境
*@return void
*/
void GetLanguage( std::wstring& wstrLang );

/**
*@method GetAllLanguageCount
*@brief 获取共有几种语言的资源
*
*@param void
*@return extern "C" UINT RESMGR_API
*/
UINT GetAllLanguageCount( void );

/**
*@method GetAllLanguage
*@brief 获取支持的语言种类
*
*@param std::vector<std::wstring> & pAllLanguage
*@return extern "C" void RESMGR_API
*/
void GetAllLanguage( std::vector<std::wstring>& pAllLanguage );



private:

std::wstring m_strLanguage; // 语言环境

std::map<std::wstring, std::wstring> m_mapStr; // 字符串管理矩阵
typedef std::map<std::wstring, std::wstring>::iterator StrMgrIter;

std::map<std::wstring, rmFont> m_mapFont; // 字体管理矩阵
typedef std::map<std::wstring, rmFont>::iterator FontMgrIter;

std::set<std::wstring> m_setLang;
typedef std::set<std::wstring>::iterator LangIter;

};

#endif

LanguageManager.cpp

#define _CRT_SECURE_NO_WARNINGS

#include "ResourceManagerPublic.h"
#include "ResourceManager.h"
#include "LanguageManager.h"
#include <fstream>
#include <assert.h>
#include <algorithm>
#include <Shlwapi.h>
#include <iostream>
#include <Windows.h>
#include "UiPublicDefine.h"



#pragma comment(lib, "shlwapi.lib")

/**
*@method CStringMgr
*@brief CStringMgr类的够着函数
*
*@param void
*@return
*/
CLanguageManager::CLanguageManager(void)
{
}


/**
*@method ~CStringMgr
*@brief CStringMgr类的析构函数
*
*@param void
*@return
*/
CLanguageManager::~CLanguageManager(void)
{
}


/**
*@method LoadStringFile
*@brief 加载字符串文件
*
*@param const std::wstring & wstrStringFile,字符串文件名
*@return void
*/
void CLanguageManager::LoadStringFile( const std::wstring& wstrStringFile )
{
// 构筑字符串文件名
std::wstring wstrFileName = GetLangPath()+L"\\"+wstrStringFile;

FILE* fp;
fp = _wfopen(wstrFileName.c_str(),L"r, ccs=UTF-8");
if ( NULL == fp )
{
//RESMGR_E_LOG(L"Open string file failed!!!" );
return;
}

std::wifstream ifs(fp);

std::wstring strLine;
while( std::getline(ifs,strLine) )
{
std::wstring wStr = strLine;
size_t nEqulePos = wStr.find( '=' );
if ( std::wstring::npos != nEqulePos )
{
std::wstring wstrId = wStr.substr( 0, nEqulePos );
std::wstring wstrStr = wStr.substr( nEqulePos+1 );
if ( 13 == wstrStr[wstrStr.length()-1] ) // 去掉末尾的回车符
{
wstrStr.erase( wstrStr.length()-1 );
}
m_mapStr[wstrId] = wstrStr;
}
else
{
//读取的字符串错误
//RESMGR_E_LOG(L"Read string from string file Failed!!!" );
}
}

ifs.close();
fclose(fp);
fp = NULL;
}

/**
*@method LoadFontFile
*@brief 加载字体资源文件
*
*@param const std::wstring & wstrStringFile
*@return void
*/
void CLanguageManager::LoadFontFile( const std::wstring& wstrStringFile )
{
if( 0 == wstrStringFile.length() )
{
//RESMGR_E_LOG(L"Function LoadFontFile Parame wstrStringFile is empty!!!" );
return;
}

// 构筑字体文件名
std::wstring wstrFontFileName = GetLangPath()+L"\\"+wstrStringFile;

FILE* fp;
fp = _wfopen( wstrFontFileName.c_str(), L"r, ccs=UTF-8" );
if ( NULL == fp )
{
//RESMGR_E_LOG(L"Open font file failed!!!" );
return;
}

std::wifstream ifs(fp);
std::wstring strLine;
while( std::getline(ifs,strLine) )
{
std::wstring wFont = strLine;
size_t nEqulePos = wFont.find( '=' );
if ( std::wstring::npos != nEqulePos )
{
std::wstring wstrId = wFont.substr( 0, nEqulePos );
std::wstring wstrFont = wFont.substr
(
nEqulePos+1,
wFont.length()
);
rmFont ft;
memset(&ft, 0, sizeof(ft));
if( String2Font( wstrFont, ft ) )
{
m_mapFont[wstrId] = ft;
}
}
else
{
//读取的字符串错误
// RESMGR_E_LOG(L"Read string from font file Failed!!!" );
}

}

ifs.close();
fclose(fp);
fp = NULL;
}


/**
*@method GetFontEx
*@brief 获取字体
*
*@param const std::wstring & wstrUri,字体的标识符
*@param std::wstring & wstrFontFamily,字体
*@param double & fSize,字体大小
*@param int& nFontStyle,字体风格,参考MSDN关于FontStyle的说明
*@return extern "C" void RESMGR_API
*/
bool CLanguageManager::GetFontEx
(
const std::wstring& wstrUri,
std::wstring& wstrFontFamily,
double& fSize,
int& nFontStyle
)
{
if( 0 == wstrUri.length() )
{
// RESMGR_E_LOG(L"Function GetFontEx Parame wstrUri is empty!!!" );
return false;
}

FontMgrIter iter = m_mapFont.find( wstrUri );
if ( m_mapFont.end() != iter )
{
rmFont ft = m_mapFont[wstrUri];
wstrFontFamily = ft.szFontFamily;
fSize = ft.fSize;
nFontStyle = ft.nStyle;
return true;
}
else
{
// 获取的字体不存在
//RESMGR_E_LOG(L"The Font Getted isn't existed!!!" );
return false;
}
}

/**
*@method String2Font
*@brief 将字符串转换为字体,格式为“字体,字号,风格”
*
*@param std::wstring str
*@param rmFont & ft
*@return void
*/
bool CLanguageManager::String2Font( const std::wstring& str, rmFont& ft )
{
if( 0 == str.length() )
{
//RESMGR_E_LOG(L"Function String2Font Parame str is empty!!!" );
return false;
}

size_t nPos = 0;
std::wstring strItem;
std::wstring strTemp = str;

// 转换字体名称
nPos = strTemp.find(COMPART_SIGN);
if ( std::wstring::npos != nPos )
{
strItem = strTemp.substr( 0, nPos );
wcscpy_s( ft.szFontFamily, FONTFAMILY_MAXLEN, strItem.c_str() );
strTemp = strTemp.substr( nPos+1, strTemp.length() );
}
else
{
// 字体格式不正确
// RESMGR_E_LOG(L"The font's format is error!!!" );
return false;
}

// 转换字体大小fSize
nPos = strTemp.find(COMPART_SIGN);
if ( std::wstring::npos != nPos )
{
strItem = strTemp.substr( 0, nPos );
ft.fSize = _wtof( strItem.c_str() );
strTemp = strTemp.substr( nPos+1, strTemp.length() );
}
else
{
// 字体格式不正确
//RESMGR_E_LOG(L"The font's format is error!!!" );
return false;
}

// 转换字体风格nStyle
ft.nStyle = _wtol( strTemp.c_str() );

return true;
}

/**
*@method Unload
*@brief 卸载字符串文件
*
*@param void
*@return void
*/
void CLanguageManager::Unload( void )
{
m_mapStr.clear( );
m_mapFont.clear( );
}

/**
*@method GetString
*@brief 获取字符串
*
*@param const std::wstring & wstrUri,字符串标示
*@param std::wstring & wstrStr,字符串
*@return void
*/
bool CLanguageManager::GetString( const std::wstring& wstrUri, std::wstring& wstrStr )
{
if( 0 == wstrUri.length() )
{
//RESMGR_E_LOG(L"Function GetString Parame wstrUri is empty!!!" );
return false;
}

StrMgrIter iter = m_mapStr.find( wstrUri );
if ( m_mapStr.end() != iter )
{
wstrStr = m_mapStr[wstrUri];
return true;
}
else
{
// 获取的字体不存在
//RESMGR_E_LOG(L"The string Getted isn't existed!!!" );
return false;
}

}


/**
*@method SetLanguage
*@brief 设置语言环境,
*
*@param const std::wstring & wstrLang,语言环境
*@return void
*/
bool CLanguageManager::SetLanguage( const std::wstring& wstrLang )
{
if( 0 == wstrLang.length() )
{
//RESMGR_E_LOG(L"Function SetLanguage Parame wstrLang is empty!!!" );
return false;
}

// 判断是否和当前的语言环境一致
if ( m_strLanguage == wstrLang )
{
// RESMGR_I_LOG(L"The Language be set is the current language!!!" );
return true;
}

std::wstring strTemp = wstrLang;
STRING_MAKELOWER(strTemp)

LangIter iter = m_setLang.find(strTemp);
if ( m_setLang.end() != iter )
{
// 卸载旧的语言环境下的字符串
Unload( );

m_strLanguage = strTemp;

// 加载新的字符串资源文件
std::wstring wstrNewStrFile = strTemp + STRINGFILE_EXT;
LoadStringFile( wstrNewStrFile );


// 加载新的字体定义
std::wstring wstrNewFontFile = strTemp + FONTFILE_EXT;
LoadFontFile( wstrNewFontFile );

return true;
}
else
{
// 设置的皮肤文件不存在
// RESMGR_E_LOG(L"The Language be set isn't existed!!!" );
return false;
}
}

/**
*@method GetLanguage
*@brief 获取语言环境
*
*@param std::wstring & wstrLang,语言环境
*@return void
*/
void CLanguageManager::GetLanguage( std::wstring& wstrLang )
{
wstrLang = m_strLanguage;
}

/**
*@method Init
*@brief 初始化,获取共有多少种语言环境的字符串
*
*@param void
*@return void
*/
void CLanguageManager::Init( void )
{
// 取得语言环境字符串文件搜索路径
std::wstring strLangSearchPath = GetLangPath() + L"\\*" + STRINGFILE_EXT;

HANDLE hFind = NULL;
WIN32_FIND_DATA FindFileData;
memset( &FindFileData, 0, sizeof(FindFileData) );

hFind = FindFirstFileW( strLangSearchPath.c_str(), &FindFileData );
if (INVALID_HANDLE_VALUE == hFind)
{
// RESMGR_E_LOG(L"The language file isn't Existed!!!" );
return;
}

// 遍历Skin目录,查询有多少个语言字符串文件
do
{
std::wstring wstrFileName = FindFileData.cFileName;
size_t nPos = wstrFileName.find(STRINGFILE_EXT);
if ( (nPos != std::wstring::npos) && ((nPos +wcslen(STRINGFILE_EXT))==wstrFileName.length()) )
{
wstrFileName = wstrFileName.substr(0, nPos);
STRING_MAKELOWER(wstrFileName);
m_setLang.insert(wstrFileName);
}
} while (FindNextFile(hFind, &FindFileData));

FindClose( hFind );
hFind = NULL;
}

/**
*@method GetAllLanguageCount
*@brief 获取共有几种语言的资源
*
*@param void
*@return extern "C" UINT RESMGR_API
*/
UINT CLanguageManager::GetAllLanguageCount( void )
{
return (UINT)m_setLang.size();
}

/**
*@method GetAllLanguage
*@brief 获取支持的语言种类
*
*@param std::vector<std::wstring> & pAllLanguage
*@return extern "C" void RESMGR_API
*/
void CLanguageManager::GetAllLanguage( std::vector<std::wstring>& pAllLanguage )
{
LangIter iter = m_setLang.begin();
UINT uSkinCount = 0;
for ( ; iter != m_setLang.end(); ++iter )
{
pAllLanguage.push_back((*iter));
}

}


举报

相关推荐

0 条评论