Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Текст в OpenGl


Автор: Vizor 12.3.2006, 17:34
Помогите пожалуйста вывести русский текст с использованием UNICODE. Желательно исходный код.

Автор: DigitalDummy 15.4.2006, 06:37
А что именно хотите узнать?
  • у Вас есть строка Unicode с Русскими символами и есть Русские буквы в шрифте, но непонятно, как из Unicode строки их подставить для вывода...
  • или просто не понятно как вообще что-то выводить как текст в OpenGL.
??? smile

Автор: Andreyexe 22.4.2006, 20:43
Цитата

или просто не понятно как вообще что-то выводить как текст в OpenGL.

Можна-можна здесь посмотри www.mirgames.ru 

Автор: DigitalDummy 2.5.2006, 22:19
Надеюсь, Вы не против, если для ответа я приведу исходный код, который Вы написали мне в личном сообщении...

Код

GLvoid CTextOpenGl::CreateFont(HDC hDC)
{
    CFont font;
    base = glGenLists(256);
    font.CreateFont(-5, 0, 0, 0, FW_BOLD, false, false, false, ANSI_CHARSET,
        OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FF_DONTCARE | DEFAULT_PITCH,
        _T("Arial"));
    SelectObject(hDC, font);
    wglUseFontOutlines(hDC, 0, 255, base, 0.0f, 0.2f, WGL_FONT_POLYGONS, gmf);
}

GLvoid CTextOpenGl::glPrint(float x, float y, float z, wchar_t *string, void *font)
{
    wchar_t *c;
    glRasterPos3f(x, y, z);
    for (c=string; *c != '\0'; c++) 
    {
        glutBitmapCharacter(font, *c);
    }                           
}


Что у Вас в нём не верно?

Главная ошибка в том, что текст в формате Unicode отличается от текста формата ANSI тем, что имеет размер символа WORD (два байта), а не один! То есть, вариантов символов в Unicode тексте намного больше, чем 256! При этом, для вывода текста в OpenGL Вы создаёте набор только из 256 символов с помощью функции wglUseFontOutlines которого явно не хватит для того, чтобы отобразить все Unicode символы! Именно поэтому символы отображаются неправильно. Если Вам нужно использовать все возможные Unicode символы, то и создавать набор надо в количестве 65536 символов.

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

Ну ладно... Раз уж Вы пошли таким путём, то самое быстрое решение для Вас, как мне кажется, таково:

Во-первых, добавьте в свой код упращенный вариант функции для перевода Unicode-символа в ANSI-символ:
Код

#include <windows.h>   // этот модуль нужно тоже добавить, если он ещё не включен
...
...
char WideCharToChar(const wchar_t Value)
{
    char C[2];
    WideCharToMultiByte(CP_ACP, 0, &Value, 1, C, 1, 0, 0);   // здесь происходит перевод символа
    return C[0];
}
...

А в Вашем коде для вывода текста надо исправить функцию:
Код

GLvoid CTextOpenGl::glPrint(float x, float y, float z, wchar_t *string, void *font)
{
    wchar_t *c;
    glRasterPos3f(x, y, z);

    for (c=string; *c != '\0'; c++) 
    {
        char C = WideCharToChar(*c);   // перевод символа
        glutBitmapCharacter(font, C);
    }
}


Кстати, я никогда не пользовался функцией glutBitmapCharacter, поэтому не знаю сможет ли она правильно вывести на экран char символ и, может быть, потребуется конверсия типа в параметре. Если же текст всё ещё будет выводиться с ошибкой, сообщите и я напишу Вам замену для функции glutBitmapCharacter не прибегая к GLUT функциям.  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)