⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glfont.cpp

📁 实现3D游戏碰撞
💻 CPP
字号:
// GLFont.cpp: implementation of the CGLFont class.
// 学程序编游戏系列丛书
// 唐明理 E_mail: cqtmL@163.com
//====================================================================
#include "stdafx.h"

#include "GLFont.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
//unsigned int Base;
//////////////////////////////////////////////////////////////////////

CGLFont::CGLFont()
{
}
CGLFont::~CGLFont()
{
}
void CGLFont::entext( float x,float y, LPCTSTR str, HFONT hFont,
					  float r, float g, float b)
{ 	HDC hdc = wglGetCurrentDC();     
	SelectObject(hdc, hFont);       
	unsigned int Base = glGenLists(96); 
	wglUseFontBitmaps(hdc, 32, 96,Base);
	glDisable(GL_TEXTURE_2D);    
	glDisable(GL_LIGHTING);      
	glPushAttrib(GL_LIST_BIT);      
	glColor3f(r,g,b);               
	glRasterPos2f(x/100, y/100);  
		glListBase(Base - 32);     
		glCallLists(strlen(str), GL_UNSIGNED_BYTE, str); 
	glPopAttrib();                    
	glEnable(GL_LIGHTING);           
	glEnable(GL_TEXTURE_2D);        
	glDeleteLists(Base, 96);      
}

//////////////////////////////////////////////////////////////////
void CGLFont::c3dtext(LPCTSTR str,HFONT hFont,float z)
{	glDisable(GL_TEXTURE_2D);   
	glDisable(GL_LIGHTING);     
	Printfc3d("立体汉字",hFont,z);
	glEnable(GL_LIGHTING);    
	glEnable(GL_TEXTURE_2D);   
}
void CGLFont::Printfc3d(CString strText,HFONT hFont,float z)
{	HDC hdc = wglGetCurrentDC();
	HFONT hOldFont=(HFONT)::SelectObject(hdc,hFont);
	UCHAR * pChar=(UCHAR*)strText.GetBuffer(strText.GetLength());
	int   nListNum;                           
	DWORD dwChar;                         
	GLYPHMETRICSFLOAT pgmf[1];           
	glPushMatrix();                       
	for(int i = 0; i < strText.GetLength(); i++)
	{ if(IsDBCSLeadByte((BYTE)pChar[i]))     
		{ dwChar=(DWORD)((pChar[i]<<8)|pChar[i+1]); 
		  i++;
		}
	  else	dwChar = pChar[i];             
	  nListNum = glGenLists(1);             
	  wglUseFontOutlines( hdc,			
						  dwChar,			
						  1,			
						  nListNum,		
						  0.0f, 
						  z,			
						  WGL_FONT_POLYGONS,
						  pgmf			
						);
	  glCallList(nListNum);             
	  glDeleteLists(nListNum, 1);       
	}	
	glPopMatrix();                    
	strText.ReleaseBuffer();          
	::SelectObject(hdc,hOldFont);     
}
////////////////////////////////////////////////////////////////////////
void CGLFont:: settext (float x,float y,CString str,HFONT Font,float r,float g,float b)
{   glLoadIdentity();
	glPushAttrib(GL_CURRENT_BIT);
	glDisable(GL_TEXTURE_2D);    
	glDisable(GL_LIGHTING);       
	glColor3f(r,g,b);             
	  glTranslatef(-(420-x)/800,(260-y)/600,-1.0f);
	  Printftext (0,0, str,Font);      
	glEnable(GL_LIGHTING);         
	glEnable(GL_TEXTURE_2D);          
	glPopAttrib();
}
void CGLFont:: Printftext (int x, int y, LPCTSTR lpszText,HFONT hFont)
{ CBitmap bitmap;						
  BITMAP bm;                           
  SIZE size;                          
  HDC MDC = ::CreateCompatibleDC(0);
  SelectObject(MDC,hFont);			
  ::GetTextExtentPoint32(MDC,lpszText,strlen(lpszText),&size);
  bitmap.CreateBitmap(size.cx, size.cy, 1, 1, NULL);
  HBITMAP oldBmp=(HBITMAP)SelectObject(MDC,bitmap);
  SetBkColor  (MDC, RGB(0,     0,   0));	
  SetTextColor(MDC, RGB(255, 255, 255));	
  TextOut(MDC, 0, 0, lpszText, strlen(lpszText));
  bitmap.GetBitmap(&bm);				
  size.cx = (bm.bmWidth + 31) & (~31);		
  int bufsize =size.cy * size.cx;	
  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; 
  UCHAR* Bits = new UCHAR[bufsize];			
  ::GetDIBits(MDC,bitmap,0,bm.bmHeight,Bits,binf,DIB_RGB_COLORS); 
                                          
  glPixelStorei(GL_UNPACK_ALIGNMENT ,1);
  glRasterPos2i(x,y);                  
  glBitmap(size.cx,size.cy,0,0,0,0,Bits);
  delete Bits;                            
  SelectObject(MDC, oldBmp);           
  ::DeleteDC(MDC);                  
}

BOOL CGLFont::loadbmp(CString cc)
{	HANDLE m_Buf= NULL;
	LPVOID lpmem = NULL;
	CFile file;
	if( !file.Open( cc,CFile::modeRead)) return NULL;
	BITMAPFILEHEADER fileinfo;
	file.Read(&fileinfo,sizeof(fileinfo));
	if(fileinfo.bfType != (('M'<<8)+'B'))	return NULL;
	UINT m_Off=fileinfo.bfOffBits; 
	UINT length = file.GetLength() - sizeof(BITMAPFILEHEADER);
	if(m_Buf != NULL) 
	{GlobalFree(m_Buf);m_Buf = NULL;}
	m_Buf = GlobalAlloc(GMEM_MOVEABLE|GMEM_DISCARDABLE,length);
	lpmem = GlobalLock(m_Buf);
	if(length != file.ReadHuge(lpmem,length))
	{	GlobalUnlock(m_Buf);
		GlobalFree(m_Buf);
		return NULL;
	}
	UCHAR* tmp = new UCHAR[length];
	memcpy(tmp,lpmem,length);
	LPBITMAPINFOHEADER bm=(BITMAPINFOHEADER *)tmp;
	bm->biSize = sizeof(BITMAPINFOHEADER);
	int w=bm->biWidth;  
	int h=bm->biHeight;
//////////////////////////////////////////////
	glDisable(GL_TEXTURE_2D);
	glDisable(GL_LIGHTING);
	glColor3f(255,255,255);
		glPixelStorei(GL_UNPACK_ALIGNMENT,4);
		glRasterPos2i(0,0);
		glBitmap(w,h,0,0,0,0,tmp+6*2);
	glEnable(GL_LIGHTING);
	glEnable(GL_TEXTURE_2D);
	delete tmp;
	GlobalUnlock(m_Buf);GlobalFree(m_Buf);
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -