C++ 如何让Unicode显示在C++;里希欧班?

C++ 如何让Unicode显示在C++;里希欧班?,c++,winapi,unicode,sendmessage,richedit,C++,Winapi,Unicode,Sendmessage,Richedit,我一整天都在不停地尝试和研究,尝试了我发现的一切,但似乎什么都不管用 我很确定这是一个问题: void edit_append (const char *text) { CHARRANGE range = {-1, -1}; SendMessage(win_log, EM_EXSETSEL, 0, (LPARAM)&range); SendMessage(win_log, EM_REPLACESEL, FALSE, (LPARAM)text); } 如果您需要我

我一整天都在不停地尝试和研究,尝试了我发现的一切,但似乎什么都不管用

我很确定这是一个问题:

void edit_append (const char *text)
{
    CHARRANGE range = {-1, -1};
    SendMessage(win_log, EM_EXSETSEL, 0, (LPARAM)&range);
    SendMessage(win_log, EM_REPLACESEL, FALSE, (LPARAM)text);
}

如果您需要我的任何其他代码,我很乐意将其粘贴到这里,我已经为此奋斗了一整天。当我发送message()Unicode时,我得到的只是奇怪的符号,有一次我甚至得到了一堆问号。

您正在将
char*
传递给
EM\u REPLACESEL
。只有当您的RichEdit控件通过
CreateWindow(Ex)A(RichEdit\u CLASSA)
使用Ansi HWND时,这才有效。如果它通过
CreateWindow(Ex)W(RICHEDIT\u CLASSW)
使用Unicode HWND,则需要传递
wchar\u t*

void edit_append (const wchar_t *text)
{
    CHARRANGE range = {-1, -1};
    SendMessage(win_log, EM_EXSETSEL, 0, (LPARAM)&range);
    SendMessage(win_log, EM_REPLACESEL, FALSE, (LPARAM)text);
}

void edit_clear (void)
{
    CHARRANGE range = {0, -1};
    SendMessage(win_log, EM_EXSETSEL, 0, (LPARAM)&range);
    SendMessage(win_log, EM_REPLACESEL, FALSE, (LPARAM)L"");
}
如果由于任何原因无法更改
文本
的数据类型,则必须使用
MultiByteToWideChar()
(或等效)将数据转换为UTF-16,然后再将其发送给
SendMessage()


使用UTF-16编码和WCHAR(别名WCHAR_t)。这是我的窗口:
win_log=CreateWindow(RICHEDIT_类,NULL,WS_组,ES_多行,WS_可见,WS_子,WS_边框,WS_VSCROLL,ES|DISABLENOSCROLL,ES|AUTOVSCROLL,ES|SUNKEN,0,0,win|u main,NULL,hInstance,NULL);
RICHEDIT\u CLASS
都是预处理器宏,它们对
UNICODE
是否定义敏感(分别参见
winuser.h
RICHEDIT.h
中的定义)。在您的情况下,
UNICODE
可能已定义,在这种情况下,您的代码将在预处理后实际调用
CreateWindowW(RICHEDIT\u CLASSW,…)
。CreateWindow是扩展到CreateWindowA或CreateWindowW的宏。哪个是给你的?听起来像是后者。但是你需要清楚这件事。@RemyLebeau所以当我设置
CreateWindowW(RICHEDIT\u CLASSW,…)
时,我要做的就是将所有
SendMessage()
更改为
SendMessageW()
?@ASCORE:
SendMessage()
已经映射到
SendMessageW()
。您需要将
text
改为
wchar\u t*
。如果这不是一个选项,那么
edit\u append()。
void edit_append (const char *text)
{
    int len = strlen(text);
    int wlen = MultiByteToWideChar(CP_ACP, 0, text, len, NULL, 0);

    wchar_t *wtext = new wchar_t[wlen+1];
    MultiByteToWideChar(CP_ACP, 0, text, len, wtext, wlen);
    wtext[wlen] = 0;

    CHARRANGE range = {-1, -1};
    SendMessage(win_log, EM_EXSETSEL, 0, (LPARAM)&range);
    SendMessage(win_log, EM_REPLACESEL, FALSE, (LPARAM)wtext);

    delete[] wtext;
}