step1: 在你的窗口上绘制控件,比如一个 static , 具体的在这里就不说了, 有一点要提, 控件的Visible属性 必须被钩掉, 就是说设置为不可见;
step2: 从CWnd派生一个新类, 我们用这个类动态的创建窗口,在上面进行绘图, 上面static 控件的作用是为一会儿用这个类 Create子窗口提供位置和size参数;

step3: 新类重载CWnd的 Create和 OnCreate函数,如下:
void COpenGLControl::Create(CRect rect, CWnd *parent)
...{
//Register window class
CString className = AfxRegisterWndClass(
CS_HREDRAW | CS_VREDRAW | CS_OWNDC,
NULL,
(HBRUSH)GetStockObject(BLACK_BRUSH),
NULL);
//Finally create the window
CreateEx(
0,
className,
"OpenGL",
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
rect,
parent,
0);
} 

注意在重载的 OnCreate函数中这里用了一个openGLDevice类的create方法,其实这个类只是包装了OpenGL初始化和配置的一些工作,我们可以在这个create的位置上进行一些SetupGL()之类的配置操作(参见我的另一篇日志,里面的初始化配置都可以放在这个位置)
int COpenGLControl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
...{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
dc = new CClientDC(this); //Get device context of window
openGLDevice.create(dc->m_hDC); //Create opengl rendering context
InitGL();
//DONE
return 0;
}

step4: 在新类中继续添加OnSize,DrawGLScene之类我们需要的函数(方法和平时搞GL的一样), 然后在新类的OnPaint中调用DrawGLScene绘图.
step5: 下来的工作就是在对话框中定义一个新类型的成员变量,然后在对话框的OnInitDialog中按照前面Static的位置和大小Create一个新类型的窗口,就可以在上面绘图了.
作者原文及源码下载参见:
http://steinsoft.net/index.php?site=Programming/Tutorials/opengl_dialog&printable=1
本文介绍如何在MFC对话框中利用自定义控件实现OpenGL绘图功能。通过继承CWnd并重载Create和OnCreate方法,设置OpenGL渲染上下文,并在OnPaint事件中调用绘图函数DrawGLScene来完成绘图过程。
3154

被折叠的 条评论
为什么被折叠?



