OpenGL 汉字显示 请高手们 帮忙C++ 转换为 Delphi,能让我们初学者学习一下。
我不知道OpenGL 中如何显示汉字。如果你们有解决的方法能发给我吗?这样就不用在转换了。查了一些资料都是C++。由于C++基础太差,看不太懂,希望朋友们给转换一下。
其中头文件在 Delphi 中是什么文件?
-------------
第一个例子#include "StdAfx.h"
#include "OutlineFont.h"
COutlineFont::COutlineFont(
CDC* dc,
char* fontname, char* string)
{
// Class constructor.
// Stores each character in its own display list
// for later drawing via the wglUseFontOutlines() call.
char cch;
unsigned int ich=0;
unsigned int i=0;
unsigned int j=0;
//; bool bWGL;
m_iCount = strlen(string);
if (dc && fontname && strlen(fontname) > 0) {
m_pDC = dc;
m_listbase = glGenLists(256);
// Setup the Font characteristics
LOGFONT logfont;
GLYPHMETRICSFLOAT gmf[256];
logfont.lfHeight = -100;
logfont.lfWidth = 0;
logfont.lfEscapement = 0;
logfont.lfOrientation = logfont.lfEscapement;
logfont.lfWeight = FW_NORMAL;
// logfont.lfItalic = FALSE;
// logfont.lfUnderline = FALSE;
// logfont.lfStrikeOut = FALSE;
logfont.lfCharSet = GB2312_CHARSET;//ANSI_CHARSET;
logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
logfont.lfQuality = DEFAULT_QUALITY;
logfont.lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS;
strcpy(logfont.lfFaceName, fontname);
CFont font;
CFont* oldfont;
BOOL success = font.CreateFontIndirect(&logfont);
oldfont = m_pDC->SelectObject(&font);
i=0;
j=0;
while(i<strlen(string))
{
if (IsDBCSLeadByte(string[i]))
{ ///判断是否为双字节
ich=string[i];
ich=(ich<<8)+256; ////256为汉字内码“偏移量”
ich=ich+string[i+1];
i++;i++;
wglUseFontOutlines(m_pDC->m_hDC, /////字体轮廓设备联系DC
ich, /////要转换为显示列表的第一个字符
1, /////要转换为显示列表的字符数
m_listbase+j, /////显示列表的基数
0.0f, /////指定与实际轮廓的最大偏移量
0.15f, /////在Z轴负方向的值
WGL_FONT_POLYGONS, /////指定显示列表线段或多边形
&gmf[j]); /////接受字符的地址
FTextList[j]=j;
j++;
}
else{
cch=string[i];
i++;
wglUseFontOutlines(m_pDC->m_hDC, /////字体轮廓设备联系DC
cch, /////要转换为显示列表的第一个字符
1, /////要转换为显示列表的字符数
m_listbase+j, /////显示列表的基数
0.0f, /////指定与实际轮廓的最大偏移量
0.15f, /////在Z轴负方向的值
WGL_FONT_POLYGONS, /////指定显示列表线段或多边形
&gmf[j]); /////接受字符的地址
FTextList[j]=j;
j++;
}
}
if (!success)
{
/* FALSE == wglUseFontOutlines(
m_pDC->m_hDC,
0,
256,
m_listbase,
0.0,
0.0,
WGL_FONT_POLYGONS,
gmf)) {*/
glDeleteLists(m_listbase, 256);
m_listbase = 0;
}
else {
m_pDC->SelectObject(oldfont);
}
}
}
COutlineFont::~COutlineFont()
{
// Class destructor.
glDeleteLists(m_listbase, 256);
m_listbase = 0;
}
void
COutlineFont::DrawString(char* s)
{
// Draws the given text string.
/// GLsizei m_iCount = GLsizei(strlen(s));
if (m_iCount > 0) {
// Must save/restore the list base.
glPushAttrib(GL_LIST_BIT);{
glListBase(m_listbase);
glCallLists(m_iCount, GL_UNSIGNED_BYTE, &FTextList);
} glPopAttrib();
}
} ----------------------------
第二个例子 使用OPENGL显示中文的类,发不上来
http://blog.csdn.net/hili/archive/2006/03/22/632986.aspx
非常急,不慎感激!
我不知道OpenGL 中如何显示汉字。如果你们有解决的方法能发给我吗?这样就不用在转换了。查了一些资料都是C++。由于C++基础太差,看不太懂,希望朋友们给转换一下。
其中头文件在 Delphi 中是什么文件?
-------------
第一个例子#include "StdAfx.h"
#include "OutlineFont.h"
COutlineFont::COutlineFont(
CDC* dc,
char* fontname, char* string)
{
// Class constructor.
// Stores each character in its own display list
// for later drawing via the wglUseFontOutlines() call.
char cch;
unsigned int ich=0;
unsigned int i=0;
unsigned int j=0;
//; bool bWGL;
m_iCount = strlen(string);
if (dc && fontname && strlen(fontname) > 0) {
m_pDC = dc;
m_listbase = glGenLists(256);
// Setup the Font characteristics
LOGFONT logfont;
GLYPHMETRICSFLOAT gmf[256];
logfont.lfHeight = -100;
logfont.lfWidth = 0;
logfont.lfEscapement = 0;
logfont.lfOrientation = logfont.lfEscapement;
logfont.lfWeight = FW_NORMAL;
// logfont.lfItalic = FALSE;
// logfont.lfUnderline = FALSE;
// logfont.lfStrikeOut = FALSE;
logfont.lfCharSet = GB2312_CHARSET;//ANSI_CHARSET;
logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
logfont.lfQuality = DEFAULT_QUALITY;
logfont.lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS;
strcpy(logfont.lfFaceName, fontname);
CFont font;
CFont* oldfont;
BOOL success = font.CreateFontIndirect(&logfont);
oldfont = m_pDC->SelectObject(&font);
i=0;
j=0;
while(i<strlen(string))
{
if (IsDBCSLeadByte(string[i]))
{ ///判断是否为双字节
ich=string[i];
ich=(ich<<8)+256; ////256为汉字内码“偏移量”
ich=ich+string[i+1];
i++;i++;
wglUseFontOutlines(m_pDC->m_hDC, /////字体轮廓设备联系DC
ich, /////要转换为显示列表的第一个字符
1, /////要转换为显示列表的字符数
m_listbase+j, /////显示列表的基数
0.0f, /////指定与实际轮廓的最大偏移量
0.15f, /////在Z轴负方向的值
WGL_FONT_POLYGONS, /////指定显示列表线段或多边形
&gmf[j]); /////接受字符的地址
FTextList[j]=j;
j++;
}
else{
cch=string[i];
i++;
wglUseFontOutlines(m_pDC->m_hDC, /////字体轮廓设备联系DC
cch, /////要转换为显示列表的第一个字符
1, /////要转换为显示列表的字符数
m_listbase+j, /////显示列表的基数
0.0f, /////指定与实际轮廓的最大偏移量
0.15f, /////在Z轴负方向的值
WGL_FONT_POLYGONS, /////指定显示列表线段或多边形
&gmf[j]); /////接受字符的地址
FTextList[j]=j;
j++;
}
}
if (!success)
{
/* FALSE == wglUseFontOutlines(
m_pDC->m_hDC,
0,
256,
m_listbase,
0.0,
0.0,
WGL_FONT_POLYGONS,
gmf)) {*/
glDeleteLists(m_listbase, 256);
m_listbase = 0;
}
else {
m_pDC->SelectObject(oldfont);
}
}
}
COutlineFont::~COutlineFont()
{
// Class destructor.
glDeleteLists(m_listbase, 256);
m_listbase = 0;
}
void
COutlineFont::DrawString(char* s)
{
// Draws the given text string.
/// GLsizei m_iCount = GLsizei(strlen(s));
if (m_iCount > 0) {
// Must save/restore the list base.
glPushAttrib(GL_LIST_BIT);{
glListBase(m_listbase);
glCallLists(m_iCount, GL_UNSIGNED_BYTE, &FTextList);
} glPopAttrib();
}
} ----------------------------
第二个例子 使用OPENGL显示中文的类,发不上来
http://blog.csdn.net/hili/archive/2006/03/22/632986.aspx
非常急,不慎感激!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货