开源项目之C++界面库 GLUI
GLUI是一个C++界面库,它提供了buttons, checkboxes, radio buttons, 等常用控件,以及OPENGL支持。GLUI界面系统依赖于GLUT来处理窗口、和鼠标管理等,而绘制部分采用OPENGL绘制。工程如图:
这个库需要用到第三方GLUT工具库(已放到源码包中),给出了六个实例,开源库的原理就引用网上的资料了,接着介绍下实例是如何应用的。
窗体初始化
GLUI包含三个主要的类:
GLUI_Master_Object
GLUI
GLUI_Control
其中有且只有一个全局的GLUI_Master_Object对象GLUI_Master.所有的GLUI窗口的创建都必须通过这个对象.这可以让GLUI通过一个全局对象来追踪所有的窗口,方便窗口的管理.这里简单介绍一下如何使用GLUI创建和控制窗口.这里介绍的函数都属于GLUI_Master_Object和GLUI类.必须注意,任何GLUI_Master_Object类的成员函数都必须通过全局对象GLUI_Master来调用,而任何GLUI类的成员函数都必须通过GLUI指针来调用,并在使用GLUI指针之前,GLUI指针必须获取GLUI_Master.create_glui()的返回值.
如:
float version = GLUI_Master.get_version();
GLUI *glui_window = GLUI_Master.create_glui("GLUI");
glui_window->add_StaticText("Hello World!");
初始化:首先介绍使用GLUI创建和设置窗口的一下函数.get_version:返回当前GLUI的版本.
用法:float GLUI_Master_Object::get_version(void) 返回值:GLUI版本号
create_glui:创建一个新的窗口. 用法:
GLUI *GLUI_Master_Object::create_glui(char *name, int flags = 0, int x = -1, int y = -1)
参数:
name:GLUI窗口的名字.
flags:初始化标记,如果没有给出此参数则默认值为0,被定义为在当前版本中.
x,y:初始化窗口的坐标.此参数可以不给出,因为GLUI可以自动调整窗口大小以适应所有的控件.
返回值:
新的GLUI窗口的指针
create_glui_subwindow:
在已经存在的GLUT窗口中创建一个新的子窗口
用法:GLUI *GLUI_Master_Object::create_glui_subwindow(int window, int position)
参数:
window:新建GLUI窗口的父窗口(一个已经存在的GLUT窗口)的ID号.
position:子窗口相对于父窗口的位置,可以为以下的值:
GLUI_SUBWINDOW_RIGHT
GLUI_SUBWINDOW_LEFT
GLUI_SUBWINDOW_TOP
GLUI_SUBWINDOW_BOTTOM
(注:可以在同一个位置创建任意个数的子窗口,多个相同位置的子窗口会简单的相互叠加,如:两个子窗口都使用了GLUI_SUBWINDOW_TOP参数,这两个子窗口都会定位在父窗口之上,同时,第一个子窗口也会覆盖在第二个子窗口之上.)
返回值:
新建的子窗口的指针.
set_glutIdleFunc:
为GLUI注册一个标准的GLUT空闲回调函数.当GLUI处于空闲时,就会调用该注册的函数.GLUI会截获空闲事件用于自身过程处理,然后才把该事件送给GLUT应用程序.需要注意的是,在注册的空闲回调函数中,当前窗口并没有被定义,所以,如果要在空闲回调函数中向GLUT窗口获取或发送redisplay事件,则必须明确的在回调函数中指定当前窗口.
如:
int main_window;
void myGlutIdle(void)//被注册的空闲回调函数
{
if(glutGetWindow() != main_window)
{
glutSetWindow(main_window);
}
glutPostRedisplay();
}
用法:
void GLUI_Master_Object::set_glutIdleFunc(void (*f)(void))
参数:
f(void):被注册的空闲回调函数.
set_glutReshapeFunc
set_glutKeyboardFunc
set_glutMouseFunc
set_glutSpecialFunc
用法:
void GLUT_Master_Object::set_glutReshapeFunc(void (*f)(int width, int height));
void GLUT_Master_Object::set_glutKeyboardFunc(void (*f)(unsigned char key, int x, int y));
void GLUT_Master_Object::set_glutMouseFunc(void (*f)(int button, int state, int x,int y));
void GLUI_Master_Object::set_glutSpecialFunc(void (*f)(int key, int x, int y));
参数:
详见glut函数详解(9)--回调API
(这里的回调函数与GLUT中对应的回调函数用法相似)
set_main_gfx_window:
将一个GLUT窗口与一个GLUI窗口易做图,当这个GLUI窗口中的一个控件的值发生改变,则该GLUT窗口将会被重绘.
用法:
void GLUI::set_main_gfx_window(int window_id);
参数:
window_id:被绑定的GLUT窗口ID,此ID号可在GLUT窗口被创建时获得(即glutCreateWindow()的返回值),或通过glutGetWindow()的返回值获得.
窗体视口管理
视口管理:这里介绍使用GLUI结合OpenGL时,如何管理视口.get_viewport_area:
确定当前窗口可绘区域的位置和尺寸.这个函数一般在使用到GLUI子窗口时使用,因为子窗口必然会占据父窗口的一小块区域,而绘制在父窗口上的图形并不希望被子窗口覆盖,所以可以通过此函数调整视口的大小.此函数应该在GLUT的reshape callback function中调用.
用法:void GLUI_Master_Object::get_viewport_area(int *x, int *y, int *w, int *h);
参数:
x,y,w,h:该函数被调用后,就可获得当前窗口可绘区域的左上角坐标及其宽度和高度,然后可以根据这些数据通过调用glViewport()设置视口区域.
auto_set_viewport:
自动为当前窗口设置尺寸合适的视口
用法:
void GLUI_Master_Object::auto_set_viewport(void);
例子:
int x, y, w, h;
GLUI_Master.get_viewport_area(&x, &y, &w, &h);
glViewport(x, y, w, h);
以上三句的功能与下面一句等价.
GLUI_Master.auto_set_viewport();
窗体管理
窗口管理:当窗体创建之后可以通过下列函数对窗体进行管理
/********************************************************************/
get_glut_window_id:
返回一个GLUI窗口的窗口ID
用法:int GLUI::get_glut_window_id(void);
返回值:GLUI窗口的ID号
enable,disable:
使GLUI窗口可用或不可用,当一个GLUI窗口不可用时,其上的所有控件都不可用.
用法:
void GLUI::enable(void);
void GLUI::disable(void);
hide:
使GLUI窗口或子窗口隐藏.一个被隐藏的窗口或子窗口不能接受任何用户输入.
用法:void GLUI::hide(void);
show:
使一个被隐藏的窗口或子窗口可见.
用法:void GLUI::show(void);
close:
销毁一个GLUI窗口或子窗口.
用法:
void GLUI::close(void);
close_all:
销毁所有的GLUI窗口和子窗口.此函数应该被全局对象所调用如:GLUI_Master.close_all();
用法:void GLUI_Master_Object::close_all(void);
sync_live:
变量可以与控件相关联,该函数可以使一个GLUI窗口上的所有控件和与这些控件相关联的变量保持同步,也即:读取变量的值,然后根据该值设置与其相关联的控件,使该值在控件上反映出来
用法:void GLUI::sync_live(void);
sync_live_all:
使所有GLUI窗口上的所有控件与与其相关联的变量保持同步,这个函数必须通过全局对象调用,如:GLUI_Master.sync_live_all();
用法:void GLUI_Master_Object::sync_live_all(void);
控件
GLUI中,所有的控件都是源于GLUI_Control类,所以,他们的操作都非常相似.我们有两种方法创建控件:一种是使用add_control()直接将控件放在窗口之上,另一种是使用add_control_to
补充:软件开发 , C++ ,