opengl字体

来源:互联网 发布:眼睛红血丝 知乎 编辑:程序博客网 时间:2024/04/30 12:56

英文字体显示:

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();

初学,网上书上看的,留下来供大家参考。

原创粉丝点击