На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Греческие символы
    Вопрос в том как отобразить в статиках греческие символы.

    Вот код, которым я вывожу текст в статик
    ExpandedWrap disabled
      char str[][256] = {"0","1","2","3"};
      for (i=0; i<4; i++)
      {
          hwnd[i+1] = CreateWindowEx(0, WC_STATIC, NULL, dwstylelabel, 0, 24*i, 100, 20, hwnd[0], (HMENU) (1001 + i), hinstance, NULL);
      }
      //...
      for (i=0; i<4; i++)
      {
          SetDlgItemText(hwnd[0], 1001+i, str[i]);
      }


    Вод код который выводит греческие символы,
    ExpandedWrap disabled
          HFONT hfont;
          HDC hdc;
          char symbol[2];
          symbol[0] = 'a'; // что-бы вывести букву альфа
          symbol[1] = 0;
      //...
              hfont = CreateFont(15, 7, 0, 0, FW_NORMAL, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("Symbol"));
              hdc = GetDC(hwnd[i+1]);
              SetBkMode(hdc, TRANSPARENT);
              SelectObject(hdc, hfont);
              TextOut(hdc, 0, 0, symbol, (INT) strlen(symbol));
              ReleaseDC(hwnd[i+1], hdc);
              DeleteObject(hfont);


    Однако это как-бы рисование и немного не подходит. Потому что, если делать свое рисование, то нужно полностью рисовать во всех статиках
    а их у меня массив и получается невыгодно - из-за пары греческих букв переписывать рисование всем статикам. Нарисовать на форме тоже не подходит -
    кроме этого есть еще рисунки и если рисовать еще на форме все начинает рябить. Смотрю в сторону использования символов юникода.

    В итоге вопрос: Как отобразить в статиках греческие символы с помощью юникода ?
      Да просто использовать wchar_t заместо char'а и вызывать (если надо) TextOutW.

      Добавлено
      Ну и SetDlgItemTextW, само собой.
        Заменил char на wchar_t

        Было:
        ExpandedWrap disabled
          char str[][256] = {"0","1","2","3"};


        Стало:
        ExpandedWrap disabled
          wchar_t str[][256] = {"0","1","2","3"};


        Ругается
        error C2440: 'initializing' : cannot convert from 'const char [2]' to 'wchar_t'
        This conversion requires a reinterpret_cast, a C-style cast or function-style cast
          Цитата Mr.Brooks @
          В итоге вопрос: Как отобразить в статиках греческие символы с помощью юникода ?

          Попробовать так:
          Пуск->Программы->Стандартные->Служебные->Таблица символов.
          Поищи в нужном фонте нужный символ.
          Скопируй от туда и вставь в строку своей программы
          (или выясни, какой у него двоичный код и вставь в свою программу кодом)
          Как-то так:
          ExpandedWrap disabled
            const TCHAR* pStr = _T("0123 αδθλμ 3210");
            Цитата Mr.Brooks @
            Ругается
            error C2440: 'initializing' : cannot convert from 'const char [2]' to 'wchar_t'
            This conversion requires a reinterpret_cast, a C-style cast or function-style cast

            Поставь перед строкой префикс L - L"0", L"1".... Тогда статические строки будут в юникоде.

            И, судя по всему, у тебя проект скомпилирован в ascii. Лучше установи в свойствах проекта Use Unicode Character Set, либо вызывай SetDlgItemTextW
              Попробовал поставить
              ExpandedWrap disabled
                const TCHAR* pStr = _T("0123 αδθλμ 3210");

              или префикс L

              -> не понимает.

              Изменил в свойствах проекта Use Unicode Character Set

              -> понял, и выдал 180 ошибок типа:

              Form.cpp(83) : error C2664: 'AppendMenuW' : cannot convert parameter 4 from 'const char [4]' to 'LPCWSTR'
              Form.cpp(609) : error C2664: 'UnregisterClassW' : cannot convert parameter 1 from 'char [256]' to 'LPCWSTR'
              ...

              Что-то мне не очень хочется переписывать весь проект ради двух-трех символов.
              (в конце концов можно написать alfa, beta, gamma - в немецкой программе такое видел)
              Трудоемкость это пол-беды, главное что получается код менее читаемый, когда перед каждыми "" эти L напичканы.
              Вывод : Хомуты - этот юникод. Лучше попробовать по-другому.

              Думаю изменить шрифт нужных статиков на "Symbol".
              ExpandedWrap disabled
                //hfont = (HFONT) GetStockObject(DEFAULT_GUI_FONT);  // <- это заменил
                hfont = CreateFont(15, 7, 0, 0, FW_NORMAL, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("Symbol")); // <- на это
                for (i=0; i<e::hwndubound; i++)
                {
                    SendMessage(e::hwnd[i], WM_SETFONT, (WPARAM) hfont, NULL);
                }


              ... но к сожалению не помогло.

              Вопрос

              SetDlgItemText() вообще может ли вывести текст другим шрифтом ?
              Сообщение отредактировано: Mr.Brooks -
                Эта функция вообще текст не выводит, а просто засылает его контролу. А сам контрол конечно может выводить всяческими установленными шрифтами!
                  Прикреплённая картинка
                  Прикреплённая картинка


                  А где же греческие символы ?

                  Добавлено
                  Цитата
                  А сам контрол конечно может выводить всяческими установленными шрифтами

                  Как тогда изменить шрифт контролла?
                    Я как-то так делал:
                    ExpandedWrap disabled
                      ::SendMessageW( edit, WM_SETFONT, (WPARAM)myFont12, TRUE);
                      ::SendMessageW( edit, EM_LIMITTEXT, 16, 0);
                      А можно как-то в прекомпиляции менять целые строки? (пусть посимвольно и склеивая...)
                      Т.е. символы я бы так мог менять:
                      ExpandedWrap disabled
                        #define GREKI(qq) (wchar_t(945+qq-'a')) // 945-код альфы

                      А вот как поменять целую строчку: "proba" чтобы скомпилилось со строкой L"προβα" ?
                        Цитата Mr.Brooks @
                        Попробовал поставить
                        ExpandedWrap disabled
                          const TCHAR* pStr = _T("0123 αδθλμ 3210");

                        или префикс L

                        -> не понимает.

                        Вероятно, ты не использовал
                        ExpandedWrap disabled
                          #include <tchar.h>


                        Это надо делать потому, что ты используешь "CreateWindowEx", "CreateFont"
                        и другие подобные вызовы.
                        Дело в том, что этих функций не существует.
                        Есть "CreateWindowExA" и "CreateWindowExW", "CreateFontA", "CreateFontW".
                        Какая именно будет подставлена, зависит от настроек проекта ASCII/UNICODE.
                        Чтобы для функций такого рода всегда подставлялись правильные параметры
                        используются определения из файла tchar.h. (_T(), _TEXT(), _tcslen() вместо strlen() итд итп)

                        Подобные мероприятия делают исходники "универсальными" - т.е. дают возможность
                        собрать как ASCII так и UNICODE приложение без изменения исходных текстов.
                        Скрытый текст

                        Лучше всегда поступать таким образом, поскольку может оказаться, что сделанный исходник
                        (или его часть) пригоден для частого использования и может быть помещён в библиотеку.
                        А библиотеки перспективнее делать для разных параметров компиляции из одних исходников.
                        Т.е. ASCII/UNICODE, x86/x64. Всего получается 4 штуки.


                        CreateFont, например
                        Цитата

                        ...
                        Header Wingdi.h (include Windows.h)
                        Library Gdi32.lib
                        DLL Gdi32.dll
                        Unicode and ANSI names CreateFontW (Unicode) and CreateFontA (ANSI)
                        ...
                        Сообщение отредактировано: ЫукпШ -
                          Цитата Mr.Brooks @
                          const TCHAR* pStr = _T("0123 αδθλμ 3210");

                          или префикс L

                          -> не понимает.


                          Естественно, не понимает, потому что макросы TCHAR и _T у тебя раскрываются как ansi-строки, char и "" соответственно.
                          Кроме и того, не забывай, что cpp-файл, в котором ты объявляешь эти строки сохраняется тоже в ansi, соответственно указать там напрямую греческие символы не получится.
                          Попробуй сохранить/загрузить нужные строки из ресурсов, из string table, например при помощи CString::LoadString.
                            Получилось. Сделал так:
                            1) добавил
                            ExpandedWrap disabled
                              #include <tchar.h>

                            2) создаю статик с символом альфа
                            ExpandedWrap disabled
                              hwndstatic = CreateWindowExW(0, WC_STATICW, L"\x03B1", dwstylelabel, 200, 40, 20, 20, hwnd, (HMENU) 1001, hinstance, NULL);


                            Скрытый текст

                            Все, конечно верно, UNICODE без сомнений перспективен, но что-то мне напряжно с этими вещами работать.
                            Ну например я так и не смог добиться скопировать одну строку в другую с юникодовскими кодами, прошу прощения за каламбур.

                            Было раньше в программе - все понятно глобальная строка из 256 символов копируется в локальную из 256 символов.
                            потом строку выводим в статик, тоже все понятно. Все работает.
                            ExpandedWrap disabled
                              namespace e
                              {
                              extern char globalstr[256];
                              }
                              //...
                              char str[256];
                              strcpy(str, e::globalstr);
                              SetDlgItemText(hwnd, 1001, str);

                            Теперь с юникодом.
                            Искал аналог на strcpy() нашел похожую lstrcpy(), но и то после 2 часов жонглирования с _T() или TEXT() или L впереди или W позади
                            а также LPTSTR, TCHAR, wchar_t и т.д. максимум что мне удалось это вывести в метку знак ?.

                            Студия все время тужилась сохранить исходник в юникоде, когда я ставил в код символ - это понятно. Но мне не очень нравиться такая идея, поскольку я для некоторых вещей пользуюсь обычным блокнотом и мне это разнообразие кодировок текстовых документов не нужно. Так что сделал как выше указано в п1,2. Если у кого-нибудь есть желание черкатите пару строк как создав такое

                            hwndstatic = CreateWindowExW(0, WC_STATICW, NULL, dwstylelabel, 200, 40, 20, 20, hwnd, (HMENU) 1001, hinstance, NULL);

                            потом NULL(надпись) заменить на код L"\x03B1" и использовать SetDlgItemTextW для отображения на статике альфы.
                            так для интереса, нет - так нет, у меня в принципе ...


                            Вопрос решен. Всем спасибо.
                            Сообщение отредактировано: Mr.Brooks -
                              Цитата Mr.Brooks @
                              Ну например я так и не смог добиться скопировать одну строку в другую с юникодовскими кодами, прошу прощения за каламбур.

                              Было раньше в программе - все понятно глобальная строка из 256 символов копируется в локальную из 256 символов.

                              Искал аналог на strcpy() нашел похожую lstrcpy(), но и то после 2 часов жонглирования с _T() или TEXT() или L впереди или W позади

                              Про это можно почитать тут.
                              Постарайся найти .iso образ MSDN и тогда не всегда обязательно искать в Сети.
                              Получишь справочник у себя на диске.
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0713 ]   [ 18 queries used ]   [ Generated: 19.04.24, 11:24 GMT ]