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

如何在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事件中写你要画的物体就可以了!

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器的行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

wangweixing2000

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值