Помогите с glut.
От: sergey__l  
Дата: 28.10.06 15:08
Оценка:
Здравствуйте, коллеги.

Возникла следующая проблема: по закрытию окна, которое было создано glutCreateWindow завершается вся программа, т. е. код после glutMainLoop() никогда не выполняется. В приведённом мною примере это строчка printf("Printf!!!");.
Подскажите пожалуйтса какой-нибудь способ получить управление после того, как пользователь закрыл окно.
Заранее благодарен.

#pragma comment ( lib,"opengl32.lib")
#pragma comment ( lib,"glu32.lib")
#pragma comment ( lib,"glut32.lib")

#include "glut.h"
//#include <GL/glut.h>
#include <stdio.h>

void Reshape(int width, int height)
{
  glViewport(0, 0, width, height);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D(-1, 1, -1, 1);
  glMatrixMode(GL_MODELVIEW);
}

void Draw(void)
{
  glClear(GL_COLOR_BUFFER_BIT);

  glColor3f(0.0f, 0.0f, 1.0f);
  glLineWidth(1);

  glBegin(GL_LINES);
    glVertex2f(0, 0.5f);  
    glVertex2f(0, -0.5f);  
  glEnd();

  glFlush();  
}

int main(int argc, char *argv[])
{
  glutInit(&argc, argv);
  glutInitWindowSize(400, 300);
  glutInitWindowPosition(100, 100);

  glutInitDisplayMode(GLUT_RGB);
  glutCreateWindow("Demo");

  glutReshapeFunc(Reshape);
  glutDisplayFunc(Draw);
  glClearColor(0, 0, 0, 0);
  glutMainLoop();
  printf("Printf!!!");//До этой строчки дело не доходит :( 
  getchar();
  return 0;
}
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re: Помогите с glut.
От: c-smile Канада http://terrainformatica.com
Дата: 28.10.06 17:38
Оценка:
Здравствуйте, sergey__l, Вы писали:

Наверное glutMainLoop(); исполняет exit(0); или типа того.
Есть же исходники оного? Смотри там.
Re[2]: Помогите с glut.
От: sergey__l  
Дата: 28.10.06 23:19
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Наверное glutMainLoop(); исполняет exit(0); или типа того.

CS>Есть же исходники оного? Смотри там.
Есть:
        if ( msg.message == WM_QUIT ) {
            exit( 0 );
        }

но мою проблему это не решает.

Мне собственно говоря надо, чтобы по нажатию на крестик вызывался только glutHideWindow, чтобы потом можно было вызвать glutShowWindow(из-вне). Подскажите как это сделать, плиз.

Проблема в том, что есть dll-ка, которая отображает 3D через glut, а загружает её java-машина и по нажатию на крестик в окне, созданном glut'ом убивается java-машина . Грузить её в отдельном потоке не помогает, т.к. exit(0) завершает процесс.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[3]: Помогите с glut.
От: demi США  
Дата: 30.10.06 16:34
Оценка:
CS>>Есть же исходники оного? Смотри там.
__>Есть:
__>
__>        if ( msg.message == WM_QUIT ) {
__>            exit( 0 );
__>        }
__>

__> но мою проблему это не решает.

atexit в помощь. Регистрирую функцию и делай в ней свои дела.
Не стыдно попасть в дерьмо, стыдно в нём остаться!
Re[4]: Помогите с glut.
От: sergey__l  
Дата: 30.10.06 18:55
Оценка:
Здравствуйте, demi, Вы писали:

D>atexit в помощь. Регистрирую функцию и делай в ней свои дела.


Попробовал:
void func(){
    printf("AAAVVV");
    getchar();
}
int main(int argc, char *argv[])
{
    ....
  atexit(func);
  glutMainLoop();
    return 0;
}


Не работает(по закрытию крестиком в консоль ничего не попадает).
Может я что-то не так делаю?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[5]: Помогите с glut.
От: Аноним  
Дата: 31.10.06 12:53
Оценка:
__>Не работает(по закрытию крестиком в консоль ничего не попадает).
__>Может я что-то не так делаю?

Наверное это потому, что если был вызван exit то в консоль ты уже ничего не можешь вывести?
Re[6]: Помогите с glut.
От: Antikrot  
Дата: 31.10.06 16:14
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Наверное это потому, что если был вызван exit то в консоль ты уже ничего не можешь вывести?


Не, это потому что exit(0) происходит в другом модуле (glut32.dll), и до тех функций что зарегистрированы в главной программе дело просто не доходит (atexit использует heap, а она будет разной для разных модулей)

А при нормальных условиях вполне таки можно в консоль писать после exit
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[5]: Помогите с glut.
От: demi США  
Дата: 31.10.06 17:02
Оценка:
Здравствуйте, sergey__l, Вы писали:

__>Здравствуйте, demi, Вы писали:


__>Не работает(по закрытию крестиком в консоль ничего не попадает).

__>Может я что-то не так делаю?

ЭЭЭх ну сделай тогда чудовищную весчЪ Найди окно FindWindow() по тексту в заголовке, на и замени WNDPROC на свою такого содержания:


LRESULT CALLBACK GLUT_Hack(HWND hwnd, UINT msg, LPARAM lp, WPARAM wp)
{
  if (msg == WM_CLOSE)
  {
     printf("Ha ha glut! Ja kruche!\n");
     //free mem and etc
  }
  //Send it to glut...
  return GLUT_MsgProc(hwnd, msg, lp, wp);
}
Не стыдно попасть в дерьмо, стыдно в нём остаться!
Re[6]: Помогите с glut.
От: sergey__l  
Дата: 31.10.06 17:54
Оценка:
Здравствуйте, demi, Вы писали:

D>ЭЭЭх ну сделай тогда чудовищную весчЪ Найди окно FindWindow() по тексту в заголовке, на и замени WNDPROC на свою


Спасибо за ответ!

Я почти так и сделал(повесил hook на поток и обработал WM_QUIT), но мне этот способ не очень нравится завязкой на Win API. Glut ведь был сделан типа для переносимости и всё такое, а приходится использовать вещи, зависимые от ОС
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[7]: Помогите с glut.
От: dotidot Россия  
Дата: 03.11.06 18:34
Оценка:
Здравствуйте, sergey__l, Вы писали:
...

попробуй freeglut. он даже почти бинарно совместим со старым glut + в нем есть расширения как раз для решения твоей проблемы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.