如何在VC6或者VC7下用 ATL做一个OpenGL的(COM)控件?

原创 2004年02月20日 11:38:00

如何在VC6或者VC7下用 ATL做一个OpenGL的(COM)控件?

目的:由于在写OpenGL程序的时候这些东西每次都要写一遍,而且特别繁琐!为了刚步入OpenGL人提供一个界面控件,让他们较早的看到自己写的OpenGL程序的效果!让他们觉得OpenGL的神奇!

作者:王卫星(wangweixing2000

1,  新建一个ATL空项目(项目名OpenGL_ATL

2,  添加一个ATL对象(MyControl)VC6下为Full Control,VC7下为ATL控件)必须选中Support Connection Points为了添加事件。

3,  在对象的.H头文件中添加:

  #include <gl/gl.h>
#include <gl/glu.h>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")

4,  在接口实现类添加一个OpenGL RC(rendering context)成员变量:

HGLRC m_hRC;

5,  添加一个设置OpenGL像素格式(接口实现类的)成员函数:

// Set OpenGL pixel format for given DC

BOOL MyControl::SetupPixelFormat(HDC hdc)

{

    static PIXELFORMATDESCRIPTOR pfd =

    {

        sizeof(PIXELFORMATDESCRIPTOR),   // size of this pfd

            1,                           // version number

            PFD_DRAW_TO_WINDOW |         // support window

            PFD_SUPPORT_OPENGL |         // support OpenGL

            PFD_DOUBLEBUFFER,            // double buffered

            PFD_TYPE_RGBA,               // RGBA type

            24,                          // 24-bit color depth

            0, 0, 0, 0, 0, 0,            // color bits ignored

            0,                           // no alpha buffer           

0,                           // shift bit ignored

            0,                           // no accumulation buffer

            0, 0, 0, 0,                  // accum bits ignored

            32,                          // 32-bit z-buffer

            0,                           // no stencil buffer

            0,                           // no auxiliary buffer

            PFD_MAIN_PLANE,              // main layer

            0,                           // reserved

            0, 0, 0                      // layer masks ignored

    };

    int pixelformat;

 

    if ((pixelformat = ChoosePixelFormat(hdc, &pfd)) == 0)

    {

        ATLASSERT(FALSE);

        return FALSE;

    }

 

    if (SetPixelFormat(hdc, pixelformat, &pfd) == FALSE)

    {

        ATLASSERT(FALSE);

        return FALSE;

    }

 

    return TRUE;

}

6, 添加一个Windows消息WM_CREATE

LRESULT CMyControl::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/,

    LPARAM /*lParam*/, BOOL& /*bHandled*/)

{

    HDC hdc = GetDC();

    RECT rc;

    GetClientRect(&rc);

    CreateContext(hdc, rc);   //初始化

 

    return 0;

}

7,添加一个Windows消息WM_DESTROY

LRESULT CMyControl::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
  wglMakeCurrent(NULL, NULL);
  if (m_hRC)
  {
    wglDeleteContext(m_hRC);
    m_hRC = NULL;
  }
  return 0;
}

7, 添加一个事件OnRender,点击ClassView中的IMyControlEvents添加方法OnRender参数int right,int left,int bottom,int top确定,然后编译你的idl文件,点击CMyControl实现连接点选中IMyControlEvents点击确定。

8,  OnDraw添加代码:

HRESULT OnDraw(ATL_DRAWINFO& di)
{
    HDC hdc = di.hdcDraw;
    RECT& rc = *(RECT*)di.prcBounds; 
    wglMakeCurrent(hdc, m_hRC); 
    glClearColor(1.0f, 0.0f, 0.0f, 10.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//激发OnRender事件
FireOnRender(rc.right , rc.left, rc.bottom , rc.top)
//vc7下不用加前缀Fire
//OnRender(rc.right , rc.left, rc.bottom , rc.top)
    glFinish();
    SwapBuffers(wglGetCurrentDC());
    return S_OK;
}
9,  编译。

要使用本控件很简单注册拖到你的窗体上,然后在OnRender事件中写你要画的物体就可以了!

如何在VC6或者VC7下用 ATL做一个OpenGL的(COM)控件?

  • zgqtxwd
  • zgqtxwd
  • 2008年04月27日 22:50
  • 175

ATL编程初级教程(图文事例)(VC6)

http://blog.csdn.net/titilima/archive/2004/07/18/44273.aspx介绍  本教程的目的是告诉你如何使用ATL创建一个COM服务器,并使用Visual...
  • ice197983
  • ice197983
  • 2007年03月26日 11:25
  • 3003

在用ATL创建组件时,如何在一个接口的实现中创建另一个已经实现了的接口的对象?

在用ATL创建组件时,我已经创建并实现了一个接口A,而当我在另一个接口B的实现中创建接口A的对象后,编译时,编译器提示接口A是个抽象类,不能创建。请问各位大侠是怎么回事?谢谢!...
  • programloveme
  • programloveme
  • 2005年05月27日 17:53
  • 1510

COM组件开发(六)——使用ATL开发COM组件

使用ATL开发COM组件           使用ATL开发COM组件之前,要对几个重要的类进行说明:           CComModule           这是ATL的中心模块类,它的...
  • q5806622
  • q5806622
  • 2015年02月27日 10:10
  • 2308

VS2012创建ATL工程及使用MFC测试COM组件

这篇文章首先介绍了如何创建一个ATL工程,并为其添加接口类和实现接口方法;然后介绍了如何利用自动化的方式调用由ATL生成的dll,即在程序中获取CLSID和IID然后创建接口实例;最后分析了在程序中C...
  • pigautumn
  • pigautumn
  • 2015年01月22日 16:23
  • 6769

VC6 or VC7,让转变不再迷茫

放假回来,去CSDN上一转,第一次发现了VC.NET版,因为我以前一直是不瞄.NET社区的(不是狂妄,是不懂),在上面看到一篇问对于VC.NET的种种顾虑的文章,突然想起在学校的BBS上也有人问类似的...
  • ftofficer
  • ftofficer
  • 2004年08月21日 22:11
  • 1853

ATL多继承情况下接口的取得

多继承情况下接口的取得。 1.   多Dispatch接口 class   ATL_NO_VTABLE   CUse   :   public   CComObjectRootEx , public...
  • wishfly
  • wishfly
  • 2008年01月16日 10:01
  • 1523

如何使用C++创建COM组件(ATL项目)

使用C++新建ATL项目,并实现调试测试。
  • u010169823
  • u010169823
  • 2017年03月22日 14:48
  • 316

VS2010创建ATL工程及使用C++测试COM组件

1.创建ATL项目,取名MyCom 2. ATL 项目向导,勾选 【支持COM+ 1.0】和【支持部件注册器】,其他默认,点击完成。 3.在该项目中添加类 4.添加一个ATL简单对象...
  • xiaojun111111
  • xiaojun111111
  • 2015年03月30日 12:17
  • 861

创建ATL工程及使用MFC测试COM组件

一、创建ATL工程 1、创建ATL项目,取名为MyATL 2、在ATL项目向导中,勾选【支持MFC】(利用MFC测试用)、【支持 COM+ 1.0】和【支持部件注册器】,其余的选项默认,点击完...
  • jiangqin115
  • jiangqin115
  • 2015年09月06日 17:47
  • 816
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在VC6或者VC7下用 ATL做一个OpenGL的(COM)控件?
举报原因:
原因补充:

(最多只允许输入30个字)