Как отобразить unicode в Edit под Windows 98?
От: Anjey_Nimz  
Дата: 01.06.04 13:32
Оценка:
Здравствуйте.

Пишу программу на Visual C++.

Программа на русском (все надписи на кнопках, меню и т.п.), но иногда нужно выводить и некоторые греческие символы наряду с русскими/английскими (мю, дельта, омега).

Например, так:
"Конденсатор C1 = 0,100 ?F"
"?f = 5 Hz"
(извините, но, кажется, форум не поддерживает юникод. В первой строке вместо вопроса "мю", во второй — "дельта")

Как такой текст отобразить в контроле Edit?
Искал в MSDN, в интернете, но ничего похожего не нашёл.

Unicode в Windows 98 не поддерживается.

Я преобразовал UNICODE-значения этих символов в кодировку UTF-8 (с помощью WideSharToMultiByte, используя CP_UTF8)
    wchar_t ws[3];
    char mbs[6]; 
    const unsigned char s_m[] = {0xBC,0x03,0,0}; // 0x03BC - это символ мю в Unicode
    UINT CodePage = CP_UTF8;
    memcpy((void*)ws , s_m,sizeof(s_m));

    WideCharToMultiByte(
        CodePage,
        0,
        (wchar_t*)s_m,
        -1,
        mbs,
        6,
        NULL,
        NULL);
    SendMessage(::GetDlgItem(hDlg,IDC_EDIT_RESULTS),WM_SETTEXT,0,(LPARAM)mbs);

В результате mbs содержит {0xCE,0xBC,0}, но текст отображается как байты CE и BC в кодировке 1251 (что неудивительно).

Как я понимаю, надо как-то сменить CHARSET, но не понял, как установить именно UTF8.
Хотел использовать CreateFont, но в MSDN в описании параметра DWORD fdwCharSet этой функции 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-строки?
Подскажите, пожалуйста, с помощью каких функций это можно реализовать?

Спасибо.
Re: Как отобразить unicode в Edit под Windows 98?
От: yslag Украина  
Дата: 01.06.04 13:41
Оценка:
Здравствуйте, Anjey_Nimz, Вы писали:

...

A_N>Подскажите, пожалуйста, с помощью каких функций это можно реализовать?


ExtTextOut
Implemented as Unicode and ANSI versions on all platforms


см. также MSLU
Re: Как отобразить unicode в Edit под Windows 98?
От: TK Лес кывт.рф
Дата: 01.06.04 13:43
Оценка:
Здравствуйте, Anjey_Nimz, Вы писали:

A_N>Пишу программу на Visual C++.

A_N>Unicode в Windows 98 не поддерживается.

А если взять Microsoft Layer for Unicode ?
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Как отобразить unicode в Edit под Windows 98?
От: Anjey_Nimz  
Дата: 02.06.04 22:27
Оценка:
Здравствуйте, yslag, Вы писали:

Y>Здравствуйте, Anjey_Nimz, Вы писали:


Y>...


A_N>>Подскажите, пожалуйста, с помощью каких функций это можно реализовать?


Y>ExtTextOut

Y>Implemented as Unicode and ANSI versions on all platforms


Y>см. также MSLU


Спасибо за советы. К сожалению Unicows.dll (MSLU) не помог: греческие символы выводятся знаками вопроса.
Шрифт я установил Arial — в нём греческий есть (смотрел через таблицу символов в MSWord (с помощью таблицы символов Windows 98 не посмотреть: она не показывает Unicode-символы)).
Все функции, связанные с Unicode я загружал из unicows.dll (RegisterClassExW, CreateWindowExW, GetMessageW, DispatchMessageW, SendMessageW, DefWindowProcW, ...). В итоге Unicode-строки нормально отображаются, но не все. Например при таком варианте:

    wchar_t *ss = L"hello";
    _uc_SetWindowTextW(hEdit,ss);

где _uc_SetWindowTextW — это GetProcAddress(hUnicows,"SetWindowTextW"), а hEdit — это HWND child-окна класса "EDIT", также (как и его папочка) полученного вызовом _uc_CreateWindowExW.

Если же попытаться отобразить греческую букву "мю"

    wchar_t ss[] = {0x03BC, 0};
    _uc_SetWindowTextW(hEdit,ss);

то отображается знак вопроса

C помощью ExtTextOutW у меня не получилось, потому что никак не могу сменить шрифт, которым выводится текст.
Я делал так (делал и с unicows и без него — результат одинаковый. Пример ниже — без unicows)

//В обработчике сообщений главного окна
    case WM_PAINT:
        HFONT  m_font;
        HGDIOBJ hGdiObj, hGdiObj2;
        LOGFONT lf;
        hGdiObj = GetCurrentObject(GetDC(hDlg),OBJ_FONT);
        GetObject(hGdiObj,sizeof(LOGFONT), &lf);
        //тут lf.lfFaceName равен "System"

        //пытаюсь установить новый шришт
        strcpy(lf.lfFaceName,"Arial");
        m_font = CreateFontIndirect(&lf);
        hGdiObj = SelectObject(GetDC(hDlg), m_font);

        //Проверяю, установился ли шрифт
        hGdiObj2 = GetCurrentObject(GetDC(hDlg),OBJ_FONT);
        GetObject(hGdiObj,sizeof(LOGFONT), &lf);
        //тут lf.lfFaceName почему-то равен "System"

        ExtTextOutW(GetDC(hDlg),50,50,0, NULL, mu_s,1,NULL);
        //...

Ну и так как шрифт всё ещё систем текст отображается неправильно, и поэтому проверить я не могу, работает ли ExtTextOutW с Юникодом как надо (то есть со всеми кодовыми страницами).
В отладчике смотрел — все хендлы валидные, функции не возвращают ошибочных значений (проверял, присваивая результаты переменным. Просто сюда их не вставил, чтобы не засорять код)
Конечно, если поставить в качестве строки L"Привет всем" — отобразиться всё правитльно. Хотя строка и юникодовая, отображаются только локальные символы (то есть англимйские и русские), а вместо остальных — символ по-умолчанию.
Я подозреваю, что в всё это реализуется через WideCharToMultibyte() (или что-то похожее), переделывая Юникод в локальную кодовую страницу, и поэтому ничего и не выходит (в пользу этого говорит и то, что MessageBoxW в unicows.dll не равлизорван — сразу идёт jmp на MessageBoxW в Kernel32, а там она сделана именно через WidecharToMultibyte)

Подскажите, пожалуйста, почему в моём примере не меняется шрифт System перед выводом ExtTextOutW на Arial?.

И всё-таки те же MS Word, Explorer и Opera как-то отображают Unicode-символы. Каким образом они это делают?

Спасибо большое.
Re: Как отобразить unicode в Edit под Windows 98?
От: NWP Россия  
Дата: 03.06.04 04:23
Оценка:
Здравствуйте, Anjey_Nimz, Вы писали:

A_N>Здравствуйте.


A_N>Пишу программу на Visual C++.


A_N>Программа на русском (все надписи на кнопках, меню и т.п.), но иногда нужно выводить и некоторые греческие символы наряду с русскими/английскими (мю, дельта, омега).

...

А что если просто взят какой-нить редактор шрифтов и в нужном тебе шрифте, вместо какой-нить бяки нарисовать нужные тебе буквы???
А потом распрстроняй этот шрифт вместе со своей прогой.
Re: Как отобразить unicode в Edit под Windows 98?
От: _nn_  
Дата: 03.06.04 07:15
Оценка:
Здравствуйте, 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)
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Как отобразить unicode в Edit под Windows 98?
От: Anjey_Nimz  
Дата: 04.06.04 07:59
Оценка:
Прошу прощения. Я неправильно брал хендл 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?
От: _nn_  
Дата: 04.06.04 08:20
Оценка:
Здравствуйте, Anjey_Nimz, Вы писали:

Если я правильно понял ваши намерения, то вы хотите сделать чтобы стандартные контролы работали с Unicode в Windows 98.
Если у вас это получиться, буду очень признателен если вы разместите исходник на RSDN.

С Уважением,
NN.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Как отобразить unicode в Edit под Windows 98?
От: Anjey_Nimz  
Дата: 04.06.04 10:01
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, Anjey_Nimz, Вы писали:


__>Если я правильно понял ваши намерения, то вы хотите сделать чтобы стандартные контролы работали с Unicode в Windows 98.

__>Если у вас это получиться, буду очень признателен если вы разместите исходник на RSDN.

__>С Уважением,

__>NN.

Мне нужно выводить Unicode-текст (многоязычный) в своей программе. Так как использую стандартные контролы, то естественно выводить буду в них, но, к сожалению, мои способности в области программирования пока оставляют желать лучшего, поэтому до написания собственных контролов мне далековато.

Если что-то подобное вдруг реализую, обязательно дам знать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.