概述:
资源的管理的公共函数实现
代码实现如下:
ResourceManagerPublic.h
#pragma once
// 如果必须将位于下面指定平台之前的平台作为目标,请修改下列定义。
// 有关不同平台对应值的最新信息,请参考 MSDN。
#ifndef WINVER // 允许使用特定于 Windows XP 或更高版本的功能。
#define WINVER 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif
#ifndef _WIN32_WINNT // 允许使用特定于 Windows XP 或更高版本的功能。
#define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif
#ifndef _WIN32_WINDOWS // 允许使用特定于 Windows 98 或更高版本的功能。
#define _WIN32_WINDOWS 0x0410 // 将此值更改为适当的值,以指定将 Windows Me 或更高版本作为目标。
#endif
#ifndef _WIN32_IE // 允许使用特定于 IE 6.0 或更高版本的功能。
#define _WIN32_IE 0x0600 // 将此值更改为相应的值,以适用于 IE 的其他版本。
#endif
// Windows 头文件:
#include <windows.h>
// C 运行时头文件
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <Shlwapi.h>
#include <string>
// TODO: 在此处引用程序需要的其他头文件
#define RESMGR_EXPORTS
#ifdef BUF_MAXLEM
#undef BUF_MAXLEN
#endif
#define BUF_MAXLEN 1024
#define STRINGFILE_EXT L".lang" // 字符串文件后缀名
#define FONTFILE_EXT L".font" // 字体文件后缀名
#define IMAGEFILE_EXT L".skin" // 图片文件后缀名
#define COLORFILE_EXT L".color" // 颜色文件后缀名
#define COMPART_SIGN ',' // 分隔符
#define LOG_I_FILE L"ResourceManager"
#define LOG_E_FILE L"ResourceManager"
#define RESMGR_I_LOG(str) LOG::I( LOG_I_FILE, str );
#define RESMGR_E_LOG(str) LOG::I( LOG_E_FILE, str );
#define RESMGR_I_LOG_1(str,p1) LOG::I( LOG_I_FILE, (str), (p1) );
#define RESMGR_E_LOG_1(str,p1) LOG::I( LOG_E_FILE, (str), (p1) );
#define RESMGR_I_LOG_2(str,p1,p2) LOG::I( LOG_I_FILE, (str), (p1), (p2) );
#define RESMGR_E_LOG_2(str,p1,p2) LOG::I( LOG_E_FILE, (str), (p1), (p2) );
#define RESMGR_I_LOG_3(str,p1,p2,p3) LOG::I( LOG_I_FILE, (str), (p1), (p2), (p3) );
#define RESMGR_E_LOG_3(str,p1,p2,p3) LOG::I( LOG_E_FILE, (str), (p1), (p2), (p3) );
#define RESMGR_I_LOG_4(str,p1,p2,p3,p4) LOG::I( LOG_I_FILE, (str), (p1), (p2), (p3), (p4) );
#define RESMGR_E_LOG_4(str,p1,p2,p3,p4) LOG::I( LOG_E_FILE, (str), (p1), (p2), (p3), (p4) );
/**
*@method GetCurrentPath
*@brief 获取当前目录
*
*@param void
*@return const std::wstring&
*/
const std::wstring& GetCurrentPath( void );
/**
*@method GetSkinPath
*@brief 获取皮肤文件所在的目录
*
*@param void
*@return const std::wstring&
*/
const std::wstring& GetSkinPath( void );
/**
*@method GetLangPath
*@brief 获取语言环境资源所在的目录
*
*@param void
*@return const std::wstring&
*/
const std::wstring& GetLangPath( void );
ResourceManagerPublic.cpp
#include "ResourceManagerPublic.h"
#pragma comment(lib, "shlwapi.lib")
/**
*@method GetCurrentPath
*@brief 获取当前目录
*
*@param void
*@return const std::wstring&
*/
const std::wstring& GetCurrentPath( void )
{
static std::wstring strPath = L"";
if ( L"" == strPath )
{
wchar_t szPath[BUF_MAXLEN] = {0};
GetModuleFileNameW( NULL, szPath, _countof(szPath) );
::PathRemoveFileSpec(szPath);
strPath = szPath;
}
return strPath;
}
/**
*@method GetSkinPath
*@brief 获取皮肤文件所在的目录
*
*@param void
*@return const std::wstring&
*/
const std::wstring& GetSkinPath( void )
{
static std::wstring strSkinPath = L"";
if ( L"" == strSkinPath )
{
strSkinPath = GetCurrentPath() + L"\\Skin";
}
return strSkinPath;
}
/**
*@method GetLangPath
*@brief 获取语言环境资源所在的目录
*
*@param void
*@return const std::wstring&
*/
const std::wstring& GetLangPath( void )
{
static std::wstring strLangPath = L"";
if ( L"" == strLangPath )
{
strLangPath = GetCurrentPath() + L"\\lang";
}
return strLangPath;
}
ResourceManager.cpp 实现如下:
#include "ResourceManagerPublic.h"
#include "ResourceManager.h"
#include "LanguageManager.h"
#include "SkinManager.h"
#include <Shlwapi.h>
#include "UiPublicDefine.h"
#pragma comment(lib, "shlwapi.lib")
#ifdef _MANAGED
#pragma managed(push, off)
#endif
#ifndef MAX_BUFSIZE
#define MAX_BUFSIZE 1024
#endif
/**
*@method: SetShellFore
*@brief: 设置Shell到界面最前方
*
*@returns: void
*/
void SetShellFore()
{
HANDLE ConnMgrMutex = NULL; //互斥信号量
// 判断进程是否已经被加载
ConnMgrMutex = CreateMutex(NULL, FALSE, L"Launcher");
if (NULL != ConnMgrMutex)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
HWND hWnd = FindWindow(NULL, L"Icool");
if (NULL != hWnd)
{
//LOG::I("ResourceManager", "Set Shell Force" );
::ShowWindow(hWnd, SW_SHOWNORMAL);
::SetForegroundWindow(hWnd);
}
}
CloseHandle(ConnMgrMutex);
}
}
BOOL APIENTRY DllMain( HMODULE /*hModule*/,
DWORD ul_reason_for_call,
LPVOID /*lpReserved*/
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
//设置Launcher最前端显示,Lauch加载方式改变!去掉窗口查找
//SetShellFore();
//初始化GDI+环境
ULONG_PTR gdiplusToken = 0;
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
CSkinManager::instance().Init();
CLanguageManager::instance().Init();
// 构筑配置文件名
wchar_t szPath[MAX_BUFSIZE];
GetModuleFileNameW( NULL, szPath, _countof(szPath) );
::PathRemoveFileSpec(szPath);
std::wstring wstrFile = szPath;
wstrFile += L"\\ResourceManager.ini";
// 读取默认的皮肤
wchar_t szDefaultSkin[MAX_BUFSIZE] = {0};
DWORD dwSkinBufLen = GetPrivateProfileStringW
(
L"ResourceManager",
L"Default_Skin",
L"default",
szDefaultSkin,
MAX_BUFSIZE,
wstrFile.c_str()
);
//RESMGR_I_LOG_1(L"Read Default Skin, the length of read is %d.", dwSkinBufLen );
std::wstring wstrLang = L"zh-cn";
enMutiLanguage enLang = GetLanguageID( );
if ( ML_CHINESE_TAIWAN == enLang )
{
// RESMGR_I_LOG(L"The Language is ML_CHINESE_TAIWAN." );
wstrLang = L"zh-tw";
}
else if ( ML_ENGLISH_USA == enLang )
{
// RESMGR_I_LOG(L"The Language is ML_ENGLISH_USA." );
wstrLang = L"en-us";
}
else
{
// RESMGR_I_LOG(L"The Language is ML_CHINESE_PRC." );
}
CSkinManager::instance().SetCurrentSkinStyle(szDefaultSkin);
CLanguageManager::instance().SetLanguage(wstrLang);
break;
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
/**
*@method GetImage
*@brief 获取图像,
*
*@param const std::wstring & wstrUri,图像的文件名,比如"Bee1.png",不区分大小写
*@param Image * & pImg,Image对象指针
*@return bool, 成功返回ture,失败返回false
*/
extern "C" bool RESMGR_API GetImage
(
const std::wstring& wstrUri,
Image *&pImg
)
{
return CSkinManager::instance().GetImage( wstrUri, pImg );
}
/**
*@method GetColor
*@brief 获取颜色值(Color)
*
*@param const std::wstring wstrUri,颜色值的标识
*@param DWORD & dwArgb,颜色值(ARGB格式)
*@return bool, 成功返回ture,失败返回false
*/
extern "C" bool RESMGR_API GetColor
(
const std::wstring& wstrUri,
DWORD& dwArgb
)
{
return CSkinManager::instance().GetColor(wstrUri,dwArgb);
}
/**
*@method GetColorARGB
*@brief 获取颜色值(Color)
*
*@param const std::wstring & wstrUri
*@param BYTE & a
*@param BYTE & r
*@param BYTE & g
*@param BYTE & b
*@return bool, 成功返回ture,失败返回false
*/
extern "C" bool RESMGR_API GetColorARGB
(
const std::wstring& wstrUri,
BYTE& a,
BYTE& r,
BYTE& g,
BYTE& b
)
{
return CSkinManager::instance().GetColor(wstrUri,a, r, g, b);
}
/**
*@method GetAllSkinStyleCount
*@brief 获取所有皮肤风格的数量
*
*@param void
*@return extern "C" UINT RESMGR_API,皮肤风格的数量
*/
extern "C" UINT RESMGR_API GetAllSkinStyleCount( void )
{
return CSkinManager::instance().GetAllSkinStyleCount();
}
/**
*@method GetAllSkinStyle
*@brief 获取所有皮肤风格
*
*@param std::vector<std::wstring>& pAllSkinStyleInfo,皮肤风格的数组,
*@return extern "C" void RESMGR_API
*/
extern "C" void RESMGR_API GetAllSkinStyle( std::vector<std::wstring>& pAllSkinStyleInfo )
{
CSkinManager::instance().GetAllSkinStyle(pAllSkinStyleInfo);
}
/**
*@method SetSkin
*@brief 设置皮肤风格
*
*@param const std::wstring & wstrSkin
*@return bool,成功返回ture,失败返回false
*/
extern "C" bool RESMGR_API SetCurrentSkinStyle( const std::wstring& wstrSkin )
{
return CSkinManager::instance().SetCurrentSkinStyle( wstrSkin );
}
/**
*@method GetSkin
*@brief 获取皮肤风格
*
*@param std::wstring & wstrSkin
*@return extern "C" void RESMGR_API
*/
extern "C" void RESMGR_API GetCurrentSkinStyle( std::wstring& wstrSkin )
{
CSkinManager::instance().GetCurrentSkinStyle( wstrSkin );
}
/**
*@method GetString
*@brief 获取字符串
*
*@param const std::wstring & wstrUri,字符串标识
*@param std::wstring & wstrStr,字符串内容
*@return bool, 成功返回ture,失败返回false
*/
extern "C" bool RESMGR_API GetString
(
const std::wstring& wstrUri,
std::wstring& wstrStr
)
{
return CLanguageManager::instance().GetString( wstrUri, wstrStr );
}
/**
*@method GetFontEx
*@brief 获取字体
*
*@param const std::wstring & wstrUri,字体的标识符
*@param std::wstring & wstrFontFamily,字体
*@param double & fSize,字体大小
*@param int& nFontStyle,字体风格,参考MSDN关于FontStyle的说明
*@return bool, 成功返回ture,失败返回false
*/
extern "C" bool RESMGR_API GetFontEx
(
const std::wstring& wstrUri,
std::wstring& wstrFontFamily,
double& fSize,
int& nFontStyle
)
{
return CLanguageManager::instance().GetFontEx( wstrUri, wstrFontFamily, fSize, nFontStyle );
}
/**
*@method SetCurrentLanguage
*@brief 设置语言环境
*
*@param const std::wstring & wstrLang
*@return bool,成功返回ture,失败返回false
*@remark 中文简体为"zh-cn",中文繁体(台湾)为"zh-tw",英语(美国)为"en-us"
*/
extern "C" bool RESMGR_API SetCurrentLanguage( const std::wstring& wstrLang )
{
return CLanguageManager::instance().SetLanguage( wstrLang );
}
/**
*@method GetCurrentLanguage
*@brief 获取语言环境
*
*@param std::wstring & wstrLang
*@return extern "C" void RESMGR_API
*/
extern "C" void RESMGR_API GetCurrentLanguage( std::wstring& wstrLang )
{
CLanguageManager::instance().GetLanguage( wstrLang );
}
/**
*@method GetAllLanguageCount
*@brief 获取共有几种语言的资源
*
*@param void
*@return extern "C" UINT RESMGR_API
*/
extern "C" UINT RESMGR_API GetAllLanguageCount( void )
{
return CLanguageManager::instance().GetAllLanguageCount();
}
/**
*@method GetAllLanguage
*@brief 获取支持的语言种类
*
*@param std::vector<std::wstring> & pAllLanguage
*@return extern "C" void RESMGR_API
*/
extern "C" void RESMGR_API GetAllLanguage( std::vector<std::wstring>& pAllLanguage )
{
CLanguageManager::instance().GetAllLanguage( pAllLanguage );
}