使用 MFC 开发的 OpenGL ActiveX 控件






4.80/5 (9投票s)
1999年11月23日
3分钟阅读

297699

8036
<!-- 文章开始 -->
本文重点介绍如何使用 MFC 开发 OpenGL ActiveX 控件 (OCX),该控件可用于 VB 应用程序或 HTML,以及如何在 VB 和 HTML 中使用 OpenGL ActiveX 控件来开发 3D 应用程序和 Internet 网页。为了简化演示代码,我借用了 Codeguru 上发布的 3D 字体类。
开发 OpenGL ActiveX 控件的一些关键点
上下文设备
ActiveX 控件将在容器客户端中显示,因此控件绘制所在的上下文设备是容器上下文设备。 OpenGL 控件必须具有一个上下文设备指针。 在创建控件时将其设置为容器上下文设备指针。 可以通过调用 COleControl 成员函数 "GetDC" 来找到容器上下文设备指针。 代码是
int CGL3dOcxCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { lpCreateStruct->style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CS_OWNDC); if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here SetupEnv(); ........ ........ return 0; } void CGL3dOcxCtrl::SetupEnv(void) { ........ ........ //get device context m_pDC = GetDC(); ........ ........ }
属性
在 OpenGL 控件上,我将显示在 3DFont 对象中的字符串设计为真实属性。 容器可以通过属性实现 "GetContent" 和 "SetContent" 来处理字符串。 示例代码是
BSTR CGL3dOcxCtrl::GetContent() { // TODO: Add your property handler here CString strResult = m_Font.GetText(); return strResult.AllocSysString(); } void CGL3dOcxCtrl::SetContent(LPCTSTR lpszNewValue) { // TODO: Add your property handler here wglMakeCurrent(m_pDC->m_hDC, m_hRC); m_Font.SetText(lpszNewValue); m_Font.CreateFont(m_pDC, "Arial Black"); wglMakeCurrent(m_pDC->m_hDC, NULL); Refresh(); }
在 SetContent 函数中,在重置 3D 字体类中的字符串后,调用 "Refresh" 来重绘控件
方法
此 OpenGL 控件中的重要方法是 "GLRender"。 当容器响应 paint/draw 事件时,容器可以调用此方法来重绘控件。
在 "GLRender" 方法中,有两个重要的功能,一个是根据容器中的控件大小设置渲染视口,另一个是渲染。
与可以处理 WM_SIZE 消息的普通 MS-Windows 应用程序不同,控件大小由容器操作,并且可以在渲染操作中轻松设置渲染视口。
渲染与普通 OpenGL 程序中的渲染功能类似。
void CGL3dOcxCtrl::GLRender() { // TODO: Add your dispatch handler code here int cx, cy; GetControlSize(&cx, &cy); if(m_cx != cx || m_cy != cy) { m_cx = cx; m_cy = cy; SetViewPort(); } dcRender(); } void CGL3dOcxCtrl::SetViewPort(void) { wglMakeCurrent(m_pDC->m_hDC, m_hRC); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-1.0, 1.0, -1.0, 1.0, 2.0, 7.0); glViewport(0, 0, m_cx, m_cy); wglMakeCurrent(m_pDC->m_hDC, NULL); } void CGL3dOcxCtrl::dcRender(void) { wglMakeCurrent(m_pDC->m_hDC, m_hRC); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); //clear color buffer glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //set light model glLightfv(GL_LIGHT0, GL_AMBIENT, m_Lightambient);//set light ambient glLightfv(GL_LIGHT0, GL_DIFFUSE, m_Lightdiffuse);//set light specular glLightfv(GL_LIGHT0, GL_SPECULAR, m_Lightspecular);//set light specular glLightfv(GL_LIGHT0, GL_POSITION, m_Lightposition);//set light position glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(-1.2f, -0.1f, -4.2f); m_Font.GLDrawText(); glFlush(); SwapBuffers(m_pDC->m_hDC); wglMakeCurrent(m_pDC->m_hDC, NULL); }
另一种方法是 "SetStrText",它允许容器设置 3D 字体的字符串,类似于属性函数 "SetContent"
事件
此 OpenGL 控件中最重要的事件是 "GLDraw"。 通过触发 "GLDraw" 事件,容器可以重绘控件。
注意:在使用此 OPENGL OCX 之前,必须在您的 WINDOWS 系统中注册它。
VC++ 包中的 ActiveX 控件测试容器可用于注册此 OCX,或者如果此源代码是在您的 PC 中使用 VC++ IDE 编译的,则可以自动注册
使用 OpenGL 控件的 VB 演示
在 VB 测试演示中,OpenGL 控件作为 OLE 组件 GL3DOCXLib.GL3dOcx GL3dOcx1 添加到窗体中
窗体中还有两个编辑框,一个用于通过方法 "SetStrText" 更改 3D 字体中的字符串,另一个用于通过属性实现 "SetContent" 更改字符串
在演示中,处理 "GLDraw" 事件的代码是
Private Sub GL3dOcx1_GLDraw() GL3dOcx1.GLRender End Sub
触发 "GLDraw" 事件的代码是
Private Sub Form_Paint() GL3dOcx1_GLDraw End Sub Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyReturn Then GL3dOcx1.Content = Text1.Text Text2.Text = Text1.Text GL3dOcx1_GLDraw End If End Sub Private Sub Text1_LostFocus() GL3dOcx1.Content = Text1.Text Text2.Text = Text1.Text GL3dOcx1_GLDraw End Sub Private Sub Text2_KeyUp(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyReturn Then GL3dOcx1.Content = Text2.Text Text1.Text = Text2.Text GL3dOcx1_GLDraw End If End Sub Private Sub Text2_LostFocus() GL3dOcx1.Content = Text2.Text Text1.Text = Text2.Text GL3dOcx1_GLDraw End Sub
HTML 演示
从标签开始,HTML 可以找到并加载 OpenGL 控件。 GUID 是 HTML 文档可以获取控件的关键点。 标签设置控件属性。
对于使用 OpenGL 控件的主页,必须使用 VBscript 来处理该控件。 BVscript 中的 GL3dOcx_GLDraw() 是用于处理 "GLDraw" 事件的函数。
注意:我在 IE3.0/5.0、Netscape Navigator3.0/Communicator4.6 中进行了测试。 IE3.0/5.0 支持它。 未在 Netscape Navigator3.0/Communicator4.6 中进行测试。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。