请问怎样在Group Box中进行OpenGL绘图
用MFC

解决方案 »

  1.   

    这个倒没试过,
    但为什么要在这里呢?
    在picture control 里不行吗?
      

  2.   

    给你一段代码:
    新建一个对话框,类名为CRender,ID为IDD_DIALOG2
    新建一个picturn control;
    设定其ID为IDC_RENDER(默认值为IDC_STATIC)
    在Render.cpp头部加上:
    #include <gl\gl.h>
    #include <gl\glu.h>
    #include <gl\glaux.h>
    同时,为你的工程加入库winmm.lib opengl32.lib glu32.lib glaux.lib在Render.h的public里加入:
    BOOL SetWindowPixelFormat(HDC hDC);//设定象素格式
    BOOL CreateViewGLContext(HDC hDC);
    void RenderScene();
    HDC hrenderDC;
    HGLRC hrenderRC;
    float m_yRotate;
    int PixelFormat;这样,在Render.cpp里就可以添加以上定义的成员函数了:
    BOOL CRender::SetWindowPixelFormat(HDC hDC)
    {
    PIXELFORMATDESCRIPTOR pixelDesc;pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
    pixelDesc.nVersion = 1;pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | 
    PFD_SUPPORT_OPENGL |
    PFD_DOUBLEBUFFER |
    PFD_TYPE_RGBA;pixelDesc.iPixelType = PFD_TYPE_RGBA;
    pixelDesc.cColorBits = 32;
    pixelDesc.cRedBits = 0;
    pixelDesc.cRedShift = 0;
    pixelDesc.cGreenBits = 0;
    pixelDesc.cGreenShift = 0;
    pixelDesc.cBlueBits = 0;
    pixelDesc.cBlueShift = 0;
    pixelDesc.cAlphaBits = 0;
    pixelDesc.cAlphaShift = 0;
    pixelDesc.cAccumBits = 0;
    pixelDesc.cAccumRedBits = 0;
    pixelDesc.cAccumGreenBits = 0;
    pixelDesc.cAccumBlueBits = 0;
    pixelDesc.cAccumAlphaBits = 0;
    pixelDesc.cDepthBits = 0;
    pixelDesc.cStencilBits = 0;
    pixelDesc.cAuxBuffers = 0;
    pixelDesc.iLayerType = PFD_MAIN_PLANE;
    pixelDesc.bReserved = 0;
    pixelDesc.dwLayerMask = 0;
    pixelDesc.dwVisibleMask = 0;
    pixelDesc.dwDamageMask = 0;PixelFormat = ChoosePixelFormat(hDC,&pixelDesc);
    if(PixelFormat==0) // Choose default
    {
    PixelFormat = 1;
    if(DescribePixelFormat(hDC,PixelFormat,
    sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
    {
    return FALSE;
    }
    }if(SetPixelFormat(hDC,PixelFormat,&pixelDesc)==FALSE){ 
    return FALSE;
    }return TRUE;
    }
    BOOL CRender::CreateViewGLContext(HDC hDC)
    {
    hrenderRC = wglCreateContext(hDC);if(hrenderRC==NULL)
    return FALSE;if(wglMakeCurrent(hDC,hrenderRC)==FALSE)
    return FALSE;return TRUE;
    }void CRender::RenderScene()
    {
    /////////////////////////////////////////////////
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0
    // glRotated(m_xRotate, 1.0, 0.0, 0.0);
    glRotated(m_yRotate, 0.0, 1.0, 0.0);
    glBegin(GL_TRIANGLES); // Drawing Using Triangles

    glVertex3f( 0.0f, 1.0f, 0.0f); // Top
    glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
    glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
    glEnd(); // Finished Drawing The Triangle
    SwapBuffers(hrenderDC);
    }
    下一步,就是初始化OpenGL了^_^,
    为你的对话框添加WM_INITDIALOG消息:BOOL CRender::OnInitDialog() 
    {
    CDialog::OnInitDialog(); CWnd *wnd=GetDlgItem(IDC_RENDER);
        hrenderDC=::GetDC(wnd->m_hWnd);
    if(SetWindowPixelFormat(hrenderDC)==FALSE)
    return 0;

    if(CreateViewGLContext(hrenderDC)==FALSE)
    return 0;
    glPolygonMode(GL_FRONT,GL_FILL);
    glPolygonMode(GL_BACK,GL_FILL);
    /////////////////////////////////////////// glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH);
    glViewport(0,0,259,231);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45,1,0.1,100.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glShadeModel(GL_SMOOTH); // Enable Smooth Shading
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
    glClearDepth(1.0f); // Depth Buffer Setup
    glEnable(GL_DEPTH_TEST); // Enables Depth Testing
    glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
    /////////////////////////////////////////////////////////////////////////
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); SetTimer(1,10,0);
        
    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }接着添加WM_TIMERvoid CRender::OnTimer(UINT nIDEvent) 
    {
    RenderScene();
    m_yRotate += 1;

    CDialog::OnTimer(nIDEvent);
    }别忘了初始化
    CRender::CRender(CWnd* pParent /*=NULL*/)
    : CDialog(CRender::IDD, pParent)
    {
    PixelFormat=0;
    m_yRotate = 0;
    //{{AFX_DATA_INIT(CRender)
    // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT
    }好了,运行一下看看,是不是看到一个旋转的白色三角形?写得我累死了,有什么不明白给我消息!