Opengl显示文字
(一下代码复制到VC6.0编译器中将会只有一行,不会自动换行,代码很乱,解决办法是:将^l
替换为^p
)
1、显示ASCII:128个字符。
// ASCII字符总共只有0127,一共128种字符
#define MAX_CHAR      128
void drawString(const char* str)
{
    static int isFirstCall = 1;
    static GLuint lists;
    if( isFirstCall )
{
/
/ 如果是第一次调用,执行初始化
        // 为每一个ASCII字符产生一个显示列表
        isFirstCall = 0;
        // 申请MAX_CHAR个连续的显示列表编号
        lists = glGenLists(MAX_CHAR);
        // 把每个字符的绘制命令都装到对应的显示列表中
        wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, lists);
    }
    // 调用每个字符对应的显示列表,绘制每个字符
    for(; *str!='\0'; ++str)
        glCallList(lists + *str);}
//Opengl显示Hello World!
void display( void )
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0f, 0.0f, 0.0f);
    glLoadIdentity();
    glRasterPos2f(0.0f, 0.0f);
    drawString("Hello, World!");
    glutSwapBuffers();
}
2、指定字体的大小,类型与字符集
//三个参数字体大小,字符集,字体类型
void selectFont( int size, int charset, const char* face )
{
//创建指定字体
HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0,
        charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
        DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face);
//把创建的字体选入设备上下文,保存旧字体
    HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC(), hFont);
}
3、显示中文,Opengl的显示列表空间有限,无法存储庞大的中文库,对显示的中文,直接创建显示列表,显示中文,删除列表。英文字符只占用一个字节,而中文字符则占用两个字节,通过MultiByteToWideChar函数,可以转化为所有的字符都占两个字节。
void drawCNString( const char * str )
{
int len=0, i=0;
wchar_t * wstring;
HDC hDC=wglGetCurrentDC();
GLuint list=glGenLists( 1 );
//计算字符的个数
// 如果是双字节字符的(比如中文字符),两个字节才算一个字符
    // 否则一个字节算一个字符
ascii文字是啥for( i=0; str[i]!='\0'; i++ )
{
  //判断字符str[i]是否由两个字节组成
  if( IsDBCSLeadByte( str[i] ))
    i++;
  len++;
}
//将混合字符转化为宽字符
wstring=(wchar_t*)malloc((len+1)*sizeof(wchar_t));
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len );
wstring[len]=L'\0';
//逐个输出字符
for( i=0; i<len; i++ )
{
  wglUseFontBitmapsW( hDC, wstring[i], 1, list );
  glCallList( list );
}
//资源回收
free( wstring );
glDeleteLists( list, 1 );
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。