Opengl显示文字
(一下代码复制到VC6.0编译器中将会只有一行,不会自动换行,代码很乱,解决办法是:将^l
替换为^p
替换为^p
)
1、显示ASCII:128个字符。
// ASCII字符总共只有0到127,一共128种字符
#define MAX_CHAR 128
void drawString(const char* str)
{
static int isFirstCall = 1;
static GLuint lists;
if( isFirstCall )
{
/
// ASCII字符总共只有0到127,一共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);
// 为每一个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();
}
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);
//把创建的字体选入设备上下文,保存旧字体
//三个参数字体大小,字符集,字体类型
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++ )
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 );
//判断字符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 );
}
//资源回收
free( wstring );
glDeleteLists( list, 1 );
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论