opengl控件制作代码

//StdAfx.h
#include<gl/gl.h>
#include<gl/glu.h>
#include<gl/glaux.h>
#include<afxtempl.h>

//添加静态库
opengl32.lib
glu32.lib
glaux.lib

//COpenGLCtrl message maps
OnDestroy()  WM_DESTROY
OnEraseBKgnd() WM_ERASEBKGND
OnSize() WM_SIZE
OnCreate() WM_CREATE

//COpenGLCtrl Add Member Variable
protected:
   HDC m_hDC;
   HGLRC m_hRC;

//COpenGLCtrl Add Member Function
protected:
   void Draw();

void Draw()
{
 glClearColor(1,1,1,1);
 glClear(GL_COLOR_BUFFER_BIT);

 glLoadIdentity();
 gluLookAt(5,5,5,0,0,0,0,1,0);
 //glRotatef(30,1,1,0);

 glColor3f(0,0,0);
 GLfloat RAD=3.1415926/180.0;
 GLfloat x,y,z,r;
 int i,j;
 for(i=0;i<180;i+=5)
 {
   glBegin(GL_LINE_LOOP);
     r = 2*sin(i*RAD);
     z = 2*cos(i*RAD);
     for(j=0;j<360;j+=10)
       {
   x = r*cos(j*RAD);
          y = r*sin(j*RAD);
          glVertex3f(x,y,z);
       }
    glEnd();
 }
 for(j=0;j<360;j+=10)
 {
   glBegin(GL_LINE_LOOP);
     for(i=0;i<=180;i+=10)
 {
    r = 2*sin(i*RAD);
     z = 2*cos(i*RAD);
         x = r*cos(j*RAD);
         y = r*sin(j*RAD);
         glVertex3f(x,y,z);
 }
   glEnd();
 }
 SwapBuffers(m_hDC);
}

///
//                        重载                           //
///
BOOL COpenGLCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
  cs.style = WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
  return CView::PreCreateWindow(cs);
}

void COpenGLCtrl::OnDraw(CDC* pDC)
{
 Draw();
}

//在OnCreate()中设置图形操作描述表和像素格式:
int COpenGLCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  PIXELFORMATDESCRIPTOR pfd=
     {
  sizeof(PIXELFORMATDESCRIPTOR),
   1,
   PFD_DRAW_TO_WINDOW|
   PFD_SUPPORT_OPENGL|
   PFD_DOUBLEBUFFER,
   PFD_TYPE_RGBA,
   24,
   0,0,0,0,0,0,
   0,
   0,
   0,
   0,0,0,0,
   32,
   0,
   0,
   PFD_MAIN_PLANE,
   0,
   0,0,0
      };
      m_hDC=GetDC()->GetSafeHdc();
 
      int nPixelFormat=::ChoosePixelFormat(m_hDC,&pfd);
      ::SetPixelFormat(m_hDC,nPixelFormat,&pfd);
      m_hRC=::wglCreateContext(m_hDC);
      ::wglMakeCurrent(m_hDC,m_hRC);
      return 0;
}

void COpenGLCtrl::OnDestroy()
{
 ::wglMakeCurrent(NULL,NULL);
 ::wglDeleteContext(m_hRC);
}

void COpenGLCtrl::OnSize(UINT nType,int cx,int cy)
{
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(30,1,-3,3);
   glMatrixMode(GL_MODELVIEW);
   glViewport(0,0,cx,cy);
   glShadeModel(GL_FLAT);
}

 


///
//               //
//               //
//                                  openGL控件制作2                                  //
//               //
//               //
///
 void Draw();
 HGLRC m_hRC;
 CClientDC *m_hDC;

void COpenGLCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
      glClearColor(1.0f,1.0f,1.0f,0.0f);                   
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glLoadIdentity();

 gluLookAt(5,5,5,0,0,0,0,1,0);

 glColor3f(0,0,0);
 GLfloat RAD=3.1415926/180;
 GLfloat x,y,z,r;
 int i,j;
 for(i=0;i<180;i+=5)
 {
   glBegin(GL_LINE_LOOP);
     r = 2*sin(i*RAD);
     z = 2*cos(i*RAD);
     for(j=0;j<360;j+=10)
       {
       x = r*cos(j*RAD);
          y = r*sin(j*RAD);
          glVertex3f(x,y,z);
       }
    glEnd();
 }
 for(j=0;j<360;j+=10)
 {
   glBegin(GL_LINE_LOOP);
     for(i=0;i<=180;i+=10)
 {
    r = 2*sin(i*RAD);
     z = 2*cos(i*RAD);
         x = r*cos(j*RAD);
         y = r*sin(j*RAD);
         glVertex3f(x,y,z);
 }
   glEnd();
 }

 glFinish();
    SwapBuffers(wglGetCurrentDC());
}


int COpenGLCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (COleControl::OnCreate(lpCreateStruct) == -1)
  return -1;
 
static PIXELFORMATDESCRIPTOR pfd=
 {
  sizeof(PIXELFORMATDESCRIPTOR),
   1,
   PFD_DRAW_TO_WINDOW|
   PFD_SUPPORT_OPENGL|
   PFD_DOUBLEBUFFER,
   PFD_TYPE_RGBA,
   24,
   0,0,0,0,0,0,
   0,
   0,
   0,
   0,0,0,0,
   32,
   0,
   0,
   PFD_MAIN_PLANE,
   0,
   0,0,0
 };

 int pixelformat;
 int n;
 m_hDC=new CClientDC(this);
 if((pixelformat=ChoosePixelFormat(m_hDC->GetSafeHdc(),&pfd))==0)
 {
  MessageBox("choosepixelformat failed");
  return FALSE;

 }
 if(SetPixelFormat(m_hDC->GetSafeHdc(),pixelformat,&pfd)==FALSE)
 {
  MessageBox("setpixelformat failed");
  return FALSE;
 } 

 n=::GetPixelFormat(m_hDC->GetSafeHdc());

 ::DescribePixelFormat(m_hDC->GetSafeHdc(),n,sizeof(pfd),&pfd);

 m_hRC=wglCreateContext(m_hDC->GetSafeHdc());
 wglMakeCurrent(m_hDC->GetSafeHdc(),m_hRC);

 

 return 0;
}

void COpenGLCtrl::OnSize(UINT nType, int cx, int cy)
{
 COleControl::OnSize(nType, cx, cy);
 
    glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
    gluPerspective(30,1,-3,3);
 glMatrixMode(GL_MODELVIEW);
 glViewport(0,0,cx,cy);
 glShadeModel(GL_FLAT);
 
}


void COpenGLCtrl::OnDestroy()
{
 COleControl::OnDestroy();
 
    ::wglMakeCurrent(NULL,NULL);
    if(m_hRC)
  ::wglDeleteContext(m_hRC);
 if(m_hDC)
  delete m_hDC;
}

//
//               //
//  event map:                //
//     InitOpenGL           //
//     LButtonUp(long nFlags,short x,short y)        //
//     LMouseMove(short x,short y)         //
//     ReDraw            //
//     ReSize            //
//     LButtonDown(long nFlags,short x,short y)       //
//               //
//


/*
  glBegin(GL_LINES);
  glColor3f(0.0,1.0,0.0);
  glVertex3f(0.0,0.0,0.0);
  glVertex3f(50.0,0.0,0.0);

  glColor3f(1.0,0.0,0.0);
  glVertex3f(0.0,0.0,0.0);
  glVertex3f(0.0,50.0,0.0);

  glColor3f(0.0,0.0,1.0);
  glVertex3f(0.0,0.0,0.0);
  glVertex3f(0.0,0.0,50.0);
 glEnd();
*/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值