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 Всё работает, когда я реализую все функции (создание, вывод) непосредственно в коде. Но когда я создал класс (так было легче для работы) он перестал выводить РУССКИЙ текст, а всё остальное (в том числе и русские цифры) выводит.
Объясните мне пожалуйста, ПОЧЕМУ??? :-(
Заранее большое спасибо :r

Автор:  MagicWolf [ 02 дек 2005 16:21 ]
Заголовок сообщения: 

Русских цифр нет, наверно это оговорка. Русский текст не выводит из того что не правильно выбрана кодовая страница, скорее всего. Хотя исходник для наглядности бы не помешал.

Автор:  DDMZ [ 02 дек 2005 18:42 ]
Заголовок сообщения: 

Может быть вы используете CHAR вместо BYTE (UNSIGNED CHAR)?
Потому символы с кодом выше 127 невыводятся

Автор:  BAPBAP [ 05 дек 2005 21:05 ]
Заголовок сообщения: 

Спасибо, что обсудили, но... Я написал, что всё работает (и выводиться русский текст), когда функция вывода текста оформлена как ОБЫКНОВЕННАЯ функция. Но русский текст перестал выводиться когда я СОЗДАЛ КЛАСС CText, в котором есть функция DrawText для вывода текста в окно. Хочу заметить, что код функции вывода текста моего класса CText.DrawText () АБСОЛЮТНО такой же, как и обыкновенной функции (я его просто скопировал :D).
Я не жадный :) , мог бы вставить сюда текст, который я скопировал из 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 ! :evil:

Страница 1 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/