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

来源:互联网 发布:windows 修改系统语言 编辑:程序博客网 时间:2024/05/16 18:10
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

如何在COM" target=_blank>COM" target=_blank>VC6COM" target=_blank>或者COM" target=_blank>COM" target=_blank>VC7下用 COM" target=_blank>ATLCOM" target=_blank>做一个COM" target=_blank>OpenGL的(COM控件?COM:office:office" />

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

作者:王卫星(wangweixing2000

1,  新建一个COM" target=_blank>ATL空项目(项目名COM" target=_blank>OpenGL_COM" target=_blank>ATL

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

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

  #include <gl/gl.h>
#include <gl/glu.h>
#pragma COMment(lib, "COM" target=_blank>OpenGL32.lib")
#pragma COMment(lib, "glu32.lib")

4,  在接口实现类添加一个COM" target=_blank>OpenGL RC(rendering context)成员变量:

HGLRC m_hRC;

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

// Set COM" target=_blank>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_COM" target=_blank>OpenGL |         // support COM" target=_blank>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)

    {

        COM" target=_blank>ATLASSERT(FALSE);

        return FALSE;

    }

 

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

    {

        COM" target=_blank>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 COMment1>/*uMsg*/, WPARAM COMment1>/*wParam*/, LPARAM COMment1>/*lParam*/, BOOL& COMment1>/*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(COM" target=_blank>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)
//COM" target=_blank>COM" target=_blank>VC7下不用加前缀Fire
//OnRender(rc.right , rc.left, rc.bottom , rc.top)
    glFinish();
    SwapBuffers(wglGetCurrentDC());
    return S_OK;
}
9,  编译。

要?<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击