在多字节字符集应用程序中的MFC表单控件上设置Unicode文本

时间:2014-09-11 13:12:47

标签: c++ visual-c++ unicode mfc

我有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字符?

2 个答案:

答案 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过去的编程模型;当你想写“国际”代码时,它们会带来很多问题。