📄 multilanguage.cpp
字号:
// MultiLanguage.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "MultiLanguage.h"
#include "MultiLanguageDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMultiLanguageApp
BEGIN_MESSAGE_MAP(CMultiLanguageApp, CWinApp)
//{{AFX_MSG_MAP(CMultiLanguageApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMultiLanguageApp construction
CMultiLanguageApp::CMultiLanguageApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CMultiLanguageApp object
CMultiLanguageApp theApp;
CString g_szLanguagePath; //保存语言文件的路径
CString g_szSettingPath; //保存设置的文件路径
CString g_szCurPath; //保存当前路径
BOOL CMultiLanguageApp::InitInstance()
{
//获取当前路径
CString szCurPath("");
GetModuleFileName(NULL,szCurPath.GetBuffer(MAX_PATH),MAX_PATH);
szCurPath.ReleaseBuffer();
g_szCurPath = szCurPath.Left(szCurPath.ReverseFind('\\') + 1);
//设置文件在当前路径下
g_szSettingPath = g_szCurPath + "setting.ini";
CFileFind find;
if(!find.FindFile(g_szSettingPath)) MakeResource(IDR_SETTING,g_szSettingPath);
find.Close();
//装入语言
LoadLanguage();
CMultiLanguageDlg dlg;
m_pMainWnd = &dlg;
dlg.DoModal();
return FALSE;
}
/*********************************************************************
* 函数名称:g_LoadString
* 说明: 根据标识 szID到选定的语言文件中加载字符串
* 作者: Geng
*********************************************************************/
CString g_LoadString(CString szID)
{
CString szValue;
DWORD dwSize = 1000;
GetPrivateProfileString("String",szID,"Not found",
szValue.GetBuffer(dwSize),dwSize,g_szLanguagePath);
szValue.ReleaseBuffer();
szValue.Replace("\\n","\n"); //替换回换行符号
return szValue;
}
/*********************************************************************
* 函数名称:g_SetDialogStrings(CDialog *pDlg,UINT uDlgID)
* 说明: 当对话框运行时获取其所有可得到的字符串,并保存到语言文件中
每个控件用对话框ID和控件ID唯一标识
* 入口参数:
* CDialog *pDlg -- 对话框的指针
* UINT uDlgID -- 该对话框的ID
* 作者: Geng
*********************************************************************/
void g_SetDialogStrings(CDialog *pDlg,UINT uDlgID)
{
CString szSection = "String";
CString szKey,szText;
bool bSetText = 1; //1:从文件读,设置对话框
//0:从对话框读,保存到文件
if(bSetText) //1:从文件读,设置对话框
{
CString szDefault = "";
DWORD dwSize = 1000;
char* pData = (char*)malloc(dwSize);
//读对话框标题
szKey.Format("IDD%d_Title",uDlgID);
if(GetPrivateProfileString(szSection,szKey,szDefault,
pData,dwSize,g_szLanguagePath) != 0)
{
pDlg->SetWindowText(pData);
}
//写入各个子控件的标题文字
CWnd* pWnd = pDlg->GetWindow(GW_CHILD);
while(pWnd != NULL)
{
szKey.Format("IDD%d_%d",uDlgID,pWnd->GetDlgCtrlID());
if(GetPrivateProfileString(szSection,szKey,szDefault,
pData,dwSize,g_szLanguagePath) != 0)
{
pWnd->SetWindowText(pData);
}
pWnd = pWnd->GetWindow(GW_HWNDNEXT);
}
//释放内存
free(pData);
}
else //0:从对话框读,保存到文件
{
//写入对话框标题
szKey.Format("IDD%d_Title",uDlgID);
pDlg->GetWindowText(szText);
WritePrivateProfileString(szSection,szKey,szText,g_szLanguagePath);
//写入各个子控件的标题文字
CWnd* pWnd = pDlg->GetWindow(GW_CHILD);
while(pWnd != NULL)
{
szKey.Format("IDD%d_%d",uDlgID,pWnd->GetDlgCtrlID());
pWnd->GetWindowText(szText);
WritePrivateProfileString(szSection,szKey,szText,g_szLanguagePath);
pWnd = pWnd->GetWindow(GW_HWNDNEXT);
}
}
}
/*********************************************************************
* 函数名称:CMultiLanguageApp::LoadLanguage
* 说明: 装入或者设置语言 如果 szLangSel为空则装入语言,否则设置语言
* 作者: Geng
*********************************************************************/
void CMultiLanguageApp::LoadLanguage(CString szLangSel /*= ""*/)
{
//查找语言
CString szSection = "Setting";
CString szKey = "Language",szLang;
DWORD dwSize = 1000;
if(!szLangSel.IsEmpty()) //保存语言
{
szLang = szLangSel;
}
else //读取语言设置
{
//获取设置的语言
GetPrivateProfileString(szSection,szKey,"English",szLang.GetBuffer(dwSize),dwSize,g_szSettingPath);
szLang.ReleaseBuffer();
}
//查找是否存在
CFileFind find;
bool bRet = find.FindFile(g_szCurPath + "Language\\*.ini");
bool bFound = false;
CString szEng = "";
while(bRet)
{
bRet = find.FindNextFile();
if(find.IsDots() || find.IsDirectory()) continue;
CString szValue;
CString szFilePath = find.GetFilePath();
if(GetPrivateProfileString(szSection,szKey,"",szValue.GetBuffer(dwSize),
dwSize,szFilePath) != 0)
{
szValue.ReleaseBuffer();
if(szValue == szLang)
{
g_szLanguagePath = szFilePath;
bFound = true;
break;
}
}
}
find.Close();
//未找到设定的语言
if(!bFound)
{
int nLangID[2] = {IDR_LANG_ENG,IDR_LANG_CH};
CString szFileName[2] = {"\\Multi_eng.ini","\\Multi_ch.ini"};
CString szPath = g_szCurPath + "Language";
CreateDirectory(szPath,NULL);
for(int i = 0;i < 2;i++)
{
MakeResource(nLangID[i],szPath + szFileName[i]);
}
//默认使用英文
g_szLanguagePath = szPath + szFileName[0];
szLang = "English";
}
//保存语言设置
WritePrivateProfileString(szSection,szKey,szLang,g_szSettingPath);
}
/*********************************************************************
* 函数名称:CMultiLanguageApp::MakeResource
* 说明: 如果未找到所需的资源文件(如设置文件,语言文件等),从程序中产生
* 作者: Geng
*********************************************************************/
bool CMultiLanguageApp::MakeResource(int nID, CString szPathName)
{
HRSRC hSrc = FindResource(NULL,MAKEINTRESOURCE(nID),_T("OWNER_DATA"));
if(hSrc == NULL) return false;
HGLOBAL hGlobal = LoadResource(NULL,hSrc);
if(hGlobal == NULL) return false;
LPVOID lp = LockResource(hGlobal);
DWORD dwSize = SizeofResource(NULL,hSrc);
CFile file;
if(file.Open(szPathName,CFile::modeCreate|CFile::modeWrite))
{
file.Write(lp,dwSize);
file.Close();
}
FreeResource(hGlobal);
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -