字符串 HXString
在 HiEasyX 里,字符串不是 std::string,而是 HXString。别慌,这个设计是有原因的——框架全程在 UNICODE 模式下编译,所有字符串内部都用宽字符存储,这样才能完美支持中文、日文、emoji 以及各种国际字符。
类型定义
using HXString = std::wstring; // UNICODE 模式下的真面目
如果你在代码里看到 HXString,就当作 std::wstring 来理解,完全等价,只是名字更短、更有框架辨识度。
HXStr 宏:告别手动加 L
写宽字符字符串最烦的就是每个字面量前面都要加 L,比如 L"你好"。HiEasyX 提供了一个偷懒神器:
#define HXStr(text) L##text
用法超级简单:
HX::Button(HXStr("点击我"), profile); // 展开为 L"点击我"
HX::Window(HXStr("主窗口"), profile); // 展开为 L"主窗口"
HX::Text(HXStr("Hello 世界")); // 中英文混写无压力
建议:所有传给 HiEasyX 控件的字符串字面量,都用 HXStr(...) 包裹。这是框架的惯例,能让代码风格保持一致,也避免忘记加 L 导致的编译惨案。
ToHXString:万物皆可转字符串
框架内置了一个模板函数,能把各种基础类型转成 HXString:
template<typename T>
HXString ToHXString(const T& value);
支持常见的数值类型、枚举等:
int count = 42;
float pi = 3.14f;
HXString s1 = HX::ToHXString(count); // L"42"
HXString s2 = HX::ToHXString(pi); // L"3.14"
自定义类型也可以支持 ToHXString,只要给类型重载 operator<< 到 std::wostream 即可,模板会自动 pick 到。
HXString ↔ std::string 转换
有时候你不可避免地要跟纯 ASCII 的 std::string 打交道(比如读配置文件、网络协议、第三方库)。这时候需要手动做编码转换:
// std::string 与 HXString 的转换函数暂未提供,建议手动使用 MultiByteToWideChar / WideCharToMultiByte
千万别干这种事:
std::string narrow = "中文";
HXString wrong(narrow.begin(), narrow.end()); // ❌ 乱码!
这种构造只是按字节复制,完全不管编码,中文直接变问号或乱码。
实战技巧:MessageBox、printf、日志
MessageBoxW
Windows 的 MessageBox 分 A 版和 W 版,HiEasyX 用 W 版:
HXString msg = HXStr("操作成功完成");
MessageBoxW(nullptr, msg.c_str(), HXStr("提示"), MB_OK);
格式化字符串
宽字符版的 printf 是 wprintf,格式说明符前面加 l:
int fps = 60;
wprintf(L"当前帧率: %d\n", fps);
// 或者格式化成 HXString
wchar_t buf[256];
snwprintf(buf, 256, L"FPS: %d | 对象数: %d", fps, objectCount);
HXString status(buf);
与 std::wcout 配合
std::wcout << HXStr("正在初始化...") << std::endl;
%ls 也可以用来在 snwprintf 里嵌套另一个 HXString:
HXString name = HXStr("玩家1");
wchar_t buf[256];
snwprintf(buf, 256, L"欢迎, %ls!", name.c_str());
一句话总结
| 场景 | 写法 |
|---|---|
| 字面量 | HXStr("文本") |
| 类型声明 | HXString |
| 数值转字符串 | HX::ToHXString(value) |
| UTF-8 转换 | HX::Utf8ToHXString / HX::HXStringToUtf8 |
| Windows API | 用带 W 后缀的宽字符版本 |
把心放宽:HXString 就是 std::wstring,你会用 std::string 就会用它。唯一要注意的就是字面量加 HXStr(...),以及和窄字符串转换时走 UTF-8 通道,别直接暴力拷贝。