基于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 (),最后一个参数的值设小一点。

 
原创粉丝点击