基于MFC 对话框的OPENGL学习
来源:互联网 发布:drum烟丝淘宝 编辑:程序博客网 时间:2024/05/18 02:48
今天开始学习OPENGL,由于对MFC比较熟悉 ,因此就采用了MFC的对话框进行opengl的学习。
关键步骤如下:
重载OnCreate、 OnSize
int COPengl02Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
opl = new OPenglClass();
opl->SetUpPixelFormat(this->GetSafeHwnd());
return 0;
}
void COPengl02Dlg::OnSize(UINT nType, int cx, int cy)
{
if(0 >= cx || 0 >= cy)
return;
opl->InitOpengl(cx, cy);
Invalidate(); //窗口在缩小后,不会 发送 WM_ONPAIT消息,因此 要加上它
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
}
在OnPaint()中渲染
void COPengl02Dlg::OnPaint()
{
if (IsIconic())
{
.....................
}
else
{
opl->Rendering();
CDialogEx::OnPaint();
}
}
opengl类部分代码 :
BOOL OPenglClass::SetUpPixelFormat(HWND hwn)
{
int Pixeformat; //像素点格式
glhdc = GetDC(hwn);
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), //结构大小
1, //版本号
PFD_DRAW_TO_WINDOW | //支持在窗口中绘图
PFD_SUPPORT_OPENGL | //支持OPENGL
PFD_DOUBLEBUFFER, //支持双缓冲
PFD_TYPE_RGBA, //RGBA颜色模式
16, //24位颜色模式
0, 0, 0, 0, 0, 0, // 忽略颜色位
0, // 没有非透明度缓存
0, // 忽略移位位
0, // 无累加缓存
0, 0, 0, 0, // 忽略累加位
16, // 32 位深度缓存
0, // 无模板缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主层
0, // 保留
0, 0, 0 // 忽略层,可见性和损毁掩模
};
if (!(Pixeformat = ChoosePixelFormat(glhdc, &pfd)))
{
::MessageBox(NULL,"没找到合适的显示模式","Error",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
SetPixelFormat(glhdc, Pixeformat, &pfd);
glrc = wglCreateContext(glhdc);//获取渲染描述句柄
wglMakeCurrent(glhdc, glrc);//激活渲染描述句柄
return true;
}
void OPenglClass::InitOpengl(int width, int height)
{
glViewport(0,0,width,height); // 设置OpenGL视口大小。
glMatrixMode(GL_PROJECTION); // 设置当前矩阵为投影矩阵。
glLoadIdentity(); // 重置当前指定的矩阵为单位矩阵
gluPerspective // 设置透视图
( 45.0f, // 透视角设置为 45 度
(GLfloat)width/(GLfloat)height, // 窗口的宽与高比
10.0f, // 视野透视深度:近点1.0f
3000.0f // 视野透视深度:始点0.1f远点1000.0f
);
// 这和照象机很类似,第一个参数设置镜头广角度,第二个参数是长宽比,后面是远近剪切。
glMatrixMode(GL_MODELVIEW); // 设置当前矩阵为模型视图矩阵
glLoadIdentity(); // 重置当前指定的矩阵为单位矩阵
}
void OPenglClass::Rendering()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);//刷新背景色
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();//重置当前指定的矩阵为单位矩阵
DrawglRect();
glFlush();
SwapBuffers(glhdc);
}
。。。。。。
如果发现图像不显示,可在绘图前使用glTranslatef(x, y, z)。
添加旋转功能后,图像只显示一半或其他的原因,可能引起的原因是:
在函数InitOpengl(int width, int height)中,gluPerspective (),最后一个参数的值设小一点。
- 基于MFC 对话框的OPENGL学习
- 基于MFC对话框的OpenGL类
- 基于MFC对话框的OpenGL类
- 基于MFC的对话框Dialog的OpenGL程序框架
- 制作一个基于MFC对话框的OpenGL类
- 制作一个基于MFC对话框的OpenGL类
- 制作一个基于MFC对话框的OpenGL类
- 制作一个基于MFC对话框的OpenGL类
- 基于MFC对话框的OpenGL三维图形开发
- 基于MFC对话框的OpenGL三维图形开发
- MFC基于对话框的用Picture Control显示OpenGL
- 基于对话框的MFC学习笔记
- MFC学习:基于对话框(2)
- 基于对话框的Opengl框架
- 基于MFC的OpenGL绘图
- 基于MFC的OpenGL绘图
- 基于MFC的OpenGL绘图
- 基于MFC的OpenGL绘图
- C#自定义类型强制转换
- 建立大型电商团队的参考
- 安装程序的静默安装
- 对象使用之前初始化
- Unity 3d Mac IDE出错
- 基于MFC 对话框的OPENGL学习
- Java控制台输入方式总结
- 关于u-boot中的.balignl 16,0xdeadbeef的理解
- Android应用自动更新功能的代码实现
- 第十一天——愤怒与无奈
- hdoj1027 Ignatius and the Princess II
- 【计算几何】poj1066 Treasure Hunt
- HTML技巧
- paip.版本控件svn删除文件或目录后的恢复