📄 main.cpp
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 预处理
#include <Windows.h>
#include <CommCtrl.h>
#include "Resource.h"
#include "Language.h"
#pragma comment(lib, "ComCtl32.lib")
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 宏定义
#define _RectWidth(r) ((r).right - (r).left)
#define _RectHeight(r) ((r).bottom - (r).top)
#define _NumberOf(v) (sizeof(v) / sizeof(v[0]))
#define _IsMenuChecked(h, n) ((MF_CHECKED & GetMenuState(h, n, MF_BYCOMMAND)) == MF_CHECKED)
#define LNG_Ready _Lang(0, "Ready.")
#define LNG_Test _Lang(1, "This is test text ...")
#define STR_AppName TEXT("MultiLang")
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 全局变量
HWND g_hWnd = NULL;
HMENU g_hMenu = NULL;
HWND g_hEditBox = NULL;
HWND g_hStatusBar = NULL;
HINSTANCE g_hInst = NULL;
HIMAGELIST g_hImageLists[3] = {NULL};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数声明
VOID OnCreate();
VOID OnSize(WPARAM wParam, LPARAM lParam);
VOID OnCommand(UINT uCmd);
VOID OnViewLanguage(UINT uLang);
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 程序入口
INT APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pszCmdLine, INT iCmdShow)
{
MSG msgMsg;
WNDCLASSEX wceClass;
g_hInst = hInstance;
// 初始化语言文件
CLanguage::Initialize();
// 注册主窗口类
ZeroMemory(&wceClass, sizeof(WNDCLASSEX));
wceClass.cbSize = sizeof(WNDCLASSEX);
wceClass.style = CS_VREDRAW | CS_HREDRAW;
wceClass.lpfnWndProc = MainWndProc;
wceClass.hInstance = g_hInst;
wceClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wceClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wceClass.hbrBackground = (HBRUSH) COLOR_BTNSHADOW;
wceClass.lpszMenuName = MAKEINTRESOURCE(IDR_Menu);
wceClass.lpszClassName = STR_AppName;
RegisterClassEx(&wceClass);
// 创建主窗口
CreateWindowEx(WS_EX_APPWINDOW, STR_AppName, STR_AppName, WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInst, NULL);
// 消息循环
while (GetMessage(&msgMsg, NULL, 0, 0))
{
TranslateMessage(&msgMsg);
DispatchMessage(&msgMsg);
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 回调函数
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
// 创建窗口
g_hWnd = hWnd;
g_hMenu = GetMenu(g_hWnd);
OnCreate();
break;
case WM_SIZE:
// 改变尺寸
OnSize(wParam, lParam);
break;
case WM_MENUSELECT:
// 在状态栏显示相应的菜单项提示
if ((LOWORD(wParam) > IDM_View_Default) && (LOWORD(wParam) < IDM_View_Default + 50))
{
CLanguage::GetDescription(g_hMenu, LOWORD(wParam));
}
else
{
CLanguage::TranslateString(LOWORD(wParam));
}
if (CLanguage::m_tzText[0])
{
SendMessage(g_hStatusBar, SB_SETTEXT, 0, (LPARAM) CLanguage::m_tzText);
break;
}
case WM_EXITMENULOOP:
// 在状态栏显示“就绪”
SendMessage(g_hStatusBar, SB_SETTEXT, 0, (LPARAM) LNG_Ready);
break;
case WM_COMMAND:
// 命令消息
OnCommand(LOWORD(wParam));
break;
case WM_DESTROY:
// 删除图像列表,退出
ImageList_Destroy(g_hImageLists[0]);
ImageList_Destroy(g_hImageLists[1]);
ImageList_Destroy(g_hImageLists[2]);
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 设置对话框回调函数
INT_PTR CALLBACK SettingDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
CLanguage::TranslateDialog(hWnd, MAKEINTRESOURCE(IDD_Setting));
return TRUE;
case WM_COMMAND:
if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL))
{
EndDialog(hWnd, LOWORD(wParam));
}
break;
case WM_CLOSE:
SendMessage(hWnd, WM_COMMAND, IDOK, 0);
break;
}
return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 创建窗口
VOID OnCreate()
{
#ifdef _MAKELANG
OnViewLanguage(IDM_View_Default);
#else // _MAKELANG
// 列出语言
if (CLanguage::List(GetSubMenu(GetSubMenu(g_hMenu, 3), 13)) != IDM_View_Default)
{
// 翻译菜单
CLanguage::TranslateMenu(g_hMenu, MAKEINTRESOURCE(IDR_Menu));
}
#endif // _MAKELANG
// 创建状态栏
g_hStatusBar = CreateStatusWindow(WS_CHILD | WS_VISIBLE, LNG_Ready, g_hWnd, IDC_StatusBar);
// 创建编辑框
g_hEditBox = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), NULL,
WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOHSCROLL | WS_HSCROLL | WS_VSCROLL,
0, 0, 0, 0, g_hWnd, (HMENU) IDC_EditBox, g_hInst, NULL);
SendMessage(g_hEditBox, WM_SETFONT, (WPARAM) GetStockObject(DEFAULT_GUI_FONT), TRUE);
SetWindowText(g_hEditBox, LNG_Test);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 改变尺寸
VOID OnSize(WPARAM wParam, LPARAM lParam)
{
RECT rtRect;
INT iStatusBar;
if (wParam != SIZE_MINIMIZED)
{
// 调整状态栏
SendMessage(g_hStatusBar, WM_SIZE, wParam, lParam);
if (_IsMenuChecked(g_hMenu, IDM_View_StatusBar))
{
GetWindowRect(g_hStatusBar, &rtRect);
iStatusBar = _RectHeight(rtRect);
}
else
{
iStatusBar = 0;
}
// 调整编辑框
MoveWindow(g_hEditBox, 0, 0, LOWORD(lParam), HIWORD(lParam) - iStatusBar, TRUE);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 命令消息
VOID OnCommand(UINT uCmd)
{
RECT rtRect;
BOOL bCheck;
if ((uCmd >= IDM_View_Default) && (uCmd <= IDM_View_Default + 49))
{
// 改变语言
if (((MF_CHECKED & GetMenuState(g_hMenu, uCmd, MF_BYCOMMAND)) != MF_CHECKED))
{
OnViewLanguage(uCmd);
}
return;
}
switch (uCmd)
{
case IDM_File_Exit:
// 退出
PostMessage(g_hWnd, WM_CLOSE, 0, 0);
break;
case IDM_View_Setting:
// 显示对话框
DialogBox(g_hInst, MAKEINTRESOURCE(IDD_Setting), g_hWnd, (DLGPROC) SettingDlgProc);
break;
case IDM_View_StatusBar:
// 显示或不显示工具栏
bCheck = !_IsMenuChecked(g_hMenu, uCmd);
CheckMenuItem(g_hMenu, uCmd, bCheck ? MF_CHECKED : MF_UNCHECKED);
ShowWindow(g_hStatusBar, bCheck ? SW_SHOW : SW_HIDE);
GetClientRect(g_hWnd, &rtRect);
OnSize(SIZE_RESTORED, MAKELONG(_RectWidth(rtRect), _RectHeight(rtRect)));
break;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 改变语言
VOID OnViewLanguage(UINT uLang)
{
#ifdef _MAKELANG
// 保存常规字符串
LNG_Ready; LNG_Test;
// 保存资源字符串
for (INT i = IDM_File_Open; i <= IDM_Help_About; i++)
{
CLanguage::TranslateString(i);
}
// 保存菜单
CLanguage::TranslateMenu(g_hMenu, MAKEINTRESOURCE(IDR_Menu));
// 保存对话框字符串
OnCommand(IDM_View_Setting);
#else // _MAKELANG
// 设置语言
CLanguage::Set(g_hMenu, uLang);
// 翻译菜单
CLanguage::TranslateMenu(g_hMenu, MAKEINTRESOURCE(IDR_Menu));
DrawMenuBar(g_hWnd);
// 设置主窗口上的文本
MainWndProc(g_hWnd, WM_MENUSELECT, uLang, 0);
SetWindowText(g_hEditBox, LNG_Test);
#endif // _MAKELANG
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -