Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C++ opengl как отображать русский текст? 
V
    Опции темы
Owyn
  Дата 11.5.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 11.5.2009

Репутация: нет
Всего: нет



Код
GLuint base; // for bitmap font

GLvoid BuildFont(GLvoid)  
{
    //Мы создаем группу из 256 списков отображения, используя glGenLists(256). 
    //После того, как списки отображения созданы, 
    //переменная base будет содержать номер первого списка.
    hDC=wglGetCurrentDC();
    HFONT    font1;                                        
    HFONT    oldfont; 
  base = glGenLists(256);  // Выделим место для 256 символов 
  font1 = CreateFont(  -16,                // Высота фонта 
                        0,                // Ширина фонта
                        0,                // Угол отношения
                        0,                // Угол наклона
                        FW_NORMAL,        // Ширина шрифта
                        FALSE,            // Курсив
                        FALSE,            // Подчеркивание
                        FALSE,            // Перечеркивание
                        RUSSIAN_CHARSET,            // Идентификатор набора символов
                        OUT_DEFAULT_PRECIS,                // Точность вывода
                        CLIP_DEFAULT_PRECIS,        // Точность отсечения
                        PROOF_QUALITY,        // Качество вывода
                        FF_DONTCARE|VARIABLE_PITCH,  // Семейство и шаг
                        "Arial");            // Имя шрифта
  // Теперь мы выберем шрифт, привязав его к нашему DC, и построим 96 списков отображения, 
    // начиная с символа 32 (который является пробелом). 
    // Вы можете построить все 256 символов, если Вы хотите. 
    // Проверьте, что Вы удаляете все 256 списков отображения, 
    // когда Вы выходите из программы, и проверьте, что 
    // Вы задаете вместо 32 значение 0 и вместо 96 значение 255 в строке кода ниже.
    SelectObject(hDC, font1);        // Выбрать шрифт, созданный нами 
    wglUseFontBitmaps(hDC, 0, 256, base); // Построить 256 символов 
  
}

//////////////////////////////////////////////////////////////////////////////////////////////////
GLvoid KillFont(GLvoid)                                    
{
    (*orig_glDeleteLists)(base, 96);
}

//////////////////////////////////////////////////////////////////////////////////////////////////
void DrawText(float x, float y,float r, float g, float b, const char *fmt, ...)
{
    char        text[256];                                
    va_list        ap;                                        
    
    if (fmt == NULL)                                    
        return;                                            
    
    va_start(ap, fmt);                                    
    vsprintf(text, fmt, ap);                        
    va_end(ap);

    GLfloat  curcolor[4], position[4];
    (*orig_glPushAttrib)(GL_ALL_ATTRIB_BITS);
    (*orig_glGetFloatv)(GL_CURRENT_COLOR, curcolor);
    (*orig_glGetFloatv)(GL_CURRENT_RASTER_POSITION, position);
    (*orig_glDisable)(GL_TEXTURE_2D); 
    (*orig_glColor4f)(0.0f,0.0f,0.0f,1.0f);
    (*orig_glRasterPos2f)(x+1,y+1);

    //glPrint(text) - shadow
    (*orig_glPushAttrib)(GL_LIST_BIT);                            
    (*orig_glListBase)(base - 0);                                
    (*orig_glCallLists)(strlen(text), GL_UNSIGNED_BYTE, text);    
    (*orig_glPopAttrib)();                                        
    (*orig_glEnable)(GL_TEXTURE_2D); 

    (*orig_glDisable)(GL_TEXTURE_2D); 
    (*orig_glColor4f)(r,g,b,1.0f);
    (*orig_glRasterPos2f)(x,y);
    (*orig_glColor4f)(r,g,b,1.0f);

    //glPrint(text);
    (*orig_glPushAttrib)(GL_LIST_BIT);                            
    (*orig_glListBase)(base - 0);                                
    (*orig_glCallLists)(strlen(text), GL_UNSIGNED_BYTE, text);    
    (*orig_glPopAttrib)();                                        
    (*orig_glEnable)(GL_TEXTURE_2D); 

    //restore ogl shiat
    (*orig_glPopAttrib)();
    (*orig_glColor4fv)(curcolor);
    (*orig_glRasterPos2f)(position[0],position[1]);
}


если вызываю функцию вот так:
Код
DrawText(x,y+124,1.0f,1.0f,1.0f,"Русский текст: On");

то хорошо видно русский =)
*если кому надо

Это сообщение отредактировал(а) Owyn - 11.5.2009, 14:15
PM MAIL   Вверх
Alexeis
Дата 11.5.2009, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



  Это был вопрос или ответ? Или и то и другое?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
JanryMayers
Дата 20.7.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.6.2009
Где: Украина, г. Киев

Репутация: нет
Всего: нет



такой вопрос:
  Как к этому прикрутить getch, что бы текст рисавать с клавиатуры? smile 
PM MAIL   Вверх
Alexeis
Дата 20.7.2009, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



JanryMayers, обработка WM_KEYUP если на API.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
explorer
Дата 21.7.2009, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 26.2.2008

Репутация: нет
Всего: 2



Owyn, у меня к вам вопрос. 
Допустим, у меня ситуация, когда нужно вывести русский текст в две строки, но эти строки должны быть написаны разными шрифтами. Как быть в таком случае?
Я имею виду вот что: реально ли создать один шрифт такими списками, вывести строку с этим шрифтом, потом создать списками другой шрифт, и вывести другую строку, но так, чтобы первая не "теряла" свой шрифт?

Это сообщение отредактировал(а) explorer - 21.7.2009, 14:45
--------------------
 
PM MAIL WWW ICQ   Вверх
JanryMayers
Дата 21.7.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.6.2009
Где: Украина, г. Киев

Репутация: нет
Всего: нет



Alexeis
 Если я правильно понял мне нужно отлавливать в

Код

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
        {

        //

        WM_DOWN

        //
 
        WM_KEYUP
       
        //
        }
//
}


и WM_KEYUP и WM_DOWN?

Тогда вопрос: у меня при нажатии тильды отрисовывается консоль, но вовремя нажатия она не фиксируется а мерцает, как этого избежать?

также я знаю что надо как то milliseconds привязать, но не выходит то что нужно
вот кусочек кода

Код

void Update (DWORD milliseconds)
{
    //
    if (g_keys->keyDown [192] == TRUE) //если нажата тильда
            console = !console;
    //
}




Это сообщение отредактировал(а) JanryMayers - 21.7.2009, 13:36
PM MAIL   Вверх
JanryMayers
Дата 22.7.2009, 04:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.6.2009
Где: Украина, г. Киев

Репутация: нет
Всего: нет



Вновь Всех  Приветствую!!!

Код


GLvoid glPrint(const char *fmt, ...)
{
    char        text[256];
    va_list        ap;

    if (fmt == NULL)
        return;

    va_start(ap, fmt);
    vsprintf_s(text, fmt, ap);
    va_end(ap);

    glPushAttrib(GL_LIST_BIT);
    glListBase(base - 32);
    glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
    glPopAttrib();
}

int DrawGLScene(char zchar)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0f,0.0f,-1.0f);
    glColor3f(1.0f, 1.0f, 1.0f);
    glRasterPos2f(0.0f, 0.0f);
    glPrint("%1c", zchar);
    return TRUE;
}

//
//
//

SwapBuffers(hDC);
                        if (_kbhit()) 
                            {
                                int zn = _getch();
                                DrawGLScene(key[zn]);
                            }


Где ошибка не знаю..... smile 
PM MAIL   Вверх
JanryMayers
Дата 23.7.2009, 04:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.6.2009
Где: Украина, г. Киев

Репутация: нет
Всего: нет



Всё со всем разобрался) всем спасибо! smile  smile  smile 
PM MAIL   Вверх
gorby
Дата 29.9.2009, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: нет



И где была ошибка?
PM MAIL WWW Skype   Вверх
JanryMayers
Дата 16.3.2010, 06:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.6.2009
Где: Украина, г. Киев

Репутация: нет
Всего: нет



ошибка просто в том, что нужно было писать вот так

void Update (DWORD milliseconds)
{
    //
    if (g_keys->keyDown [192] == TRUE){
            console = !console;
            g_keys->keyDown [192] == FALSE; // вот этой строчки кода не хватало
    }
}

Это сообщение отредактировал(а) JanryMayers - 16.3.2010, 06:23
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0998 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.