除了汉字,一般情况下,128个ASCII码组成的对应关系足够满足我们绘制的文本需求。
因此可以在第一次调用绘制文本时,把这128个ASCII码字符加入到一个列表中,之后绘制时只需要调用即可。
#include <windows.h>
#include <gl/glut.h>
#include "string"
using namespace std;
void DrawString(string str)
{
static int isFirstCall = 1;
static GLuint lists;
if (isFirstCall)
{//第一次调用时 为每个ASCII字符生成一个显示列表
isFirstCall = 0;
//申请MAX__CHAR个连续的显示列表编号
lists = glGenLists(128);
//把每个字符的绘制命令装到对应的显示列表中
wglUseFontBitmaps(wglGetCurrentDC(), 0, 128, lists);
}
//调用每个字符对应的显示列表,绘制每个字符
for (int i = 0; i < str.length(); i++)
glCallList(lists + str.at(i));
}
void render(void)
{
glClear(GL_COLOR_BUFFER_BIT);//清空颜色缓冲池
glColor3f(1.0f, 1.0f, 0.3f);//设置绘图颜色
glRasterPos2f(0.3f, 0.3f);//设置文字位置
DrawString("~~~Happy 365 Day!~~~");
glutSwapBuffers();
glFlush();//刷新缓冲
}
void main(void)
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//设置显示模式
glutInitWindowSize(500, 500);//设置窗口大小
glutInitWindowPosition(200, 200);//设置窗口在屏幕上的位置
glutCreateWindow("矩形");//创建窗口并给出标题
glutDisplayFunc(render);//注册显示窗口时回调函数render
glClearColor(0.4f, 0.4f, 0.8f, 1.0f);//设置背景色
glutMainLoop();//处理操作系统等的消息,例如键盘、鼠标事件等
}