解决方法:
1.freeglut 或者 openglut ? 可以解决直接退出和无限循环的问题,有尝试过,在中文显示方面出了点问题就没有采用下去了,仍锁定用glut。
2.采用修改过的glut库,网上有一个流传较广的修改版本,添加了一个 glutWMCloseFunc(WindowClosedFunc_Main)的函数,可以注册点击关闭图标之后调用的函数。
3.自己修改glut的源码,可以参考这:http://www.sjbaker.org/steve/software/glut_hack.html,尝试过,但是没有成功,编译glut源码的时候可能会遇到某些错误,仔细看出错的文件都是glut自带的一些例子文件,可以把这些例子文件从工程中删除掉来使其编译通过
最后我采用的是第2个方法,另外,glut没有对滚轮的支持,有修改过支持滚轮的版本,但此版本又不支持注册关闭窗口时的函数,所谓不可兼得,要是哪位有个综合的版本,希望告知一下,甚是感谢。
□
然后是Anttweakbar,非常漂亮的菜单库,和glut能结合得很好,用起来很方便,效果惊人,缺点是菜单好像只支持英文。
这是官网上提供的一些例子程序截图: http://www.antisphere.com/Wiki/tools:anttweakbar:gallery
在程序里面使用Anttweakbar时要注意当窗口大小改变时,要通知Anttweakbar窗口大小有改变,可以在你的void Resize( GLsizei iWidth, GLsizei iHeight ) 函数里面添加: TwWindowSize(iWidth, iHeight);
Anttweakbar也存在有问题,当有多个glut窗口时,两个窗口之间的切换可能导致菜单显示出错,甚至造成你的程序出现贴图错误,每次需重新加载贴图,始终不是解决之道,最新的Anttweakbar版本支持同一窗口内的多个subwindow,但是对于多个独立的窗口仍是会出现贴图错误,不知道是否是我没掌握正确的方法,我现在的做法是避免创建多个窗口。
编译AntTweakbar的时候可能会出现提示字符串的错误:
_snprintf(_SummaryString, _SummaryMaxLength, "V={%.2f,%.2f,%.2f} A=%.0f?, ext->Vx, ext->Vy, ext->Vz, ext->Angle)")
那是vs转换版本时的原因?总之在上一句最后加个分号就好了,还有,编译的时候需要系统安装了D3D10的库。
□
最后是FLTK,很好的界面库,采用它的原因是因为能和glut与anttweakbar结合得很好,很关键一点在于支持中文菜单,前提是采用UTF8编码,FLTK 1.0的版本支持直接在VS软件里面输入中文来定义菜单,但是FLTK 1.3 就得采用函数转换一下编码,解决方法可以参考这几个页面:
http://blog.csdn.net/thy38/archive/2011/01/12/6132947.aspx
http://blog.sina.com.cn/s/blog_494e45fe0100092l.html
已有的glut程序可以很方便的装入FLTK的框架中,编译时候的一些问题,编译FLTK源码时,需要预先定义WIN32:
打开源码里面的vs工程时,FLTK的编译生成的文件有:fltk.lib; fltkforms.lib;fltkgl.lib;fltkimages.lib;fltkjpeg.lib;fltkpng.lib fltk,另外,在源码的FL_MENU.cxx文件中可以找到宏定义 LEADING, 其定义的是菜单栏项的高度,FLTK默认的菜单看上去有点挤,修改此处可以使其看上去更美观
在自己的工程中,glutinit()不再被需要,原有的include "glut.h" 要替换成 FL自带的glut.h文件, include <FL/glut.h>,原有的glut的一些功能函数可能会丢失,具体参考官方给出的文档。
在自己的工程使用FLTK:
如有报错,尝试 项目 ->属性 ->配置属性 -> c/c++ ->代码生成 ->运行时库 选择 ”多线程调试 DLL(/MDd)“ 。
对于FLTK 1.0 , 链接库中要加入 fltk.lib 和 ws2_32.lib comctl32.lib否则可能会报错:
fltk.lib(Fl_x.obj) : error LNK2019: 无法解析的外部符号 ___WSAFDIsSet@8,该符号在函数 "int __cdecl fl_wait(double)" (?fl_wait@@YAHN@Z) 中被引用
对于FLTK 1.3 和 FLTK 1.1, 链接库中要加入 fltk.lib 和 fltkgl.lib ws2_32.lib comctl32.lib 否则也可能会报错
FLTK官网上的例子程序截图,做得相当漂亮: http://www.fltk.org/applications/shots.php
□
说点其他的,支持glut的不错的界面库还有GLUI,但是Anttweakbar实在太好用了。
因为要制作中文的菜单,需要考虑中文支持的问题,考虑过MFC, .NET, QT之类,这里就出现了跨平台的问题,还有现有程序代码也要做较大的改动,现有程序的效率会受到影响。实际尝试过MFC,Anttweakbar在此框架下不能显示,也许是我的代码有错,总是最后放弃了MFC,锁定在了FLTK。暂时看来,OPENGL + GLUT + Anttweakbar + FLTK 这四者能结合得很好,并且是跨平台且开源,速度很快。