⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 使用INI文件的读取来完成多语言版本的实现
💻 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 + -