注意我用了wglUseFontBitmapsW函数,而不是wglUseFontBitmaps。wglUseFontBitmapsW是wglUseFontBitmaps函数的宽字符版本,它认为字符都占两个字节。因为这里使用了MultiByteToWideChar,每个字符其实是占两个字节的,所以应该用wglUseFontBitmapsW。 void CMFCOpenGLView::OnDraw(CDC* /*pDC*/) {
CMFCOpenGLDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码 glClearColor(0.0f,0.0f,0.7f,1.0f); //背景设置
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity();
gluLookAt(0,0,10,0,0, 0,0,1,0); glColor3f(1,0,0);
glRasterPos4s(-5,0,0,1); //指定位置 COpenGLFont font;
font.selectFont(48,DEFAULT_CHARSET, \黑体\ }
font.drawCNString(\汉字显示测试!chinese character show test!12345\glFinish();
SwapBuffers(wglGetCurrentDC());
(三)三维汉字的显示
在OpenGL中输出文本有两个函数:wglUseFontBitmaps和wglUseFontOutlines,前者用来输出2维文字,后者用来输出3维文字, 项目需要采用unicode编码方式. void COpenGLFont::draw3DString(_TCHAR* str) {
GLYPHMETRICSFLOAT pgmf[1]; DWORD dwChar; int list;
HDC hDC=wglGetCurrentDC();
}
for(size_t i=0;i<_tcslen(str);i++) { dwChar=str[i]; list=glGenLists(1); //取出一个字符的显示列表 wglUseFontOutlines(hDC,//设备环境句柄 dwChar,//要转换为显示列表的第一个字符 1, //要转换为显示列表的字符数 list,//显示列表的基数 0.0,//指定与实际轮廓的最大偏移量,显示精度 0.5,//在Z轴负方向的值,即厚度 0,//填充模式,为填充,为线框 NULL/*pgmf*/); //接受字符的地址 //绘制该字符的显示列表 glCallList(list); glDeleteLists(list, 1); }
void CMFCOpenGLView::OnDraw(CDC* /*pDC*/) {
CMFCOpenGLDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return;
// TODO: 在此处为本机数据添加绘制代码 glClearColor(0.0f,0.0f,0.7f,1.0f); //背景设置
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity();
gluLookAt(0,0,10,0,0,0,0,1,0); mydraw();//完成图形绘制 glColor3f(1,0,0);
glTranslatef(-3,2,-2); glScalef(1,2,1);
COpenGLFont font;
font.selectFont(10,DEFAULT_CHARSET, \宋体\ font.draw3DString(L\江西农业大学软件学院!\ glFinish();
SwapBuffers(wglGetCurrentDC()); }