我要发帖 回复

高级会员

57

主题

1182

积分

0

专家分

杰出贡献鼓励

兴趣点(最多三项):

VegaPrime
军事仿真
定位与追踪

私信
发表时间 : 2006-9-4 13:04:15 | 浏览 : 18057    评论 : 78
vega及vp里支持中文字符串显示类CGLFont:GLFont.h:

希望对想在vega及vp窗口(通道)上显示中文的朋友有帮助.

[cpp]class CGLFont  
{
public:
        CGLFont();
        virtual ~CGLFont();

public:
        static int ShowStringBitmap(LPCTSTR str, HFONT hFont = NULL,
                BOOL bUseDisplayList = FALSE);
};

GLFont.cpp:
#include "stdafx.h"
#include "GLFont.h"

#include "gl/gl.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGLFont::CGLFont()
{

}

CGLFont::~CGLFont()
{

}

/********************************************************************
*       
*        Function: ShowStringBitmap
*        Parameters:
*        Return value:
*        Description:位图方式显示字符串(支持中文)
*        Created:  
*        modified:   
*
*********************************************************************/
int CGLFont::ShowStringBitmap(LPCTSTR lpszText,HFONT hFont /* =NULL */,
                                                          BOOL bUseDisplayList /*=FALSE */)
{
        CBitmap bitmap;
        BITMAP bm;
        SIZE size;
        UCHAR* pBmpBits;
        HFONT hOldFont;
        HDC hdc = wglGetCurrentDC();

        if(!hFont) // use default system font
        {
                hFont = (HFONT)::GetStockObject(SYSTEM_FONT);
        }

        hOldFont = (HFONT)SelectObject(hdc, hFont);
        ::GetTextExtentPoint32(hdc, lpszText, strlen(lpszText), &size);

        bitmap.CreateBitmap(size.cx, size.cy, 1, 1, NULL);

        HDC hMemDC = ::CreateCompatibleDC(hdc);
        if(hMemDC)
        {
                HBITMAP hPrevBmp = (HBITMAP)SelectObject(hMemDC, bitmap);
                HFONT hPrevFont = (HFONT)SelectObject(hMemDC, hFont);
               
                SetBkColor(hMemDC, RGB(0, 0, 0));
                SetTextColor(hMemDC, RGB(255, 255, 255));
                SetBkMode(hMemDC, OPAQUE);
                TextOut(hMemDC, 0, 0, lpszText, strlen(lpszText));

                // copy GDI bitmap to DIB
                bitmap.GetBitmap(&bm);
                size.cx = (bm.bmWidth + 31) & (~31);
                size.cy = bm.bmHeight;
                int bufsize = size.cy * (((bm.bmWidth + 31) & (~31)) / 8);
                pBmpBits = new UCHAR[bufsize];
                memset(pBmpBits, 0, sizeof(UCHAR)*bufsize);

                struct {
                        BITMAPINFOHEADER bih;
                        RGBQUAD col[2];
                }bic;
                BITMAPINFO *binf = (BITMAPINFO *)&bic;

                binf->bmiHeader.biSize = sizeof(binf->bmiHeader);
                binf->bmiHeader.biWidth = bm.bmWidth;
                binf->bmiHeader.biHeight = bm.bmHeight;
                binf->bmiHeader.biPlanes = 1;
                binf->bmiHeader.biBitCount = 1;
                binf->bmiHeader.biCompression = BI_RGB;
                binf->bmiHeader.biSizeImage = bufsize;
                binf->bmiHeader.biXPelsPerMeter = 1;
                binf->bmiHeader.biYPelsPerMeter = 1;
                binf->bmiHeader.biClrUsed = 0;
                binf->bmiHeader.biClrImportant = 0;

                ::GetDIBits(hdc, bitmap, 0, bm.bmHeight, pBmpBits, binf, DIB_RGB_COLORS);               
                SelectObject(hMemDC, hPrevBmp);
        }
        ::DeleteDC(hMemDC);

        //设置当前字体  
        SelectObject(hdc, hOldFont);
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

        GLuint displist = 0;
        if(bUseDisplayList)
        {
                displist = glGenLists(1);
                glNewList(displist, GL_COMPILE);
                glBitmap(size.cx, size.cy, 0.0, 2.0, size.cx+2.0f, 0.0,pBmpBits);
                glEndList();
        }
        else;
        glBitmap(size.cx, size.cy, 0.0, 2.0, size.cx+2.0f, 0.0,        pBmpBits);

        delete pBmpBits;       
        return displist;
}

[/cpp]

vega或vp的通道回调接口里调用,vp里如下:
[cpp]virtual void notify(vsChannel::Event, const vsChannel *channel,
        vrDrawContext *context)
    {
vrStateMgr *stateMgr = context->getStateMgr();
                stateMgr->pushAll(context,true);
                    
        vrDepthTest::Element depthTestElement;
        depthTestElement.m_enable = false;
        stateMgr->setElement(vrDepthTest::Element::Id, &depthTestElement,context);       
      
        vrTransform::ElementProjection projectionElement;
        projectionElement.makeOrthographic(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f);
        stateMgr->setElement(vrTransform::ElementProjection::Id,
            &projectionElement,context);
   
        glRasterPos2f(0.0005f,0.75f);
         m_pGlFont->ShowStringBitmap("欢迎使用vega prime");
        stateMgr->popAll(context);

}

vega里:
static void CallBackOpenGLDraw( void *chan , void *data )
{
       
        int                zbuff;
        int                x, y, z;
        char             str[256];
        int                l, r, t, b;
       
        vgWindow *win=vgGetWin(0);
   
        vgGetWinSize( win, &l, &r, &b, &t );
                int width = r - l;
        int height = t - b;
       
        x = l + 10;
        y = t - 66;
        z = 0;
        vgFontSize( 10.0, 10.0 );
   
        pfPushState();
        pfBasicState();
       
        zbuff = glIsEnabled(GL_DEPTH_TEST);
        glDisable(GL_DEPTH_TEST);
        pfDisable( PFEN_TEXTURE );
       
        glPushMatrix();
        glMatrixMode( GL_PROJECTION );
        glLoadIdentity();
        gluOrtho2D( l, r, b, t );
        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();
       
        glColor4f( 1.0, 0.0, 0.0, 1.0 );
                 m_pGlFont->ShowStringBitmap("欢迎使用vega");

       
        if (zbuff)
           glEnable(GL_DEPTH_TEST);
        glPopMatrix();
        pfPopState();


}[/cpp]

最近VR访客查看更多↓

obuil 评论于2006-9-4 19:18:07
不错的东西,欢迎啊
独山子 评论于2006-9-4 19:43:12
不错,希望在2.0中不用这么复杂
逆水行舟,不进则退。
russelcrowe 评论于2006-9-5 16:56:48
好东西啊!
kthe 评论于2006-9-7 15:09:10
^_^ 谢谢
kangaroo 评论于2006-9-12 15:05:22
这个头文件是不是要单独去拷呀
kthe 评论于2006-9-14 19:30:38
vrStateMgr *stateMgr
这个东西要包含什么吗?
99daodan 评论于2006-10-9 09:23:02
大师!
顶!正准备研究这个vp的汉字显示呢
akusil 评论于2006-10-9 10:21:21
是不是真的啊?

楼主,你是自己做出来的呢?还是从其它地方灌水来的呀?

因为我所阅读的文章中,要在Vega下显示中文字符好像相当的复杂~~
administrator专家组 评论于2006-10-10 21:28:48
在vega中测试  显示不出来
superdemo 评论于2006-10-11 02:14:24
不好意思,在m_pGlFont->ShowStringBitmap("欢迎使用vega");
之前没有设置输出位置。
应该设置比如:glRasterPos2d(100.0,100.0);


在贴一遍
static void CallBackOpenGLDraw( void *chan , void *data )
{
       
        int                zbuff;
        int                x, y, z;
        char             str[256];
        int                l, r, t, b;
       
        vgWindow *win=vgGetWin(0);
   
        vgGetWinSize( win, &l, &r, &b, &t );
        int width = r - l;
        int height = t - b;
       
   
        pfPushState();
        pfBasicState();
       
        zbuff = glIsEnabled(GL_DEPTH_TEST);
        glDisable(GL_DEPTH_TEST);
        pfDisable( PFEN_TEXTURE );

       
        glPushMatrix();
        glMatrixMode( GL_PROJECTION );
        glLoadIdentity();
        gluOrtho2D( l, r, b, t );
        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();
       
        glColor4f( 1.0, 0.0, 0.0, 1.0 );

        glRasterPos2d(width/2.0f,height/2.0f);//设置输出位置                  

        m_pGlFont->ShowStringBitmap("欢迎使用vega");
       

        if (zbuff)
                glEnable(GL_DEPTH_TEST);
        glPopMatrix();
        pfPopState();
       
       
}
xiaolin 评论于2006-11-3 12:33:33
我在VP2.0里试过了,好像不行,它无法认出BITMAP,报错为
d:\OpenGL-VP\OpenGL-VP\OpenGL-VP.cpp(51): error C2018: 未知字符“0x4”
d:\OpenGL-VP\OpenGL-VP\OpenGL-VP.cpp(50): error C2065: “bitmap” : 未声明的标识符
d:\OpenGL-VP\OpenGL-VP\OpenGL-VP.cpp(50): error C2146: 语法错误 : 缺少“;”(在标识符“bitmap”的前面)
d:\OpenGL-VP\OpenGL-VP\OpenGL-VP.cpp(63): error C2228: “.CreateBitmap”的左侧必须有类/结构/联合类型
d:\OpenGL-VP\OpenGL-VP\OpenGL-VP.cpp(78): error C2228: “.GetBitmap”的左侧必须有类/结构/联合类型
d:\OpenGL-VP\OpenGL-VP\OpenGL-VP.cpp(63): error C3861: “bitmap”: 即使使用参数相关的查找,也未找到标识符
superdemo 评论于2006-11-3 22:11:29
使用MFC.
附上部分配置

Name="Debug|Win32"
                        OutputDirectory="."
                        IntermediateDirectory="Debug"
                        ConfigurationType="1"
                        UseOfMFC="1"
                        UseOfATL="1"
                        ATLMinimizesCRunTimeLibraryUsage="FALSE"
                        CharacterSet="2">
                        <Tool
                                Name="VCCLCompilerTool"
                                Optimization="0"
                                AdditionalIncludeDirectories="$(MPI_LOCATE_VEGA_PRIME)\include\vsg,$(MPI_LOCATE_VEGA_PRIME)\include\vegaprime"
                                PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_MBCS"
                                MinimalRebuild="TRUE"
                                BasicRuntimeChecks="3"
                                RuntimeLibrary="2"
                                UsePrecompiledHeader="2"
                                PrecompiledHeaderThrough="StdAfx.h"
                                PrecompiledHeaderFile=""
                                WarningLevel="3"
                                Detect64BitPortabilityProblems="TRUE"
                                DebugInformationFormat="4"/>
                        <Tool
                                Name="VCCustomBuildTool"/>
                        <Tool
                                Name="VCLinkerTool"
                                AdditionalDependencies="opengl32.lib mfc71d.lib "
liuhaiyang2004 评论于2006-12-27 09:56:48
好贴,谢谢搂主
chengbin 评论于2007-1-17 21:33:31
学习:lol
zhangml909 评论于2007-1-29 11:06:48
不错,回去试试
zzzz
crystal 评论于2007-2-5 15:59:13
谢谢!
stern0731 评论于2007-2-28 19:44:31
谢谢楼主!
kakai85 评论于2007-3-19 09:38:46
好东西啊
derekprs032 评论于2007-5-9 11:13:46
相当NB

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-3-7 08:45 PM

返回顶部