代码之家  ›  专栏  ›  技术社区  ›  ASCORE

如何在C++RICHEDIT_CLASS中显示Unicode?

  •  0
  • ASCORE  · 技术社区  · 10 年前

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

    我很确定这是一个问题:

    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);
    }
    

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

    1 回复  |  直到 10 年前
        1
  •  0
  •   Remy Lebeau    10 年前

    您正在通过 char* EM_REPLACESEL 。只有当RichEdit控件通过 CreateWindow(Ex)A(RICHEDIT_CLASSA) 。如果使用Unicode HWND,请通过 CreateWindow(Ex)W(RICHEDIT_CLASSW) ,你需要通过 wchar_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"");
    }
    

    如果无法更改的数据类型 text 无论出于什么原因,你都必须使用 MultiByteToWideChar() (或等效)将数据转换为UTF-16,然后将其提供给 SendMessage() :

    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;
    }