glut程序
8.多窗口且子窗口能够跟随reshape的变化而变化
///
#include
#include
///
int winWidth, winHeight; // <<=======NEW!!!
int mainWinID; // <<=======NEW!!!
int subWinID0(0), subWinID1(0), subWinID2(0), subWinID3(0); // <<=======NEW!!!
///
void myMainWinDraw(void);
void myMainWinReshape(int _width, int _height);
void mySubWinDrawSphere(void);
void mySubWinDrawTeapot(void);
void mySubWinDrawTorus(void);
void mySubWinDrawIcos(void);
///
int main(int argc,char** argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400, 400);
glutInitWindowPosition(0, 0);
mainWinID = glutCreateWindow("Hello");
glutDisplayFunc(myMainWinDraw);
glutReshapeFunc(myMainWinReshape);
glutMainLoop();
return 0;
}
///
void myMainWinReshape(int _width, int _height) {
winWidth = _width; // <<==============NEW!!!
winHeight = _height; // <<==============NEW!!!
if (subWinID0) // <<==============NEW!!!
glutDestroyWindow(subWinID0); // <<==============NEW!!!
subWinID0 = glutCreateSubWindow(mainWinID, 0, 0, // <<=======NEW!!!
winWidth>>1, winHeight>>1);
glutDisplayFunc(mySubWinDrawSphere); // <<=======NEW!!!
if (subWinID1) {
glutDestroyWindow(subWinID1);
}
subWinID1 = glutCreateSubWindow(mainWinID, winWidth>>1, 0,
winWidth>>1, winHeight>>1);
glutDisplayFunc(mySubWinDrawTeapot);
if (subWinID2)
glutDestroyWindow(subWinID2);
subWinID2 = glutCreateSubWindow(mainWinID, 0, winHeight>>1,
winWidth>>1, winHeight>>1);
glutDisplayFunc(mySubWinDrawTorus);
if (subWinID3)
glutDestroyWindow(subWinID3);
subWinID3 = glutCreateSubWindow(mainWinID, winWidth>>1, winHeight>>1,
winWidth>>1, winHeight>>1);
glutDisplayFunc(mySubWinDrawIcos);
}
///
void myMainWinDraw() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
///
void mySubWinDrawSphere(void) {
glClearColor(0.0, 0.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glRotatef(30, 1.0f, 1.0f, 1.0f);
glutWireSphere(0.8f, 20, 20);
glFlush();
}
///
void mySubWinDrawTeapot(void) {
glClearColor(1.0, 1.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glutWireTeapot(0.5f);
glFlush();
}
///
void mySubWinDrawTorus(void) {
glClearColor(0.0, 1.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glutWireTorus(0.3f, 0.6f, 20, 30);
glFlush();
}
///
void mySubWinDrawIcos(void) {
glClearColor(1.0, 0.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glRotatef(30, 1.0f, 1.0f, 1.0f);
glutWireIcosahedron();
glFlush();
}
///
新增的知识点:
1.回调函数myMainWinReshape中:改变窗口大小时,先将原来子窗口销毁(如果存在的话),再重新产生新的子窗口。
2.glutDestroyWindow:销毁窗口
道理上是这个样子,但是我在实际运行过程中,拖动鼠标改变窗口大小时,出现了问题。
差不多是说,没有注册给窗口6的回调函数。可能和我这个freeglut有关系的。暂时没有解决。
9.可控制的子窗口显示
///
#include
#include
///
void myMainWinDraw(void);
void myMainWinReshape(int _width, int _height);
void myMainWinKeyboard(unsigned char _key, int _x, int _y);
void mySubWinDrawSphere(void);
void mySubWinDrawTeapot(void);
void mySubWinDrawTorus(void);
void mySubWinDrawIcos(void);
///
int winWidth, winHeight;
int mainWinID;
int subWinID0(0), subWinID1(0), subWinID2(0), subWinID3(0);
// <<================= NEW !!!!!!
bool isShowSubWin0(1), isShowSubWin1(1), isShowSubWin2(1), isShowSubWin3(1);
///
int main(int argc,char** argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400, 400);
glutInitWindowPosition(0, 0);
mainWinID = glutCreateWindow("Hello");
glutDisplayFunc(myMainWinDraw);
glutReshapeFunc(myMainWinReshape);
glutKeyboardFunc(myMainWinKeyboard);
glutMainLoop();
return 0;
}
///
void myMainWinReshape(int _width, int _height) {
winWidth = _width;
winHeight = _height;
if (subWinID0) {
glutDestroyWindow(subWinID0);
subWinID0 = 0;
}
if (isShowSubWin0) {
subWinID0 = glutCreateSubWindow(mainWinID, 0, 0, winWidth>>1, winHeight>>1);
glutDisplayFunc(mySubWinDrawSphere);
}
if (subWinID1) {
glutDestroyWindow(subWinID1);
subWinID1 = 0;
}
if (isShowSubWin1) {
subWinID1 = glutCreateSubWindow(mainWinID, winWidth>>1, 0,
winWidth>>1, winHeight>>1);
glutDisplayFunc(mySubWinDrawTeapot);
}
if (subWinID2) {
glutDestroyWindow(subWinID2);
subWinID2 = 0;
}
if (isShowSubWin2) {
subWinID2 = glutCreateSubWindow(mainWinID, 0, winHeight>>1,
winWidth>>1, winHeight>>1);
glutDisplayFunc(mySubWinDrawTorus);
}
if (subWinID3) {
glutDestroyWindow(subWinID3);
subWinID3 = 0;
}
if (isShowSubWin3) {
subWinID3 = glutCreateSubWindow(mainWinID, winWidth>>1, winHeight>>1,
winWidth>>1, winHeight>>1);
glutDisplayFunc(mySubWinDrawIcos);
}
}
///
void myMainWinDraw() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
// <<<<<===================== NEW !!!!!
#define RENEW myMainWinReshape(winWidth, winHeight);\
glutPostRedisplay();\
//myMainWinDraw();
///
void myMainWinKeyboard(unsigned char _key, int _x, int _y) {
switch (_key) {
case 'a':
isShowSubWin0 = !isShowSubWin0;
RENEW;
break;
case 's':
isShowSubWin1 = !isShowSubWin1;
RENEW;
break;
case 'z':
isShowSubWin2 = !isShowSubWin2;
RENEW;
break;
case 'x':
isShowSubWin3 = !isShowSubWin3;
RENEW;
break;
case 'f':
// <<================== NEW !!!
glutFullScreen();
break;
case 'v':
// <<================== NEW !!!
glutSetWindow(mainWinID);
glutReshapeWindow(300, 300);
break;
case 'w':
// <<================== NEW !!!
glutSetWindow(subWinID0);
glutReshapeWindow(100, 100);
}
}
#undef RENEW // <<================== NEW !!!
///
void mySubWinDrawSphere(void) {
glClearColor(0.0, 0.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glRotatef(30, 1.0f, 1.0f, 1.0f);
glutWireSphere(0.8f, 20, 20);
glFlush();
}
///
void mySubWinDrawTeapot(void) {
glClearColor(1.0, 1.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glutWireTeapot(0.5f);
glFlush();
}
///
void mySubWinDrawTorus(void) {
glClearColor(0.0, 1.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glutWireTorus(0.3f, 0.6f, 20, 30);
glFlush();
}
///
void mySubWinDrawIcos(void) {
glClearColor(1.0, 0.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glRotatef(30, 1.0f, 1.0f, 1.0f);
glutWireIcosahedron();
glFlush();
}
///
引入bool量isShowSubWin0, isShowSubWin1, isShowSubWin2, isShowSubWin3来判断是否应该显示该子窗口。