|
发表于 2011-6-29 19:52:00
|
显示全部楼层
Re: OpenGL实现中文显示——改进版
我比你们都懒,我直接用GDI+在内存DC里输出文字,然后读出来用纹理显示。到目前为止还凑合着用吧!
关键代码:
//开始及结束GDI+,期间的代码可以把GDI+的绘图函数运用到图像对象上
Graphics* CGrap::CImage::BeginGDIPlus()
{
if(NULL==m_pData)return NULL;
if(NULL==CImage::hDC)CImage::hDC=::CreateCompatibleDC(NULL);
if(NULL==CImage::hDC)return NULL;
if(m_bBitmapInvalid)
{
if(NULL!=m_hBitmap): eleteObject(m_hBitmap);
m_hBitmap=NULL;
BITMAPINFO bmpinfo;
bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpinfo.bmiHeader.biWidth = m_W;
bmpinfo.bmiHeader.biHeight = m_H;
bmpinfo.bmiHeader.biPlanes = 1;
bmpinfo.bmiHeader.biBitCount = 24;
bmpinfo.bmiHeader.biCompression = BI_RGB;
bmpinfo.bmiHeader.biSizeImage = 0;
bmpinfo.bmiHeader.biXPelsPerMeter = 0;
bmpinfo.bmiHeader.biYPelsPerMeter = 0;
bmpinfo.bmiHeader.biClrUsed = 0;
bmpinfo.bmiHeader.biClrImportant = 0;
if(NULL==(m_hBitmap =::CreateDIBSection(hDC,&bmpinfo,DIB_RGB_COLORS,(void **)&m_pBitmapData,NULL,0)))return NULL;
m_bBitmapInvalid=false;
}
::SelectObject(CImage::hDC, m_hBitmap);
if(NULL!=CImage::pGDIPlusGrap)delete CImage::pGDIPlusGrap;
CImage::pGDIPlusGrap=NULL;
CImage::pGDIPlusGrap=new Graphics(CImage::hDC);
return CImage::pGDIPlusGrap;
}
void CGrap::CImage::EndGDIPlus(COLORREF bkColor,CHANNEL keyChannel)
{
if(NULL!=CImage::pGDIPlusGrap)delete CImage::pGDIPlusGrap;
CImage::pGDIPlusGrap=NULL;
long DIBPadBytes=IJL_DIB_PAD_BYTES(m_W,3);
long j=0,i=0;
keyChannel=keyChannel&3;
switch(m_Type)
{
case TYPE::RGBA:
for(j=0;j<m_H;++j)
{
for(i=0;i<m_W;++i)
{
if(GetR(bkColor)!=m_pBitmapData[(m_W*3+DIBPadBytes)*j+i*3]||
GetG(bkColor)!=m_pBitmapData[(m_W*3+DIBPadBytes)*j+i*3+1]||
GetB(bkColor)!=m_pBitmapData[(m_W*3+DIBPadBytes)*j+i*3+2])
{
m_pData[(m_W*j+i)*4] =m_pBitmapData[(m_W*3+DIBPadBytes)*j+i*3];
m_pData[(m_W*j+i)*4+1]=m_pBitmapData[(m_W*3+DIBPadBytes)*j+i*3+1];
m_pData[(m_W*j+i)*4+2]=m_pBitmapData[(m_W*3+DIBPadBytes)*j+i*3+2];
m_pData[(m_W*j+i)*4+3]=255;
}
}
}
break;
case TYPE::ALPHA:
for(j=0;j<m_H;++j)
{
for(i=0;i<m_W;++i)
{
m_pData[(m_W*j+i)]=m_pBitmapData[(m_W*3+DIBPadBytes)*j+i*3+keyChannel];
}
}
}
}
用法:
Graphics *pGPG=img.BeginGDIPlus();
if(NULL!=pGPG)
{
pGPG->SetSmoothingMode(SmoothingModeHighQuality);
pGPG->DrawString(L"我是中国人!", -1,&Font(L"宋体", 60),PointF(0, 0),&SolidBrush(const_colors[CONST_COLOR::Blue].ColorValue));
}
img.EndGDIPlus(0,CGrap::CImage::CHANNEL::B);
tex[0].Create(img);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
tex[0].Active();
CGrap::DrawStream(CGrap::SHAPE: UADS,0,4);
g.SwapBuffers(); |
|