Форум » Компьютерный раздел » C++ MFC » Ответить

C++ MFC

Giora: Вопрос достаточно специфического плана, но в тоже время есть неплохие шансы, что тот кто приграмировал/ет под MFC знает ответ. Но тем кто не сталкивался, даже не читайте, вопрос достаточно специфического свойства. У вас есть класс типа CListCtrl. Этот класс один из способов работы с View List, то есть отображать данные на экран. Все бы ничего, да вот в Unicode проблемки. Я выцарапаю кусочки релевантого кода так будет наглядней. CListCtrl m_listData; // обьявлен класс типа CListCtrl CString strData; // Обьявлена переменна типа Стринг, причем проект скомпилирован с флагом Юникод. Check = ListView_GetUnicodeFormat(HWND(m_listData)); // Я просто думал что может Юникод мод не установлен, // поэтому позвонил в эту функцию проверить. Check = 1, // что говорит о том что ресурс работает в юникоде. m_listData.SetItem(nRow, nField, LVIF_TEXT,strData, -1, 0, 0, 0); // Это сам звонок в функцию которая выводит на экран Это то что сидит в переменной strData перед посылкой в печать: +strData {0x003ab938 «Сука1»} ATL::CStringT‹unsigned short,StrTraitMFC‹unsigned short,ATL::ChTraitsCRT‹unsigned short› › › как видите слово «Сука1» в юникоде очень сладко так сидит. А в окне вывода я вижу вместо кирилицы вертикальные палки. Любое слово на латинском конечно печатает, цифры печатает, русские буквы не печатает.

Ответов - 12

Доныч: Жора, проверь свою среду разработки на наличие матофильтра. Я думаю, дело в нем. А если серьезно, то я не знаю в чем дело. Постучись Шурику ЦЦ в приват на ВСК-форуме и дай ссылку на эту ветку. Может поможет.

Giora: Да я сначала вежливые слова писал, у меня любимая тест-переменная - «Жопа» :), это потом уже на мат перешел, от отчаяния :) Шура ЦЦ мне точно поможет, сначала удавит, потом поможет :)

Доныч: Giora пишет: цитатаШура ЦЦ мне точно поможет, сначала удавит, потом поможет :) Главное - результат.


хохляЦЦ: Покопай эту функцию: SetLocaleInfo The SetLocaleInfo function sets an item of locale information. This setting only affects the user override portion of the locale settings; it does not set the system defaults. BOOL SetLocaleInfo( LCID Locale ‹›, // locale identifier LCTYPE LCType ‹›, // information type LPCTSTR lpLCData ‹› // information buffer ); Parameters Locale [in] Specifies the locale whose information the function will set. The locale provides a context for the string mapping or sort key generation. An application can use the MAKELCID ‹nls_7qck.htm› macro to create a locale identifier. LCType [in] Specifies the type of locale information to be set by the function. Note that only one LCTYPE may be specified per call. Not all LCTYPE values are valid; see the list of valid LCTYPE values in the following Remarks section. lpLCData [in] Pointer to a null-terminated string containing the locale information the function will set. The information must be in the specified LCTYPE’s particular format. Русская локаль: 0x0419

Giora: Сейчас посмотрю, спасибо.

Giora: Шура, я вставил вот такой код, но не помогает. То есть я сознательно сначала получил из системы русски локале, так как она его видит ( на всякий случай), ну и потом установил его. Что-то не правильно ? И мне кажется что все это актуально когда ты работаешь с WIN API, я же работаю в MFC Какого хрена я должен звонить в системные функции Виндов, когда я на целый уровень выше ? MFC должен позаботиться обо мне и моих проблемах :) LPTSTR Locale_Holder; WORD LangID = MAKELANGID((USHORT)0x19, (USHORT)0x01); WORD wSortId = SORT_DEFAULT; DWORD Locale = MAKELCID(LangID, wSortId ); Check=GetLocaleInfo(Locale,LOCALE_ILANGUAGE,Locale _Holder,5); SetLocaleInfo(Locale,LOCALE_ILANGUAGE,Locale_Holde r);

Giora: Погоди, я посмотрел что SetLocaleInfo возвращает 0 - звонок с ошибкой, надо посмотреть почему.

Giora: Не знаю, по моему формат правильный, но звонок почему то не проходит. Так тоже не проходит: LPCTSTR Locale_Buf = _T(«0419»); BOOL Check = SetLocaleInfo(Locale,LOCALE_ILANGUAGE,Locale_Buf); возвращает 0. Че ей надо ? :)

хохляЦЦ: Попробуй сменить национальность. Если не получится, тогда попытайся думать.

Giora: Хамло ! Я тебе отвечу, в последний раз, и только для того, чтобы показать тебе твою некомпетентность. Причем слышишь ты это от инженера-электронщика, который просто неплохо разбирается в программировании - вдвойне должно быть стыдно. Функция SetLocaleInfo не может поменять установку языка, это и не ее задача. Она может поменять формат текущего языка, например форму написания дат, денежных единиц, и прочее. Чтобы поменять язык, используется функция SetThreadLocale. Эта функция меняет Локале для твоегo Threda, что в принципе ты и посоветовал сделать. Но ... : Если бы ты немножко разбирался в софте, ты бы понимал что менять Локале абсолютно ни к чему. Твоя прога хочеть распечатать что-то ? Уникод - это таблица всех значков для всех языков. Выбираешь нужный значок- печатаешь. Ты можешь одновременно печатать на 30 языках, не меняя никаких установок. Доказать что я прав элементарно, в том же сегменте кода например ставится строчка: MessageBox(strData,NULL,MB_OK ); И все печатается по русски на раз. В переменной StrData слово русскими буквами в формате уникода, и все. Тут же можно на иврите и французком писать, элементарно. Единственное, что я получил из нашего общения, это разобрался с функцией Set, Get Locale, ну и понял также, какой ты некомпетентный пацан. Можешь не отвечать, общаться с тобой за твое хамство больше никогда не буду. Удачи ! :)

хохляЦЦ: Ну вот, пацан хоть в чем-то начал разбираться.. Но цель цитатаобщаться с тобой ... больше никогда не буду. достигнута, и это радует.

аыуп:



полная версия страницы