Программа на русском (все надписи на кнопках, меню и т.п.), но иногда нужно выводить и некоторые греческие символы наряду с русскими/английскими (мю, дельта, омега).
Например, так:
"Конденсатор C1 = 0,100 ?F"
"?f = 5 Hz"
(извините, но, кажется, форум не поддерживает юникод. В первой строке вместо вопроса "мю", во второй — "дельта")
Как такой текст отобразить в контроле Edit?
Искал в MSDN, в интернете, но ничего похожего не нашёл.
Unicode в Windows 98 не поддерживается.
Я преобразовал UNICODE-значения этих символов в кодировку UTF-8 (с помощью WideSharToMultiByte, используя CP_UTF8)
В результате mbs содержит {0xCE,0xBC,0}, но текст отображается как байты CE и BC в кодировке 1251 (что неудивительно).
Как я понимаю, надо как-то сменить CHARSET, но не понял, как установить именно UTF8.
Хотел использовать CreateFont, но в MSDN в описании параметра DWORDfdwCharSet этой функции UTF8_CHARSET нету.
там только такие
[msdn] ANSI_CHARSET
BALTIC_CHARSET
CHINESEBIG5_CHARSET
DEFAULT_CHARSET
EASTEUROPE_CHARSET
GB2312_CHARSET
GREEK_CHARSET
HANGUL_CHARSET
MAC_CHARSET
OEM_CHARSET
RUSSIAN_CHARSET
SHIFTJIS_CHARSET
SYMBOL_CHARSET
TURKISH_CHARSET Korean Windows:
JOHAB_CHARSET Middle-Eastern Windows:
HEBREW_CHARSET
ARABIC_CHARSET Thai Windows:
THAI_CHARSET[/msdn]
Установить тодлько греческую кодировку я не могу, так как надо использовать и руссие буквы
Может ли как-то Windows вообще отображать multibyte-строки?
Подскажите, пожалуйста, с помощью каких функций это можно реализовать?
Здравствуйте, yslag, Вы писали:
Y>Здравствуйте, Anjey_Nimz, Вы писали:
Y>...
A_N>>Подскажите, пожалуйста, с помощью каких функций это можно реализовать?
Y>ExtTextOut Y>Implemented as Unicode and ANSI versions on all platforms
Спасибо за советы. К сожалению Unicows.dll (MSLU) не помог: греческие символы выводятся знаками вопроса.
Шрифт я установил Arial — в нём греческий есть (смотрел через таблицу символов в MSWord (с помощью таблицы символов Windows 98 не посмотреть: она не показывает Unicode-символы)).
Все функции, связанные с Unicode я загружал из unicows.dll (RegisterClassExW, CreateWindowExW, GetMessageW, DispatchMessageW, SendMessageW, DefWindowProcW, ...). В итоге Unicode-строки нормально отображаются, но не все. Например при таком варианте:
где _uc_SetWindowTextW — это GetProcAddress(hUnicows,"SetWindowTextW"), а hEdit — это HWND child-окна класса "EDIT", также (как и его папочка) полученного вызовом _uc_CreateWindowExW.
Если же попытаться отобразить греческую букву "мю"
C помощью ExtTextOutW у меня не получилось, потому что никак не могу сменить шрифт, которым выводится текст.
Я делал так (делал и с unicows и без него — результат одинаковый. Пример ниже — без unicows)
Ну и так как шрифт всё ещё систем текст отображается неправильно, и поэтому проверить я не могу, работает ли ExtTextOutW с Юникодом как надо (то есть со всеми кодовыми страницами).
В отладчике смотрел — все хендлы валидные, функции не возвращают ошибочных значений (проверял, присваивая результаты переменным. Просто сюда их не вставил, чтобы не засорять код)
Конечно, если поставить в качестве строки L"Привет всем" — отобразиться всё правитльно. Хотя строка и юникодовая, отображаются только локальные символы (то есть англимйские и русские), а вместо остальных — символ по-умолчанию.
Я подозреваю, что в всё это реализуется через WideCharToMultibyte() (или что-то похожее), переделывая Юникод в локальную кодовую страницу, и поэтому ничего и не выходит (в пользу этого говорит и то, что MessageBoxW в unicows.dll не равлизорван — сразу идёт jmp на MessageBoxW в Kernel32, а там она сделана именно через WidecharToMultibyte)
Подскажите, пожалуйста, почему в моём примере не меняется шрифт System перед выводом ExtTextOutW на Arial?.
И всё-таки те же MS Word, Explorer и Opera как-то отображают Unicode-символы. Каким образом они это делают?
Здравствуйте, Anjey_Nimz, Вы писали:
A_N>Здравствуйте.
A_N>Пишу программу на Visual C++.
A_N>Программа на русском (все надписи на кнопках, меню и т.п.), но иногда нужно выводить и некоторые греческие символы наряду с русскими/английскими (мю, дельта, омега).
...
А что если просто взят какой-нить редактор шрифтов и в нужном тебе шрифте, вместо какой-нить бяки нарисовать нужные тебе буквы???
А потом распрстроняй этот шрифт вместе со своей прогой.
Здравствуйте, Anjey_Nimz, Вы писали:
A_N>Здравствуйте.
A_N>Пишу программу на Visual C++.
A_N>Программа на русском (все надписи на кнопках, меню и т.п.), но иногда нужно выводить и некоторые греческие символы наряду с русскими/английскими (мю, дельта, омега).
A_N>Например, так: A_N>"Конденсатор C1 = 0,100 ?F" A_N>"?f = 5 Hz" A_N>(извините, но, кажется, форум не поддерживает юникод. В первой строке вместо вопроса "мю", во второй — "дельта")
Если использовать вместо Edit RichEdit (желательно версии 3.0) то можно выводить в Windows 98 Unicode символы без проблем. (при использовании сообщения EM_GETTEXTEX, EM_SETTEXTEX)
Прошу прощения. Я неправильно брал хендл DC несколько раз (всатвлял GetDC(hDlg) в нужные фйнкции).
Правильно так:
hdc = GetDC(hDlg)
а потом этот hdc использовать во всех вызовах.
Шрифт нормально меняется и ExtTextOutW работает как надо.
Про MSLU (unicows.dll) я понял, что он не покатит: с помощью неё нельзя отображать UNICODE-символы разных кодовых страниц одновременно, а мне нужно именно это.
_nn_>Если использовать вместо Edit RichEdit (желательно версии 3.0) то можно _nn_>выводить в Windows 98 Unicode символы без проблем. (при использовании сообщения EM_GETTEXTEX, EM_SETTEXTEX)
Спасибо, это тоже работает. Даже с версией 2.0 (пришлось установить SDK поневее, так как в моей VS 6.0 не было сообщения EM_SETTEXTEX)
NWP>А что если просто взят какой-нить редактор шрифтов и в нужном тебе шрифте, NWP> вместо какой-нить бяки нарисовать нужные тебе буквы??? NWP>А потом распрстроняй этот шрифт вместе со своей прогой.
В принципе, можно, но в дальнейшем, возможно, понадобится более широкий набор символов, на который "бяки" может не хватить.
Поэтому, скорее всего, буду использовать ExtTextOutW (нужно также обеспечить вывод символов в Combobox, а там Edit)
Все вопросы разрешились
Ещё раз всем большое спасибо за помошь.
Re[3]: Как отобразить unicode в Edit под Windows 98?
Если я правильно понял ваши намерения, то вы хотите сделать чтобы стандартные контролы работали с Unicode в Windows 98.
Если у вас это получиться, буду очень признателен если вы разместите исходник на RSDN.
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, Anjey_Nimz, Вы писали:
__>Если я правильно понял ваши намерения, то вы хотите сделать чтобы стандартные контролы работали с Unicode в Windows 98. __>Если у вас это получиться, буду очень признателен если вы разместите исходник на RSDN.
__>С Уважением, __>NN.
Мне нужно выводить Unicode-текст (многоязычный) в своей программе. Так как использую стандартные контролы, то естественно выводить буду в них, но, к сожалению, мои способности в области программирования пока оставляют желать лучшего, поэтому до написания собственных контролов мне далековато.
Если что-то подобное вдруг реализую, обязательно дам знать