使用换肤及多语言的项目需要
#include "Language.h"
#include "Skin.h"
并将Language.cpp、Skin.cpp、XMLParse.cpp、XMLConfig.cpp文件加入到工程中,以Demo工程为例介绍一下使用说明:
CLanguageDemoApp::InitInstance()函数中加入以下代码
::CoInitialize(0); // 初始化COM
CLanguage::Init(_T("res/Languages")); // 初始化多语言
CSkin::Init(_T("res/Skins")); // 初始化皮肤
CLanguage::Init会查找程序目录下的"res/Languages"子目录里面的所有"*.xml"语言文件,要使用更多语言文字,请直接更改语言文件。
所有的界面类使用ISkinNotify与ILanguageNotify来派生,例如:
class CAboutDlg : public CDialog, public ILanguageNotify, public ISkinNotify
{
};
然后实现如下两个方法(接口里面定义的虚函数):
void LanguageChanged();
void SkinChanged();
void CAboutDlg::LanguageChanged()
{
SetWindowText(ML(L"About"));
::SetWindowText(::GetDlgItem(m_hWnd, IDOK), ML(L"OK"));
::SetWindowText(::GetDlgItem(m_hWnd, IDC_STATIC_COPYRIGHT), ML(L"Copyright"));
::SetWindowText(::GetDlgItem(m_hWnd, IDC_STATIC_INFO), ML(L"AppInfo"));
Invalidate();
}
void CAboutDlg::SkinChanged()
{
m_dibBackground.Load(SKIN_IMAGE(L"back2.bmp"));
Invalidate();
}
void CSkinMultiLanguageDlg::SkinChanged()
{
m_dibBackground.Load(SKIN_IMAGE(L"main-background.bmp"));
m_colorText = SkinGetColor(L"LoginUIText"); // 获取登录界面的文字颜色信息
FloatRect loginRect = SkinGetFloatRect(L"LoginButton"); //获取Login按钮的位置信息
FloatRect settingRect = SkinGetFloatRect(L"SettingButton");
::SetWindowPos(::GetDlgItem(m_hWnd, IDOK), 0, (int)loginRect.origin.x, (int)loginRect.origin.y, (int)loginRect.size.width, (int)loginRect.size.height, SWP_NOZORDER);
::SetWindowPos(::GetDlgItem(m_hWnd, IDSETTINGS), 0, (int)settingRect.origin.x, (int)settingRect.origin.y, (int)settingRect.size.width, (int)settingRect.size.height, SWP_NOZORDER);
Invalidate();
}
ML 为获取字符串的宏定义,SKIN_IMAGE为在图片文件名前面添加当前皮肤的相对路径的宏定义。
例如:SKIN_IMAGE(L"Player/pause.png");可能返回:L"res/Skins/Purple/Player/pause.png" 或 L"res/Skins/Classic/Player/pause.png",由当前使用的皮肤类别而定。
ML(L"OK")) 从当前语言资源文件里面获取界面名称为"OK"的字符串,当选择英文语言时,其返回“OK”,当选择中文语言时,其返回"确定"。
SkinGetFloatRect从皮肤资源获取指定Key的位置信息;
SkinGetColor从皮肤资源获取指定Key的颜色信息;
程序退出时需要调用
CSkin::Close(); //释放皮肤资源
CLanguage::Close(); // 释放多语言资源
::CoUninitialize();
至此,整个换肤及多语言的实现流程已经完成。程序中使用了注册表来记住程序退出时使用的语言类型以及皮肤资源名称,下次启动可以使用上次选择的语言类型以及皮肤。
如果对换肤及多语言内部实现细节感兴趣,可以直接查看CLanguage类源码和CSkin类源码。
http://www.nhvideo.net/codes/Skin-Multi-Language.rar内附源码以及一编译好的EXE文件,运行点设置,选择语言选择组合框即可看到多语言动态切换效果。
切换语言以及皮肤后的效果如下: