Пример#2 Создание основного и вторичного окна
#include<glut.h>
float alpha;
int WindW, WindH;
bool drawWin2D;
int mainWindow, subWindow;
void InitMainGL(int Width, int Height)
{
glViewport(0, 0, Width, Height);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLdouble wh=200;
glOrtho(-wh, wh, -wh, wh, -wh, wh);
glMatrixMode(GL_MODELVIEW);
WindW = Width;
WindH = Height;
}
void InitSubGL(GLsizei Width, GLsizei Height)
{
glViewport(0, 0, Width, Height);
glMatrixMode(GL_PROJECTION);
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-50, 50, -50, 50);
glMatrixMode(GL_MODELVIEW);
WindW = Width;
WindH = Height;
}
void drawSubWin()
{
glutSetWindow(subWindow);
glColor3f( 0, 0, 0 );
glBegin(GL_LINE_LOOP);
glVertex2d(0,0);
glVertex2d(0,10);
glVertex2d(10,10);
glVertex2d(10,0);
glEnd();
glFlush();
}
void renderSubScene()
{
glutSetWindow(subWindow);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
if (!drawWin2D) glutHideWindow();
else if (drawWin2D){
glutShowWindow();
glColor3f(0.0, 1.0, 1.0);
drawSubWin();
}
glFlush();
glutSwapBuffers();
}
void drawMainWin()
{
glutSetWindow(mainWindow);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glRotatef(alpha, 0.0f, 0.0f, 1.0f);
alpha += 0.5;
if (alpha > 360) alpha = 0;
glutSolidCube(100);
glFlush();
glutSwapBuffers();
}
void renderSceneAll(void)
{
drawMainWin();
renderSubScene();
glFlush();
}
void mouse(int button,int state,int x,int y)
{
switch(button)
{
case GLUT_MIDDLE_BUTTON:
exit(0);
break;
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN) drawWin2D=!drawWin2D;
break;
default: break;
}
}
void Reshape(int width, int height) // Reshape function
{
glViewport(0, 0, width, height);
WindW = width;
WindH = height;
}
void main(int argc, char *argv[]) {
WindW = 800;
WindH = 600;
glutInit(&argc, argv);
glutInitWindowSize(WindW, WindH);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(150,150);
mainWindow = glutCreateWindow("window");
glutInitWindowPosition(150,150);
glutReshapeFunc(InitMainGL);
glutDisplayFunc(drawMainWin);
glutMouseFunc(mouse);
glutIdleFunc(renderSceneAll);
subWindow = glutCreateSubWindow(mainWindow, 0, 0, 300, 200);
glutReshapeFunc(InitSubGL);
glutDisplayFunc(renderSubScene);
glutMainLoop();
}
Для самостоятельной работы:
1. Создайте второстепенное окно в правом верхнем углу главного окна и разработайте метод закрытия путем нажатия мышью в заданную область окна.
2. Разделите главное окно на 2, 4, 6 или 8 дочерних окон.