【问题标题】:Set Unicode text on MFC form controls in Multi-Byte Char Set application在多字节字符集应用程序中的 MFC 表单控件上设置 Unicode 文本
【发布时间】:2014-11-05 11:03:26
【问题描述】:

我有Multi-Byte Char Set MFC windows 应用程序。现在我需要在 Windows 控件上显示国际单字节 ASCI 字符。我不能直接使用ASCI 字符,因为要正确显示它们,需要将Windows 语言环境设置为适当的国家/地区。我需要在所有 Windows 语言环境中显示字符。为此,我必须将 ASCI 转换为 unicode。我可以在MessageBoxW 中显示所需的国际字符,但是如何使用SetWindowText 在 Windows MFC 控件上显示它们?

为了在MessageBoxW 中显示unicode 字符串,我在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 字符?

【问题讨论】:

  • 你能说得更具体点吗?所以你想在项目目标多字节字符集时将 Unicode 文本设置到 MFC 控制框?你能把代码 sn-p 贴在你尝试的地方吗?
  • 另请注意,从 Windows XP 开始支持 Unicode。仅当您针对的是较旧的操作系统(我认为不是这种情况)时,才应使用 ASCII。
  • 是的,我想将 Unicode 文本设置到 MFC 控制框,而项目的目标是多字节字符集。我在消息正文中添加了一些代码
  • 正确的答案是将整个项目转换为 Unicode,但我想你不想听到这个。

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


【解决方案1】:

您可以尝试将您的 CDialogEx 'this' 对象转换为 HWND,然后显式调用 Win32 API 以使用 wchars 设置文本。所以你的代码看起来像这样:

BOOL MyFrm::OnInitDialog()
{
SetDlgItemTextW((HWND)(*this), IDC_EDIT_TICKET_NUMBER, gg.c_str());
}

但正如我之前提到的,从 Windows XP 开始支持 Unicode,并且使用 ASCII 确实不是一个好主意,除非你的目标是那些非常古老的操作系统。现在使用它们将导致您传递的所有 ASCII 字符串首先由 Win32 API 转换为 Unicode。因此,最好将您的项目完全切换到 UNICODE。

【讨论】:

  • 我怀疑性能差异甚至可以衡量,但这是个好建议。
  • 使用 win32 API 我得到的不是预期的字符,而是一些奇怪的字符。但我发现我什至不能在这个控件上输入区域字符——我得到了同样奇怪的字符。我以为是字体问题,但是将字体更改为 Lucida Console(记事本正在使用我可以输入国际字符的地方)并没有改变情况。
  • 那么最好为这个问题创建一个新问题。
【解决方案2】:

首先,请注意,您可以简单地用您的 Unicode 十六进制字符数据直接初始化一个std::wstring,而没有任何丑陋无用的reinterpret_cast&lt;wchar_t*&gt; 等。

而不是这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2012-11-21
    • 2023-04-04
    • 2015-08-05
    • 1970-01-01
    相关资源
    最近更新 更多