轻量级换肤及多语言支持解决方案

使用换肤及多语言的项目需要

#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文件,运行点设置,选择语言选择组合框即可看到多语言动态切换效果。


切换语言以及皮肤后的效果如下:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值