Opengl:显示中文改进版

Opengl:显示中文改进版
2010年07月09日
  由于对这方面不是特别了解,基本上结合别人的代码,再加些自己认为更好点的改进。
  #define MAX_CHAR 255
  #define TEXT_CENTER 0
  #define TEXT_LEFT 1
  #define TEXT_RIGHT 2
  HFONT CreateFont(char *facename, int height, int weight, bool italic,bool underline,bool strikeout)
  {
  LOGFONT lf;
  lf.lfHeight = height;
  lf.lfWidth = 100;
  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);
  // 创建字体
  return CreateFont( -24, // 字体的高度
  0, // 字体的宽度
  0, // 旋转的角度
  0, // 定位角度
  FW_BOLD, // 字体的粗细
  TRUE, // 斜体?
  FALSE, // 下划线?
  FALSE, // 删除线?
  GB2312_CHARSET, // 字符集
  OUT_TT_PRECIS, // 输出精度
  CLIP_DEFAULT_PRECIS, // 裁减精度
  ANTIALIASED_QUALITY, // 输出质量
  FF_DONTCARE|DEFAULT_PITCH, // 间距和字体族
  "宋体"); // 字体名称
  }
  struct FONTS // 保存轮廓字体
  {
  FONTS()
  {
  val = 0;
  }
  DWORD val; // 保存显示表的值(用来比较)
  GLuint listName; // 保存显示表的名称
  GLYPHMETRICSFLOAT gmf; // 保存字体的详细信息
  };
  void Show2DText(const char *str,SCoor coor,SColor color,int flag,double scale)
  {
  glDisable(GL_TEXTURE_2D);
  DWORD FTextList[MAX_CHAR];
  int m_iCount=strlen(str);
  static HFONT hFont=0;
  static map listmap;
  HDC hDC=wglGetCurrentDC();
  if(hFont==0)
  {
  hFont=CreateFont("隶书",800,800,0,0,0);
  SelectObject(hDC,hFont);
  }
  int i=0;
  int j=0,k=0;
  int ich;
  double width =0;
  glColor3d(color.r,color.g,color.b);
  while(i字体轮廓设备联系DC
  ich,//要转换为显示列表的第一个字符
  1,//要转换为显示列表的字符数
  font.listName,//显示列表的基数
  0.0f,//指定与实际轮廓的最大偏移量
  0.0,//0.15f,//在Z轴负方向的值
  WGL_FONT_POLYGONS, //指定显示列表线段或多边形
  &font.gmf);
  }
  width += listmap[ich].gmf.gmfCellIncX;
  }
  width*=scale;
  switch(flag)
  {
  case TEXT_CENTER:
  width = -width/2;
  break;
  case TEXT_LEFT:
  width = 0;
  break;
  case TEXT_RIGHT:
  width = -width;
  break;
  default :
  width=0;
  break;
  }
  glPushMatrix();
  glTranslated(coor.x,coor.y,0);
  glPushAttrib(GL_LIST_BIT);
  {
  glTranslated(width,0,0);
  glScaled(scale,scale,1);
  for(k=0;k<j;k++) // 遍历字符串
  {
  glCallList(listmap[FTextList[k]].listName); // 绘制出字符
  }
  }
  glPopAttrib();
  glPopMatrix();
  glEnable(GL_TEXTURE_2D);
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值