Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
1 / 1 / 1
Регистрация: 06.07.2011
Сообщений: 24

OpenGL Вывод текста

11.07.2011, 12:54. Показов 5263. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Более подходящего раздела не нашёл.

В OpenGL проблематично вывести обычный текст.

По книге NEHE взял такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
GLvoid BuildFont(GLvoid)  // Построение нашего растрового шрифта
{
  HFONT  font;            // Идентификатор фонта
 
  base = glGenLists(96);  // Выделим место для 96 символов ( НОВОЕ )
 
  font = CreateFont(  -24,        // Высота фонта ( НОВОЕ )
      0,        // Ширина фонта
      0,        // Угол отношения
      0,        // Угол Наклона
      FW_BOLD,      // Ширина шрифта
      FALSE,        // Курсив
      FALSE,        // Подчеркивание
      FALSE,        // Перечеркивание
      ANSI_CHARSET,      // Идентификатор набора символов
      OUT_TT_PRECIS,      // Точность вывода
      CLIP_DEFAULT_PRECIS,    // Точность отсечения
      ANTIALIASED_QUALITY,    // Качество вывода
      FF_DONTCARE|DEFAULT_PITCH,  // Семейство и Шаг
      L"Courier New");      // Имя шрифта
  SelectObject(hDC, font);        // Выбрать шрифт, созданный нами ( НОВОЕ )
 
  wglUseFontBitmaps(hDC, 32, 96, base); // Построить 96 символов начиная с пробела ( НОВОЕ )
}
 
GLvoid KillFont(GLvoid)            // Удаление шрифта
{
   glDeleteLists(base, 96);        // Удаление всех 96 списков отображения ( НОВОЕ )
}
 
 
GLvoid glPrint(const char *fmt, ...)        // Заказная функция "Печати" GL
{
  char    text[256];      // Место для нашей строки
  va_list    ap;          // Указатель на список аргументов
  if (fmt == NULL)     // Если нет текста
    return;            // Ничего не делать
 
  va_start(ap, fmt);           // Разбор строки переменных
    vsprintf(text, fmt, ap); // И конвертирование символов в реальные коды
  va_end(ap);                  // Результат помещается в строку
  glPushAttrib(GL_LIST_BIT);      // Протолкнуть биты списка отображения ( НОВОЕ )
  glListBase(base - 32);          // Задать базу символа в 32 ( НОВОЕ )
  glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); // Текст списками отображения ( НОВОЕ )
  glPopAttrib(); // Возврат битов списка отображения ( НОВОЕ )
}
Но он в моей программе не работает, а в примере работает.

Может быть у вас есть на примете хорошая функция?

В приложении работающий пример
Вложения
Тип файла: rar mn.rar (7.2 Кб, 120 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.07.2011, 12:54
Ответы с готовыми решениями:

OpenGL C++ вывод текста
Подскажите самый простой способ вывести текст в определенном месте.

OpenGL C++ вывод текста
Подскажите самый простой способ вывести текст в определенном месте.

Вывод текста OpenGL, C++
Здравствуйте! Имеется строка glPrint(“текст”); Подскажите пожалуйста, как будет выглядеть код, выводящий эту строку при помощи...

2
1 / 1 / 1
Регистрация: 06.07.2011
Сообщений: 24
11.07.2011, 13:41  [ТС]
В теме про DrawText() из этого раздела нашёл функцию


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
      RECT rect;
      HFONT hfontArial;
      HGDIOBJ oldfont;
      
      GetClientRect (hWnd, &rect);
      hfontArial = CreateFont (36, 0, FW_DONTCARE, FW_DONTCARE, FW_DONTCARE,
            FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, L"Arial");
      oldfont = SelectObject (hDC, hfontArial);
      SetTextColor (hDC, RGB(0, 0, 0));
      DrawText (hDC, L"DrawText", 8, &rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
      DeleteObject (hfontArial);
      ReleaseDC (hWnd, hDC);
Но вот в чём беда, текст лишь мигает.
Помещаю её в WinMain в бесконечный цикл (только там он "работает" - мигает).
Если разместить в WM_PAINT и вынести из switch-case
RECT rect;
HFONT hfontArial;
HGDIOBJ oldfont;

текст не выводится вообще.

Однако, даже когда текст лишь на миг появляется и исчезает снять его принтскрином не проблема (т.е. даже когда его нет он есть на шоте)
0
 Аватар для VadimTagil
54 / 44 / 11
Регистрация: 15.07.2011
Сообщений: 160
15.07.2011, 23:49
можно создать в окне OpenGL дочернее окно, например элемент упрпвления STATIC, и выводить текст в нем. Этот способ простой, но недостаток - нельзя избежать фона вокруг текста. У окна OpenGL надо установить стиль WS_CLIPCHILDREN чтобы не мигало.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.07.2011, 23:49
Помогаю со студенческими работами здесь

Вывод текста в OpenGL на C#
Использую TaoFramework для подключения OpenGL к студии. Проблемы с выводом текста в OpenGL, подскажите кто знает, как решить данную...

Вывод текста в OpenGL
Здравствуйте, у меня возник вопрос по поводу вывода текста в OpenGL. Я делаю все по книге Михаила Краснова, но при некоторых...

Вывод текста в opengl
Сварганил текстовый рендер, прошу на тестирование и жду рекомендаций. Необходим TaoFramework и Net Framework 4. Пояснений думаю не...

Вывод текста в OpenGL Delphi
Вывожу текст (пример из книги), но если символов больше одного, то они выводятся квадратами (пишу в Delphi XE 2)

Вывод текста в окно OpenGL - С++
Как вывести целое предложение или матрицу в окно OpenGL


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных выбран регистр накопления, в. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru