我要发帖 回复

正式会员

16

主题

43

积分

0

专家分

死亡骑士

:

私信
发表时间 : 2007-9-18 15:59:03 | 浏览 : 3468    评论 : 14
我用MFC与VP编程想在鼠标按下得到点的坐标的同时将坐标显示出来。
我用了论坛中一个“vega及vp里支持中文字符串显示类CGLFont
我建立了一个GLFont.h和一个GLFont.cpp文件,内容如下:
GLFont.h:
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
//////////////////////////////////////////////////////////////////////
CGLFont::CGLFont()
{
}
CGLFont::~CGLFont()
{
}
/********************************************************************
*
*  Function: ShowStringBitmap
*   Parameters:
*  Return value:
*     Description:位图方式显示字符串(支持中文)
* Created:
*    modified:
*********************************************************************/

int 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;
  pBmpBits = new UCHAR[bufsize];
  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 = glGenList(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;

然后我就在响应鼠标事件的相应位置写上:
...
case vrWindow::MESSAGE_MOUSE_LEFT_DOWN:
{
    ...
    m_pGlFont = new CGLFont();
    m_pGlFont->ShowStringBitmap(myCoordinate);

}


结果编译的时候出现错误(我已经用红色在代码出标出):
e:\GLFont.cpp(60) : error C2065: “bufsize” : 未声明的标识符
e:\GLFont.cpp(61) : error C3861: “bufsize”: 即使使用参数相关的查找,也未找到标识符
e:\GLFont.cpp(62) : error C3861: “bufsize”: 即使使用参数相关的查找,也未找到标识符
e:\GLFont.cpp(76) : error C3861: “bufsize”: 即使使用参数相关的查找,也未找到标识符
e:\GLFont.cpp(94) : error C3861: “glGenList”: 即使使用参数相关的查找,也未找到标识符

我想请问:
1.我这种使用方法对不对?
2.编译出现的错误应该怎样改正?
还请各位高手不吝赐教^o^

最近VR访客

caoun1015 评论于2007-9-18 16:09:46
提示: 作者被禁止或删除 内容自动屏蔽
leefantasy 评论于2007-9-18 16:13:42
vp那个Overlay2DText,我用过了,但是,造成了场景运行简直慢的受不了。可能影响到了帧数的速率。所以我就想用OpenGL。
以前在论坛中见过这样用Overlay的,但是也是说太影响显示速度。
独山子 评论于2007-9-18 17:41:46
方法没错,编译器已告诉你编译错误,bufsize是未声明的标识符,该变量未定义,
glGenList(1);应改为glGenLists(1);
自己多查文档。
逆水行舟,不进则退。
glistenw 评论于2007-9-19 09:51:04
近来学习一下
leefantasy 评论于2007-9-19 11:03:42

回复 # 的帖子

bufsize这个是用来干啥的?我到现在还没看懂这个变量的作用……
独山子 评论于2007-9-19 14:18:56
bufsize定义图像缓冲区的大小,可以声明为成员变量。
bufsize=size.cx * size.cy *3;
逆水行舟,不进则退。
leefantasy 评论于2007-9-19 16:22:25
谢谢楼上指教~~~~
我现在正在看vrString和这个的比较,看看到底那个比价好用一些。
有哪位曾经用过?具体说说方法?^o^
Diamond 评论于2007-11-12 17:53:49
完了看你们说『 Multigen Vega Prime 』我都晕了,一点也不懂这个软件,根听天书是的,看来要抓紧学学了.
goudan090815 评论于2011-5-17 23:32:24
这个帖子有没有结论
hithyy 评论于2011-8-10 18:21:44
使用的方法错了,opengl代码要放在vpchangnnel的ENENT_POST_DRAW事件处理函数中使用。

加入文字后不会导致画面不流畅,除非使用的太多了,要想办法提高效率。
paragon 评论于2011-12-24 09:57:51
GLFont用了,可是显示不出来?另外,程序退出的时候,释放内存会错。。。。为毛??
geahszks 评论于2012-11-29 00:12:51
正需要呢,谢谢了!

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

GMT+8, 2021-10-26 01:17 AM

返回顶部