H := CreateWindowW(... SendMessage(H, wm_SetText, 0, integer(pchar('Русский текст')));
На моей машине русский текст отображается корректно. На другой (тоже русская ХР) - нет, отображаются закорючки. На английской - хз, не могу проверить.
Так вот, у меня вопрос. Преобразование простой строки в юникодовую (а именно оно происходит при отправке сообщения) делается через какую-то виндовую функцию. Как функция определяет, какую кодировку при этом брать? Какие-то настройки системы? Настройки программы?
Ну типа того. Правда, я всё равно ничего не понимаю. Написано, что по умолчанию преобразование производится для кодировки ANSI. В этом наборе символов, составленном не нами, предусмотрели полный русский алфавит? Или это только в русской винде так?
На другом компе вообще так вышло, что те компоненты, названия которым были даны при создании (я делал преобразование PWideChar(WideString(S))), видны коряво, а те, которым были даны позже, через SetText, на тех всё нормально. Долгое разглядывание функции WideString привело меня на стандартную функцию из винды. То есть это оно работает не так, как преобразователь при обращении к компонентам?
volvo
13.01.2011 21:41
Значит, смотри...
Я сейчас тестировал свой код на машине, где про русский язык и кириллицу вообще ничего не знают. Тут стоит HEBREW для не-юникода (я это сделал специально даже не на свое машине, а на чужой). Так вот. Делаю так:
const CP_THREAD_ACP = 3;
procedure SendToControl (Where : HWND; s : string); var pstrw : PWideChar; cchw : Integer; begin cchw := MultiByteToWideChar(CP_THREAD_ACP, 0, @s[1], Length (s), nil, 0) + 1; if cchw <> 0 then begin GetMem(pstrw, cchw * SizeOf (WideChar)); try MultiByteToWideChar (CP_THREAD_ACP, 0, @s[1], Length (s), pstrw, cchw); pstrw[cchw - 1] := #0; SendMessageW (Where, WM_SETTEXT, 0, Integer (pstrw)); // именно W, а не A finally FreeMem(pstrw, cchw * SizeOf (WideChar)); end; end; end;
, вызываю - так:
case Msg of WM_COMMAND: begin case LoWord (wParam) of BTN: begin SendToControl (myEdit, 'Русский текст'); end; end; end; // ...
(самой первой строкой программы запихал
SetThreadLocale (1049);
, чтоб насильственно переключить поток на русскую локаль).
В Эдите появляется ровно та надпись, которую я посылаю. На русском языке... Исходник сохранен не в Юникоде, а в Win1251, компилировалось все это дело обычным консольным FPC, так что и тут зависимости от IDE никакой, ее просто нет (я про IDE).
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.