这是程序自带的例子 :) //使用 Glgooey的简单小例子 #include <cstdlib> #include <iostream> #define GLUT_DISABLE_ATEXIT_HACK #include <GL/glut.h> #include "glgooey/core/StandardException.h" #include "glgooey/core/Utils.h" #include "glgooey/core/Rectangle.h" #include "glgooey/WindowManager.h" #include "glgooey/FrameWindow.h" #include "glgooey/Button.h" #include "glgooey/Panel.h" #include "glgooey/EditField.h" #include "glgooey/ListBox.h" #include "glgooey/TimeManager.h" #include "glgooey/PropertyScheme.h" using namespace Gooey; int main_window; class Console : public FrameWindow { public: Console() : FrameWindow(Core::Rectangle(50, 50, 400, 400), 0, "Console"), panel_(Core::Rectangle(10, 10, 20, 20), 0), editField_(0, "Edit Field:"), listBox_(0, Core::Rectangle(0, 0, 600, 240)), doneButton_(0, "Done") { // 调用这个说明鼠标可以拖动之 enableMovement(); //disableMovement(); //设置编辑框尺寸 editField_.setSize(Core::Vector2(220, 30)); //给 list box加入字符串 for(int i = 0; i < 13; ++i) { listBox_.addString("testing" + Core::toString(i)); } // 设置按钮大小 doneButton_.setSize(Core::Vector2(55, 30)); //插槽连线 /* 当按钮被点击的时候,自动通知到 函数 doneButtonPressed */ doneButton_.pressed.connect(this, &Console::doneButtonPressed); editField_.returnPressed.connect(this, &Console::doneButtonPressed); //子控件的加入 panel_ .addChildWindow(&listBox_) .addChildWindow(&editField_) .addChildWindow(&doneButton_) ; //加入面板到窗口 setClientWindow(&panel_); // 控件布局 panel_.arrangeChildren(); } public: void doneButtonPressed() { // 获取编辑框字符 std::string str = editField_.text(); //加入字符到list box if(str != "") listBox_.addString(str); //编辑框置空 editField_.setText(""); std::cout<<"you pressed button..."<<std::endl; } private: //控件 Panel panel_; EditField editField_; ListBox listBox_; Button doneButton_; }; // 定义这个是为了方便 Console* console = 0; void myGlutIdle( void ) { if ( glutGetWindow() != main_window ) glutSetWindow(main_window); glutPostRedisplay(); } //鼠标响应 void myGlutMouse(int button, int state, int x, int y) { switch(button) { case GLUT_LEFT_BUTTON: if(state == GLUT_UP) WindowManager::instance().onLeftButtonUp(x, y); else WindowManager::instance().onLeftButtonDown(x, y); break; case GLUT_MIDDLE_BUTTON: if(state == GLUT_UP) WindowManager::instance().onMiddleButtonUp(x, y); else WindowManager::instance().onMiddleButtonDown(x, y); break; case GLUT_RIGHT_BUTTON: if(state == GLUT_UP) WindowManager::instance().onRightButtonUp(x, y); else WindowManager::instance().onRightButtonDown(x, y); break; } } void myGlutMotion(int x, int y) { WindowManager::instance().onMouseMove(x, y); } void myGlutKey(unsigned char key, int , int ) { WindowManager::instance().onChar(key); } void myGlutSpecial(int key, int , int ) { WindowManager::instance().onKeyDown(key); } //特殊按钮的检测 bool isShiftPressed() { return (glutGetModifiers() & GLUT_ACTIVE_SHIFT) != 0; } bool isAltPressed() { return (glutGetModifiers() & GLUT_ACTIVE_ALT) != 0; } bool isCtrlPressed() { return (glutGetModifiers() & GLUT_ACTIVE_CTRL) != 0; } void myGlutReshape( int x, int y ) { WindowManager::instance().applicationResized(x, y); glViewport( 0, 0, x, y ); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(90, 1, 1, 100); gluLookAt(2, 2, 2, 0, 0, 0, 0, 1, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glutPostRedisplay(); } void myGlutDisplay( void ) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); //调用窗口管理器的更新函数来更新渲染 WindowManager::instance().update(); glutSwapBuffers(); } void shutDown() { //从窗口管理器中移去类实例 WindowManager::instance().removeWindow(console); delete console; //GUI退出 WindowManager::instance().terminate(); } int main(int argc, char* argv[]) { atexit(shutDown); glutInit(&argc, argv); glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); glutInitWindowPosition( 50, 50 ); glutInitWindowSize( 450, 450 ); main_window = glutCreateWindow( "使用 Glgooey的例子" ); glutDisplayFunc ( myGlutDisplay ); glutReshapeFunc ( myGlutReshape ); glutIdleFunc ( myGlutDisplay ); glutMouseFunc ( myGlutMouse ); glutKeyboardFunc( myGlutKey ); glutSpecialFunc ( myGlutSpecial ); glutPassiveMotionFunc ( myGlutMotion ); glutMotionFunc ( myGlutMotion ); glClearColor( 0.0, 0.0, 0.0, .4f ); //初始化窗口管理器 WindowManager::instance().initialize("onewl.ttf", isShiftPressed, isAltPressed, isCtrlPressed); //GUI实例与其载入 console = new Console; WindowManager::instance().addWindow(console); //主循环 try { glutMainLoop(); } catch(std::exception& e) { std::cout << "Exception: " << e.what() << std::endl; std::cin.get(); } return 0; } 下面是我改造了的例子 只有一个按钮 //使用 Glgooey的简单小例子 #include <cstdlib> #include <iostream> #define GLUT_DISABLE_ATEXIT_HACK #include <GL/glut.h> #include "glgooey/core/StandardException.h" #include "glgooey/core/Utils.h" #include "glgooey/core/Rectangle.h" #include "glgooey/WindowManager.h" #include "glgooey/FrameWindow.h" #include "glgooey/Button.h" #include "glgooey/Panel.h" #include "glgooey/EditField.h" #include "glgooey/ListBox.h" #include "glgooey/TimeManager.h" #include "glgooey/PropertyScheme.h" using namespace Gooey; int main_window; class Console : public FrameWindow { public: Console() : FrameWindow(Core::Rectangle(50, 50, 400, 400), 0, "GaMor"), panel_(Core::Rectangle(50, 50, 60, 60), 0), doneButton_(0, "Done") { // 调用这个说明鼠标可以拖动之 enableMovement(); //disableMovement(); // 设置按钮大小 doneButton_.setSize(Core::Vector2(86, 80)); doneButton_.setText("BUTTON"); doneButton_.setPosition(Core::Vector2(70,70)); //插槽连线 /* 当按钮被点击的时候,自动通知到 函数 doneButtonPressed */ doneButton_.pressed.connect(this, &Console::doneButtonPressed); //子控件的加入 panel_.addChildWindow(&doneButton_) ; //加入面板到窗口 setClientWindow(&panel_); // 控件布局 panel_.arrangeChildren(); } public: void doneButtonPressed() { std::cout<<"you pressed button..."<<std::endl; } private: //控件 Panel panel_; Button doneButton_; }; // 定义这个是为了方便 Console* console = 0; void myGlutIdle( void ) { if ( glutGetWindow() != main_window ) glutSetWindow(main_window); glutPostRedisplay(); } //鼠标响应 void myGlutMouse(int button, int state, int x, int y) { switch(button) { case GLUT_LEFT_BUTTON: if(state == GLUT_UP) WindowManager::instance().onLeftButtonUp(x, y); else WindowManager::instance().onLeftButtonDown(x, y); break; case GLUT_MIDDLE_BUTTON: if(state == GLUT_UP) WindowManager::instance().onMiddleButtonUp(x, y); else WindowManager::instance().onMiddleButtonDown(x, y); break; case GLUT_RIGHT_BUTTON: if(state == GLUT_UP) WindowManager::instance().onRightButtonUp(x, y); else WindowManager::instance().onRightButtonDown(x, y); break; } } void myGlutMotion(int x, int y) { WindowManager::instance().onMouseMove(x, y); } void myGlutKey(unsigned char key, int , int ) { WindowManager::instance().onChar(key); } void myGlutSpecial(int key, int , int ) { WindowManager::instance().onKeyDown(key); } //特殊按钮的检测 bool isShiftPressed() { return (glutGetModifiers() & GLUT_ACTIVE_SHIFT) != 0; } bool isAltPressed() { return (glutGetModifiers() & GLUT_ACTIVE_ALT) != 0; } bool isCtrlPressed() { return (glutGetModifiers() & GLUT_ACTIVE_CTRL) != 0; } void myGlutReshape( int x, int y ) { WindowManager::instance().applicationResized(x, y); glViewport( 0, 0, x, y ); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(90, 1, 1, 100); gluLookAt(2, 2, 2, 0, 0, 0, 0, 1, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glutPostRedisplay(); } void myGlutDisplay( void ) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); //调用窗口管理器的更新函数来更新渲染 WindowManager::instance().update(); glutSwapBuffers(); } void shutDown() { //从窗口管理器中移去类实例 WindowManager::instance().removeWindow(console); delete console; //GUI退出 WindowManager::instance().terminate(); } int main(int argc, char* argv[]) { atexit(shutDown); glutInit(&argc, argv); glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); glutInitWindowPosition( 50, 50 ); glutInitWindowSize( 450, 450 ); main_window = glutCreateWindow( "使用 Glgooey的例子" ); glutDisplayFunc ( myGlutDisplay ); glutReshapeFunc ( myGlutReshape ); glutIdleFunc ( myGlutDisplay ); glutMouseFunc ( myGlutMouse ); glutKeyboardFunc( myGlutKey ); glutSpecialFunc ( myGlutSpecial ); glutPassiveMotionFunc ( myGlutMotion ); glutMotionFunc ( myGlutMotion ); glClearColor( 0.0, 0.0, 0.0, .4f ); //初始化窗口管理器 WindowManager::instance().initialize("onewl.ttf", isShiftPressed, isAltPressed, isCtrlPressed); //GUI实例与其载入 console = new Console; WindowManager::instance().addWindow(console); //主循环 try { glutMainLoop(); } catch(std::exception& e) { std::cout << "Exception: " << e.what() << std::endl; std::cin.get(); } return 0; }