游戏开发论坛

 找回密码
 立即注册
搜索
楼主: testerHooK

OpenGL实现中文显示——改进版

[复制链接]

45

主题

157

帖子

169

积分

注册会员

Rank: 2

积分
169
QQ
发表于 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();       
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-7 04:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表