📄 myopengl.cpp
字号:
// MyOpenGL.cpp: implementation of the CMyOpenGL class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MyOpenGL.h"
#include "vuAllocArray.h"
#include "vuImageFactory.h"
#include "vuTime.h"
#include "vrGeometry.h"
#include "vrMode.h"
#include "vrTextureFactory.h"
#include "vsgs.h"
#include <GL/glu.h>
#include "vpObserver.h"
#include "vpApp.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
FONTS *begin,*end;
CMyOpenGL::CMyOpenGL()
{
}
CMyOpenGL::~CMyOpenGL()
{
}
/*void CMyOpenGL::notify(vsChannel::Event, const vsChannel *,
vsTraversalCull *) {}*/
void CMyOpenGL:: mydraw()
{
//创建字体
static bool bFirst1=true;
if(bFirst1){
BuildFont();
bFirst1=false;
}
//glDisable( GL_DEPTH_TEST );
GLint frontFace;
glGetIntegerv(GL_FRONT_FACE, &frontFace);
GLboolean lightFlag = glIsEnabled(GL_LIGHTING);
if (lightFlag == GL_TRUE) {
glDisable(GL_LIGHTING);
}
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
int w=1,h=1;
gluOrtho2D(0, w, 0, h);
glScaled(0.025,0.025,0.025);
glTranslatef(0, 30, 0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glColor3ub( 255, 0, 0 );
glPrint("vega prime中主页阿所里肯德基发"); // 绘制字符串
glPopMatrix();
if (lightFlag == GL_TRUE) {
glEnable(GL_LIGHTING); // Turn Lighting on
}
if (frontFace == GL_CCW) {
glFrontFace(GL_CCW);
} else {
glFrontFace(GL_CW);
}
glEnable( GL_DEPTH_TEST );
}
void CMyOpenGL::notify(vsChannel::Event e, const vsChannel *channel,
vrDrawContext *context)
{
if(e!=vsChannel::EVENT_POST_DRAW)
return;
vrStateMgr *stateMgr = context->getStateMgr();
stateMgr->pushAll(context, true);
mydraw();
stateMgr->popAll(context);
}
int CMyOpenGL::configure()
{
vpChannel *m_chan = vpChannel::find("myChannel");
ASSERT(m_chan);
m_chan->addSubscriber(vpChannel::EVENT_POST_DRAW, this);
return vsgu::SUCCESS;
}
GLvoid CMyOpenGL::BuildFont(GLvoid)
{
newFont = CreateFont( -24, // 字体的高度
0, // 字体的宽度
0, // 旋转的角度
0, // 定位角度
FW_BOLD, // 字体的粗细
FALSE, // 斜体?
FALSE, // 下划线?
FALSE, // 删除线?
GB2312_CHARSET, // 字符集
OUT_TT_PRECIS, // 输出精度
CLIP_DEFAULT_PRECIS, // 裁减精度
ANTIALIASED_QUALITY, // 输出质量
FF_DONTCARE|DEFAULT_PITCH, // 间距和字体族
"宋体"); // 字体名称
oldFont = (HFONT)SelectObject(*(*vpWindow::begin())->getDisplayContext(), newFont); // 选进设备描述表
end = begin = NULL; // 初始化指针
}
GLvoid CMyOpenGL::glPrint(const char *fmt, ...) // Custom GL "Print" Routine
{
char text[256]; // 保存格式化后的字符串
DWORD dwChar[256]; // 保存转换后的字符串
GLfloat width=0; // 保存绘制出的字符串x方向总宽度
va_list ap; // 指向参数列表的指针
int length = 0; // 用以保存整个字符串长度
if (fmt == NULL) // 没有可输出的字符?
return; // 返回
va_start(ap, fmt); // 遍历字符串,查找变量
vsprintf(text, fmt, ap); // 将变量转换为显示的数字
va_end(ap); // 结果保存在text内
FONTS *pfont;
for (size_t i=0; i<strlen((char *)text); i++) // 循环字符串,转换汉字
{
if (IsDBCSLeadByte(text[i])) // 如果是汉字
{
dwChar[length] = (DWORD)((text[i] << 8) | (BYTE)text[i+1]); // 两个字节组合成一个DWORD并存储
i++; // 跳过一字节
}
else
{
dwChar[length] = text[i]; // 存储其它字符
}
for (pfont=begin; pfont!=NULL; pfont=pfont->next) // 在链表中搜索字符
{
if (pfont->val == dwChar[length]) // 在链表中存在
break; // 不再搜索字符
}
if (pfont == NULL) // 如果在链表中不存在
{
pfont = AddFont(dwChar[length]); // 添加字体到链表中去
}
width += pfont->gmf.gmfCellIncX; // 计算绘制出的字符串的宽度
length++; // 转化后的字符串长度
}
glPushAttrib(GL_LIST_BIT); // 显示表状态入栈
//glTranslatef(-width/2, 0.0f, 0.0f); // 使字符串置中
for (int k=0; k<length; k++) // 遍历字符串
{
for (pfont=begin; pfont!=NULL; pfont=pfont->next) // 查找字符
{
if (pfont->val == dwChar[k]) // 找到字符
{
glCallList(pfont->listName); // 绘制出字符
break; // 停止查找字符
}
}
}
glPopAttrib(); // 显示表状态出栈
}
FONTS* CMyOpenGL::AddFont(DWORD dwChar) // 在链表里添加字体
{
if (begin == NULL) // 如果链表里没有内容
begin = end = new FONTS;
else // 增加链表元素
{
end->next = new FONTS;
end = end->next;
}
end->next = NULL; // 链表的结尾
end->val = dwChar; // 保存字体值
end->listName = glGenLists(1); // 建立字体
wglUseFontOutlines(*(*vpWindow::begin())->getDisplayContext(), dwChar, 1, end->listName, 0.0f, 0.1f, WGL_FONT_POLYGONS, &end->gmf);
return end; // 返回最后一个字体的指针
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -