📄 language.cpp
字号:
break;
}
}
}
WritePrivateProfileString(LIN_Text, ptzName, m_tzText, m_tzFileName);
return (PTSTR) ptzDefault;
#else // _MAKELANG
if ((m_tzFileName[0] == 0) ||
(GetPrivateProfileString(LIN_Text, ptzName, NULL, m_tzText, _NumberOf(m_tzText), m_tzFileName) == 0))
{
return (PTSTR) ptzDefault;
}
for (PTSTR p = m_tzText; *p; p++)
{
if (*p == '~')
{
*p = '\n';
}
else if (*p == '`')
{
*p = 0;
}
}
return m_tzText;
#endif // _MAKELANG
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 获取资源字符串
PTSTR CLanguage::TranslateString(UINT uResID)
{
TCHAR tzName[32];
wsprintf(tzName, TEXT("%u"), uResID);
#ifdef _MAKELANG
LoadString(g_hInst, uResID, m_tzText, _NumberOf(m_tzText));
if (m_tzText[0])
{
WritePrivateProfileString(LIN_String, tzName, m_tzText, m_tzFileName);
}
#else // _MAKELANG
if ((m_tzFileName[0] == 0) ||
(GetPrivateProfileString(LIN_String, tzName, NULL, m_tzText, _NumberOf(m_tzText), m_tzFileName) == 0))
{
if (LoadString(g_hInst, uResID, m_tzText, _NumberOf(m_tzText)) == 0)
{
return NULL;
}
}
#endif // _MAKELANG
return m_tzText;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 更新菜单
VOID CLanguage::TranslateMenu(HMENU hMenu, PCTSTR ptzResName)
{
TCHAR tzSection[32];
if (m_tzFileName[0])
{
// 获取节名
if (IS_INTRESOURCE(ptzResName))
{
wsprintf(tzSection, TEXT("%u"), ptzResName);
}
else
{
lstrcpy(tzSection, ptzResName);
}
// 从语言文件中更新菜单
UpdateMenuFromLanguage(hMenu, tzSection);
}
else
{
// 从资源中更新菜单
UpdateMenuFromResource(hMenu, ptzResName);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 更新对话框
VOID CLanguage::TranslateDialog(HWND hWnd, PCTSTR ptzResName)
{
TCHAR tzSection[32];
if (m_tzFileName[0])
{
// 获取节名
if (IS_INTRESOURCE(ptzResName))
{
wsprintf(tzSection, TEXT("%u"), ptzResName);
}
else
{
lstrcpy(tzSection, ptzResName);
}
// 修改对话框字符串
UpdateDialogFromLanguage(hWnd, tzSection);
#ifndef _TRANSRECUR
// 枚举并修改子窗口字符串
EnumChildWindows(hWnd, (WNDENUMPROC) UpdateDialogFromLanguage, (LPARAM) tzSection);
#endif // _TRANSRECUR
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 设置菜单字符串
BOOL CLanguage::SetMenuString(HMENU hMenu, UINT uItemID, PCTSTR ptzString, BOOL bByPosition)
{
MENUITEMINFO miiItem;
miiItem.cbSize = CDSIZEOF_STRUCT(MENUITEMINFO, cch);
#if (_WINVER >= 0x0410)
miiItem.fMask = MIIM_STRING;
#else (_WINVER >= 0x0410)
miiItem.fMask = MIIM_TYPE;
miiItem.cch = 0;
miiItem.dwTypeData = NULL;
GetMenuItemInfo(hMenu, uItemID, bByPosition, &miiItem);
#endif (_WINVER >= 0x0410)
miiItem.dwTypeData = (PTSTR) ptzString;
return SetMenuItemInfo(hMenu, uItemID, bByPosition, &miiItem);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 从语言文件中更新菜单
VOID CLanguage::UpdateMenuFromLanguage(HMENU hMenu, PCTSTR ptzSection, PCTSTR ptzPath)
{
INT i;
INT iNum;
TCHAR tzName[256];
TCHAR tzText[1024];
MENUITEMINFO miiItem;
// 初始化变量,获取菜单项数量
miiItem.cbSize = CDSIZEOF_STRUCT(MENUITEMINFO, cch);
miiItem.fMask = MIIM_SUBMENU | MIIM_ID;
iNum = GetMenuItemCount(hMenu);
for (i = 0; i < iNum; i++)
{
// 获取弹出菜单句柄和标识
GetMenuItemInfo(hMenu, i, TRUE, &miiItem);
if (miiItem.wID)
{
// 获取菜单标识文本
if (miiItem.hSubMenu)
{
/*_Assert(ptzPath);
_Assert(lstrlen(ptzPath) < _NumberOf(tzName) - 16);*/
wsprintf(tzName, TEXT("%s|%u"), ptzPath, i);
}
else
{
wsprintf(tzName, TEXT("%u"), miiItem.wID);
}
#ifdef _MAKELANG
// 生成语言文件,递归修改菜单字符串
if ((miiItem.wID <= IDM_View_Default) || (miiItem.wID >= IDM_View_Default + 50) &&
(miiItem.wID <= IDM_File_Recent) || (miiItem.wID >= IDM_File_Recent + 50))
{
GetMenuString(hMenu, i, tzText, _NumberOf(tzText), MF_BYPOSITION);
WritePrivateProfileString(ptzSection, tzName, tzText, m_tzFileName);
}
#else // _MAKELANG
// 设置菜单字符串
if (GetPrivateProfileString(ptzSection, tzName, NULL, tzText, _NumberOf(tzText), m_tzFileName))
{
SetMenuString(hMenu, i, tzText, TRUE);
}
#endif // _MAKELANG
// 递归修改菜单字符串
if (miiItem.hSubMenu)
{
UpdateMenuFromLanguage(miiItem.hSubMenu, ptzSection, tzName);
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 从资源中更新菜单
VOID CLanguage::UpdateMenuFromResource(HMENU hMenu, PCTSTR ptzResName)
{
PBYTE p;
PBYTE pbEnd;
BOOL bMenuEx;
WORD wOptions;
DWORD dwMenuID;
HRSRC hResource;
HGLOBAL hGlobal;
TCHAR tzText[1024];
// 菜单层次堆栈,用于更新弹出菜单字符串
INT i = 0; // 层次
INT iPos[32] = {0}; // 位置
BOOL bHilite[32] = {FALSE}; // 回退
HMENU hMenus[32] = {hMenu}; // 句柄
// 载入资源
hResource = FindResource(g_hInst, ptzResName, RT_MENU);
//_Assert(hResource);
hGlobal = LoadResource(g_hInst, hResource);
//_Assert(hGlobal);
// 获取资源的起始地址、终止地址和版本
p = (PBYTE) LockResource(hGlobal);
pbEnd = p + SizeofResource(g_hInst, hResource);
bMenuEx = ((PMENUITEMTEMPLATEHEADER) p)->versionNumber;
// 转到菜单项数据
p += ((PMENUITEMTEMPLATEHEADER) p)->offset + sizeof(MENUITEMTEMPLATEHEADER);
if (bMenuEx)
{
p += sizeof(DWORD);
}
// 更新菜单
while (p < pbEnd)
{
// 获取菜单项标识、参数
if (bMenuEx)
{
p += 3 * sizeof(DWORD);
dwMenuID = *((PDWORD) p);
p += sizeof(DWORD) + sizeof(WORD);
}
else
{
wOptions = *((PWORD) p);
p += sizeof(WORD);
if ((wOptions & MF_POPUP) == FALSE)
{
dwMenuID = *((PWORD) p);
p += sizeof(WORD);
}
}
// 获取菜单项文本,转到下一个菜单项
for (_WStrToStr(tzText, (PWSTR) p); *((PWSTR) p); p += sizeof(WCHAR));
p += sizeof(WCHAR);
if (bMenuEx)
{
// 根据命令标识设置菜单文本
SetMenuString(hMenu, dwMenuID, tzText);
}
else
{
// 如果是弹出菜单项
//_Assert(i < _NumberOf(iPos));
iPos[i]++;
if (wOptions & MF_POPUP)
{
// 根据位置设置菜单文本
SetMenuString(hMenus[i], iPos[i] - 1, tzText, TRUE);
// 获取下一级菜单,并把相关数据压入堆栈
bHilite[i] = wOptions & MF_HILITE;
hMenus[i + 1] = GetSubMenu(hMenus[i], iPos[i] - 1);
i++;
iPos[i] = 0;
//_Assert(hMenus[i]);
}
else
{
// 根据命令标识设置菜单文本
SetMenuString(hMenu, dwMenuID, tzText);
if (wOptions & MF_HILITE)
{
// 弹出堆栈,如果已经完成则退出
for (i--; (i >= 0) && bHilite[i]; i--);
if (i < 0)
{
break;
}
}
}
}
}
FreeResource(hGlobal);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 从语言文件中更新对话框
BOOL CALLBACK CLanguage::UpdateDialogFromLanguage(HWND hWnd, PCTSTR ptzSection)
{
TCHAR tzText[1024];
TCHAR tzName[MAX_PATH];
// 获取窗口标识字符串
wsprintf(tzName, TEXT("%u"), GetDlgCtrlID(hWnd));
// 设置窗口标题
#ifdef _MAKELANG
GetWindowText(hWnd, tzText, _NumberOf(tzText));
if (tzText[0] && ((tzText[0] < '0') || (tzText[0] > '9')))
{
WritePrivateProfileString(ptzSection, tzName, tzText, m_tzFileName);
}
#else // _MAKELANG
if (GetPrivateProfileString(ptzSection, tzName, NULL, tzText, _NumberOf(tzText), m_tzFileName))
{
SetWindowText(hWnd, tzText);
}
#endif // _MAKELANG
#ifdef _TRANSRECUR
// 枚举并修改子窗口字符串
EnumChildWindows(hWnd, (WNDENUMPROC) UpdateDialogFromLanguage, (LPARAM) ptzSection);
#endif // _TRANSRECUR
if (m_hFont)
{
SendMessage(hWnd, WM_SETFONT, (WPARAM) m_hFont, FALSE);
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -