我有Multi-Byte Char Set
MFC
个Windows应用程序。现在我需要在Windows控件上显示国际单字节ASCI字符。我无法直接使用ASCI
个字符,因为要正确显示它们,需要将Windows区域设置为适当的国家/地区。我需要在所有Windows语言环境中显示字符。为此,我必须将ASCI转换为unicode。我可以在MessageBoxW
中显示所需的国际字符,但是如何使用SetWindowText
在Windows MFC控件上显示它们?
要在unicode
中显示MessageBoxW
字符串,请在wstring
WORD g [] = {0x105,0x106,0x107,0x108,0x109,0x110,0x111,0x112,0x113,0x114,0x115,0x116,0x117,0x118,0x119,0x120};
wstring gg (reinterpret_cast<wchar_t*>(g),15);
MessageBoxW(NULL, gg.c_str() , gg.c_str() , MB_ICONEXCLAMATION | MB_OK);
设置MFC表单控件文本:
class MyFrm: public CDialogEx
{
virtual BOOL OnInitDialog();
}
...
BOOL MyFrm::OnInitDialog()
{
GetDlgItem(IDC_EDIT_TICKET_NUMBER)->SetWindowText( ???);
}
是否有可能以某种方式将wstring gg
转换为CString并在窗口控件上显示unicode字符?
答案 0 :(得分:2)
您可以尝试投放CDialogEx&#39;这个&#39;对象为HWND,然后使用wchars显式调用Win32 API来设置文本。所以你的代码看起来像这样:
BOOL MyFrm::OnInitDialog()
{
SetDlgItemTextW((HWND)(*this), IDC_EDIT_TICKET_NUMBER, gg.c_str());
}
但是正如我之前提到的,从Windows XP开始支持Unicode并且使用ASCII确实不是一个好主意,除非你在它之前定位那些非常老的操作系统。现在使用它们将导致您传递的所有ASCII字符串首先由Win32 API转换为Unicode。因此,最好将项目完全切换到UNICODE。
答案 1 :(得分:0)
首先,请注意您可以直接使用Unicode十六进制字符数据直接初始化std::wstring
,而不会出现任何丑陋无用的reinterpret_cast<wchar_t*>
等。
而不是:
WORD g [] = {0x105,0x106,0x107,0x108,...,0x120}; wstring gg (reinterpret_cast<wchar_t*>(g),15);
考虑一下:
wstring text = L"\x0105\x0106\x0108...\0x0120";
后者对我来说似乎更清洁。
其次,如果要将实例传递给std::wstring
到需要const wchar_t*
输入字符串指针的MFC方法,请考虑使用 wstring::c_str()
方法
此外,我可以给你的最佳建议是将你的应用移植到 Unicode 。
ASCII / MBCS应被视为MFC过去的编程模型;当你想写“国际”代码时,它们会带来很多问题。