| PMG http://forum.pmg.org.ru/ |
|
| Кто знает, в чём дело ??? http://forum.pmg.org.ru/viewtopic.php?f=1&t=60 |
Страница 1 из 2 |
| Автор: | MagicWolf [ 17 авг 2005 08:44 ] |
| Заголовок сообщения: | |
А может там и нет желтого? |
|
| Автор: | BAPBAP [ 01 дек 2005 17:16 ] |
| Заголовок сообщения: | |
Нашёл у вас на сайте пример использования шрифтов Windows для вывода в OpenGL. Пишу я на Visaul C++ 7.0 Всё работает, когда я реализую все функции (создание, вывод) непосредственно в коде. Но когда я создал класс (так было легче для работы) он перестал выводить РУССКИЙ текст, а всё остальное (в том числе и русские цифры) выводит. Объясните мне пожалуйста, ПОЧЕМУ???
Заранее большое спасибо
|
|
| Автор: | MagicWolf [ 02 дек 2005 16:21 ] |
| Заголовок сообщения: | |
Русских цифр нет, наверно это оговорка. Русский текст не выводит из того что не правильно выбрана кодовая страница, скорее всего. Хотя исходник для наглядности бы не помешал. |
|
| Автор: | DDMZ [ 02 дек 2005 18:42 ] |
| Заголовок сообщения: | |
Может быть вы используете CHAR вместо BYTE (UNSIGNED CHAR)? Потому символы с кодом выше 127 невыводятся |
|
| Автор: | BAPBAP [ 05 дек 2005 21:05 ] |
| Заголовок сообщения: | |
Спасибо, что обсудили, но... Я написал, что всё работает (и выводиться русский текст), когда функция вывода текста оформлена как ОБЫКНОВЕННАЯ функция. Но русский текст перестал выводиться когда я СОЗДАЛ КЛАСС CText, в котором есть функция DrawText для вывода текста в окно. Хочу заметить, что код функции вывода текста моего класса CText.DrawText () АБСОЛЮТНО такой же, как и обыкновенной функции (я его просто скопировал ).
Я не жадный , мог бы вставить сюда текст, который я скопировал из NeHe, но зачем???
|
|
| Автор: | BAPBAP [ 05 дек 2005 21:12 ] |
| Заголовок сообщения: | |
Цитата: Может быть вы используете CHAR вместо BYTE (UNSIGNED CHAR)?
Потому символы с кодом выше 127 невыводятся _________________ Хочу иметь.... много компьютеров, много денег, и быть известным. Но я не Гилл Бетс ) Да, я использую char. Но ведь когда функция вывода реализована не в классе, то ВСЁ прекрасно работает. А вот когда она стала методом класса, то русский текст не выводит, а английский - с радостью. Конечно, данная проблема - это не проблема (проблема мне было найти как вывести текст в OpenGL ). Можно и без классов обойтись, но это меня поставило в тупик, т.е. я не смог объяснить себе, почему так происходит
|
|
| Автор: | MagicWolf [ 06 дек 2005 10:33 ] |
| Заголовок сообщения: | |
Тем более без кода не разобраться.
|
|
| Автор: | BAPBAP [ 06 дек 2005 17:13 ] |
| Заголовок сообщения: | |
MagicWolf писал(а): Тем более без кода не разобраться. Ну, код класса вот:
![]() /******************************************************************/ // Класс для вывода 3D-текста. #include <gl\gl.h> // заголовочный файл для библиотеки OpenGL32 class CText { public: CText () { } ~CText () { KillFont (); } // Функция вывода текста в OpenGL GLvoid DrawText (const char *Fmt, ...) { float fLength = 0; // Переменная для нахождения физической длины текста. char Text [256]; // Здесь наша строка. va_list pList; // Указатель на переменный список аргументов. // Если нет текста. if (Fmt == NULL) return; // Анализ строки на переменные va_start(pList, Fmt); // Конвертация символов в реальные коды. vsprintf(Text, Fmt, pList); // Результат сохраняется в text. va_end(pList); // Увеличение размера на ширину символа. for (DWORD i = 0; i < (strlen (Text)); i++)//Цикл поиска размера строки fLength += gmf [Text[i]].gmfCellIncX; //Центровка на экране нашей строки. glTranslatef (-fLength / 2.0f ,0.0f, 0.0f); // Сохраняет в стеке значения битов списка отображения. glPushAttrib(GL_LIST_BIT); // Устанавливает базовый символ в 0. glListBase(glunBase); // Создает списки отображения текста. glCallLists (GLsizei (strlen(Text)), GL_UNSIGNED_BYTE, Text); // Восстанавливает значение Display List Bits. glPopAttrib(); } // Строим растровый шрифт. GLvoid BuildFont(HDC hDC) { HFONT Font; // Идентификатор шрифта Windows. glunBase = glGenLists(256); // массив для 256 букв. Font = CreateFont(-12, // высота шрифта. 0, // ширина знакоместа. 0, // Угол перехода. 0, // Угол направления. FW_BOLD, // Ширина шрифта. FALSE, // Курсив . FALSE, // Подчеркивание. FALSE, // Перечеркивание. ANSI_CHARSET, // Идентификатор кодировки. OUT_TT_PRECIS, // Точность вывода. CLIP_DEFAULT_PRECIS, // Точность отсечения. ANTIALIASED_QUALITY, // Качество вывода. FF_ROMAN | DEFAULT_PITCH, // Семейство и Шаг. "Times New Roman CYR"); // Имя шрифта. //Выбрать шрифт, созданный нами SelectObject(hDC, Font); wglUseFontOutlines (hDC, // Выбрать текущий контекст устройства (DC). 0, // Стартовый символ. 255, // Количество создаваемых списков отображения. glunBase, // Стартовое значение списка отображения. 0.0f, // Отклонение от настоящего контура. 0.3f, // Толщина шрифта по оси Z. WGL_FONT_POLYGONS, // Использовать полигоны, а не линии. gmf); // буфер адреса для данных списка отображения. } private: // Удаление шрифта GLvoid KillFont(GLvoid) { // Удаление всех 256 списков отображения glDeleteLists(glunBase, 256); } private: GLuint glunBase; // База отображаемого списка для набора символов (добавлено). GLYPHMETRICSFLOAT gmf[256]; // Массив с информацией о нашем шрифте. private: }; /******************************************************************/ Сегодня ещё раз поработал над программой и случайно заметил, что русский текст выводиться методом моего класса тогда, когда я запускаю прогу вне IDE Visual Studio, а когда в IDE - не работает. И ещё центрирование происходит неправильно при русском тексте |
|
| Автор: | MagicWolf [ 06 дек 2005 17:27 ] |
| Заголовок сообщения: | |
Так вроде все нормально. Только что может поиграться ANSI_CHARSET, заменить на что-то другое, например, RUSSIAN_CHARSET. |
|
| Автор: | BAPBAP [ 06 дек 2005 20:22 ] |
| Заголовок сообщения: | |
MagicWolf писал(а): Так вроде все нормально. Только что может поиграться ANSI_CHARSET, заменить на что-то другое, например, RUSSIAN_CHARSET. Это я уже пробовал, с самого начала, но не помогло. Когда прогу запускаю из Visual Studio, то она не выводит русский текст, а когда из Total Commander - то всё OK. Видимо это проблемка Visual Studio, а против этого мы бессильны .
|
|
| Автор: | MagicWolf [ 07 дек 2005 10:14 ] |
| Заголовок сообщения: | |
В VC Solution\Properties\C\C++\General\Debug Information Format - по играйся с этим, например, С7 Compatible поставь. Ясно одно, что wglUseFontOutlines не отрабатывает! |
|
| Автор: | MagicWolf [ 07 дек 2005 11:18 ] |
| Заголовок сообщения: | |
Кстати, фонт TrueType, а они все в unicode! По идее и текстовая строка должна быть в уникоде, иначе действительно может не работать. |
|
| Автор: | BAPBAP [ 07 дек 2005 12:14 ] |
| Заголовок сообщения: | |
MagicWolf писал(а): Кстати, фонт TrueType, а они все в unicode! По идее и текстовая строка должна быть в уникоде, иначе действительно может не работать. Не подскажите ли как перевести текст из ANSI в UNICODE, а то Solution\Properties\C\C++\General\Debug Information Format не помогло.
|
|
| Автор: | MagicWolf [ 07 дек 2005 17:01 ] |
| Заголовок сообщения: | |
Вот это просто: #define W_B(w, a, cb) WideCharToMultiByte( \ CP_ACP, \ 0, \ w, \ -1, \ a, \ cb, \ NULL, \ NULL) #define B_W(a, w, cb) MultiByteToWideChar( \ CP_ACP, \ 0, \ a, \ -1, \ w, \ cb) Но wglUseFontOutlines не понимает wchar_t !
|
|
| Страница 1 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|