英文字体显示:
void GLfont::BuildFontGL(GLvoid) // 建立位图字体(Bitmap Fonts)
{
HFONT newFont; // 用以保存新的字体对象
HFONT oldFont; // 用以保存原字体对象
base = glGenLists(256); // 存储256个字符
newFont =::CreateFont(-18, // 字体的高度
0, // 字体的宽度
0, // 旋转的角度
0, // 定位角度
FW_THIN, // 字体的粗细
FALSE, // 斜体?
FALSE, // 下划线?
FALSE, // 删除线?
ANSI_CHARSET, // 字符集
OUT_TT_PRECIS, // 输出精度
CLIP_DEFAULT_PRECIS, // 裁减精度
ANTIALIASED_QUALITY, // 输出质量
FF_DONTCARE|DEFAULT_PITCH, // 间距和字体族
"Tahoma"); // 字体名称
oldFont = (HFONT)SelectObject(::GetDC(NULL), newFont); // 选进设备描述表
wglUseFontBitmaps(::GetDC(NULL), 0, 256, base); // 建立256个字符
SelectObject(::GetDC(NULL), oldFont); // 恢复设备描述表
DeleteObject(newFont); // 删除新字体
}
GLvoid GLfont::KillFontGL(GLvoid) // 删除保存字体的显示表
{
glDeleteLists(base, 256); // 删除256个字符
}
GLvoid GLfont::glPrint(const char *fmt, ...) // 建立Print函数
{
char text[256]; // 用以保存格式化后的字符串
va_list ap; // 指向参数列表的指针
if (fmt == NULL) // 没有可输出的字符?
return; // 返回
va_start(ap, fmt); // 遍历字符串,查找变量
vsprintf(text, fmt, ap); // 将变量转换为显示的数字
va_end(ap); // 结果保存在text内
glPushAttrib(GL_LIST_BIT); // 显示表状态入栈
glListBase(base); // 显示表偏移量
glCallLists((int)strlen(text), GL_UNSIGNED_BYTE, text); // 绘制字符串
glPopAttrib(); // 显示表状态出栈
}
使用:
GLfont font;
font.BuildFontGL();
glRasterPos2f(1.0,0.0);
glColor3f(1,0,0);
font.glPrint("懒猪");
中文字体显示:
void GLfont::CreateFont(char *facename, int height, int weight, bool italic,bool underline,bool strikeout)
{
LOGFONT lf;
lf.lfHeight = height;
lf.lfWidth = 0;
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfWeight = weight;
lf.lfItalic = italic;
lf.lfUnderline = underline;
lf.lfStrikeOut = strikeout;
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfOutPrecision = OUT_TT_PRECIS;
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lf.lfQuality = PROOF_QUALITY;
lf.lfPitchAndFamily = VARIABLE_PITCH | TMPF_TRUETYPE | FF_MODERN;
strcpy(lf.lfFaceName,facename);
// 创建字体
m_hFont = CreateFontIndirect(&lf);
}
void GLfont::ShowText(int x, int y, LPCTSTR lpszText)
{
// 保存原投影矩阵,将投影矩阵设为平行投影
glMatrixMode( GL_PROJECTION );
glPushMatrix();
glLoadIdentity();
glOrtho( 0, 640, 0, 480, -1, 1 );
// 保存原模型变换矩阵,平移至( x, y )
glMatrixMode( GL_MODELVIEW );
glPushMatrix();
glLoadIdentity();
RECT rect;
GetClientRect(GetActiveWindow(),&rect);
glTranslatef(x, float(rect.bottom-rect.top-35-y), 0 );
HBITMAP hbitmap;
BITMAP bm;
SIZE size;
UCHAR* pBmpBits;
HFONT hOldFont;
HDC hdc = wglGetCurrentDC();
hOldFont = (HFONT)SelectObject(hdc, m_hFont);
::GetTextExtentPoint32(hdc, lpszText, strlen(lpszText), &size);
hbitmap = CreateBitmap(size.cx, size.cy,1, 1, NULL);
HDC hMemDC = ::CreateCompatibleDC(hdc);
if(hMemDC)
{
HBITMAP hPrevBmp = (HBITMAP)SelectObject(hMemDC,hbitmap);
HFONT hPrevFont = (HFONT)SelectObject(hMemDC, m_hFont);
SetBkColor(hMemDC, RGB(0, 0, 0));
SetTextColor(hMemDC, RGB(255, 0, 0));
SetBkMode(hMemDC, OPAQUE);
TextOut(hMemDC, 0, 0, lpszText, strlen(lpszText));
// copy GDI bitmap to DIB
SelectObject(hdc,hbitmap);
GetObject(hbitmap, sizeof(bm), &bm);
size.cx = (bm.bmWidth + 31) & (~31);
size.cy = bm.bmHeight;
int bufsize = size.cy * (((bm.bmWidth + 31) & (~31)) /8);
pBmpBits = new UCHAR[bufsize];
memset(pBmpBits, 0, sizeof(UCHAR)*bufsize);
struct {
BITMAPINFOHEADER bih;
RGBQUAD col[2];
}bic;
BITMAPINFO *binf = (BITMAPINFO *)&bic;
binf->bmiHeader.biSize = sizeof(binf->bmiHeader);
binf->bmiHeader.biWidth = bm.bmWidth;
binf->bmiHeader.biHeight = bm.bmHeight;
binf->bmiHeader.biPlanes = 1;
binf->bmiHeader.biBitCount = 1;
binf->bmiHeader.biCompression = BI_RGB;
binf->bmiHeader.biSizeImage = bufsize;
binf->bmiHeader.biXPelsPerMeter = 1;
binf->bmiHeader.biYPelsPerMeter = 1;
binf->bmiHeader.biClrUsed = 0;
binf->bmiHeader.biClrImportant = 0;
::GetDIBits(hdc, hbitmap, 0, bm.bmHeight, pBmpBits, binf,DIB_RGB_COLORS);
SelectObject(hMemDC, hPrevBmp);
}
::DeleteDC(hMemDC);
// delete font from DC
SelectObject(hdc, hOldFont);
// display text
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glRasterPos2i(1,20);
glBitmap(size.cx, size.cy, 0.0, 2.0, size.cx+2.0f, 0.0, pBmpBits);
delete pBmpBits;
// 恢复投影矩阵和模型变换矩阵
glMatrixMode( GL_PROJECTION );
glPopMatrix();
glMatrixMode( GL_MODELVIEW );
glPopMatrix();
}
初学,网上书上看的,留下来供大家参考。