程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 在VC6或者VC7下用 ATL做一個OpenGL的(COM)控件

在VC6或者VC7下用 ATL做一個OpenGL的(COM)控件

編輯:vc教程

目的:由於在寫OpenGL程序的時候這些東西每次都要寫一遍,而且特別繁瑣!為了剛步入OpenGL人提供一個界面控件,讓他們較早的看到自己寫的OpenGL程序的效果!讓他們覺得OpenGL的神奇!

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事件中寫你要畫的物體就可以了!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved