- 积分
- 1182
- 帖子
- 362
- 主题
- 57
- 精华
- 2
- 最后登录
- 2020-6-11
- 在线时间
- 561 小时
高级会员

兴趣点(最多三项):
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] |
|