2015-03-08 1 views
0

Я пробовал и исследовал весь день без остановок и пробовал все, что нашел, но ничего не работает для меня.Как получить Unicode для отображения на C++ RICHEDIT_CLASS?

Я уверен, что это проблема где-то здесь:

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

Если вам нужен любой другой из моего кода, я был бы счастлив, чтобы вставить его здесь, я боролся с ним весь день. Когда я SendMessage() Unicode, я просто получаю странные символы, и однажды я даже получил кучу вопросительных знаков.

+0

Использование UTF-16 кодирования и WCHAR (псевдоним wchar_t). –

ответ

0

Вы передаёте char* на номер EM_REPLACESEL. Это будет работать, только если ваш элемент управления RichEdit использует Ansi HWND через 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() (или equivilent) в преобразовать данные в 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; 
} 
+0

Это мое окно: 'win_log = CreateWindow (RICHEDIT_CLASS, NULL, WS_GROUP | ES_MULTILINE | WS_VISIBLE | WS_CHILD | WS_BORDER | WS_VSCROLL | ES_DISABLENOSCROLL | ES_AUTOVSCROLL | ES_SUNKEN, 0, 0, 0, 0, win_main, NULL, HINSTANCE, NULL); ' – ASCORE

+0

Оба« CreateWindow() »и« RICHEDIT_CLASS »являются макросами препроцессора, которые чувствительны к тому, определен ли UNICODE или нет (см. Определения в' winuser.h' и 'richedit.h', соответственно). В вашем случае, вероятно, определен UNICODE, и в этом случае ваш код действительно будет вызывать 'CreateWindowW (RICHEDIT_CLASSW, ...)' после предварительной обработки. –

+0

CreateWindow - это макрос, который расширяется до CreateWindowA или CreateWindowW. Что это для вас? Похоже на последнее. Но вы должны быть ясны по этому вопросу. –

Смежные вопросы