我要在一个MFC的视图上显示很多的信息,如文字,一些信号谱线,还有一些按钮及编辑框的东西,且需要在界面的下方,大概占视图高度1/3的一个矩形区内用OPENGL绘制三维图形,可以做到吗?怎么实现?高分求教,并请赐源码。(分不够再给)或者是将三维图形显示在一CFormView中的指定的Static控件中(将Static控件指定为显示图像)怎么做?万分感谢!!!!!!!!!!!!!!!!两种方案的任何一种,只要能实现都可以。

解决方案 »

  1.   

    对了,前面的方法好像是不能实现,我查资料的时候,看到这样的提示:OpenGL和GUI不能同时使用的,就是说在一个视图里面,你不能同时使用OpenGL和GUI绘制。
    我觉得理论上来说应该是可以实现的,就是不知道怎么做    :(
      

  2.   

    第一种方法不能直接的实现
    但是你可以创建一个窗口,覆盖在你指定的位置上,在其中来显示opengl的内容是可行的第二种方法常见
    比如在对话框或者其中的一个控件上显示opengl图形其实都是同一个原因,opengl显示的时候,要求独占一个窗口,而不能只占据其中的一个部分
      

  3.   

    当你绘制完毕 wglMakeCurrent NULL 之后,你可以在 view 上干任何事情。
      

  4.   

    刚才没看清楚你的问题。
    你的问题可以用一个 CWnd 窗口作为大窗口的子窗口,然后在这个子窗口上用ogl绘制。
    可以从 CWnd 继承形成一个子类。
      

  5.   

    对话框控件内显示opengl主要代码////////OpenGLDialogDlg.h
    protected:
    HICON m_hIcon;
    COpenGLControl openGLControl;////////OpenGLDialogDlg.cpp
    BOOL COpenGLDialogDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();
    //  wenn das Hauptfenster der Anwendung kein Dialogfeld ist
    SetIcon(m_hIcon, TRUE); // Gro遝s Symbol verwenden
    SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden

    // ZU ERLEDIGEN: Hier zus鋞zliche Initialisierung einf黦en

    CRect rect; GetDlgItem(IDC_OPENGL_WINDOW)->GetWindowRect(rect); ScreenToClient(rect);
    //GetWindowRect(thisRect);
    openGLControl.Create(rect,this); return TRUE;  // 
    }////////COpenGLControl.cpp
    void COpenGLControl::InitGL()
    {
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    //glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    }void COpenGLControl::DrawGLScene()
    {
    glClear(GL_COLOR_BUFFER_BIT
     |  GL_DEPTH_BUFFER_BIT);
    glLoadIdentity(); //***************************
    // DRAWING CODE
    //***************************// glTranslatef(0.0f,0.0f,-5.0f);
    glRotatef(rotation,0.0f,1.0f,0.0f); glBegin(GL_TRIANGLES);
    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f(1.0f,-1.0f,0.0f);
    glColor3f(0.0f,1.0f,0.0f);
    glVertex3f(-1.0f,-1.0f,0.0f);
    glColor3f(0.0f,0.0f,1.0f);
    glVertex3f(0.0f,1.0f,0.0f);
    glEnd();/* glBegin(GL_QUADS);
    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f(-1.1f,-1.1,0.0f);
    glVertex3f(1.1f,-1.1f,0.0f);
    glVertex3f(1.1f,1.1f,0.0f);
    glVertex3f(-1.1f,1.1f,0.0f);
    glEnd();*/ SwapBuffers(dc->m_hDC);
    }void COpenGLControl::Create(CRect rect, CWnd *parent)
    {
    CString className = AfxRegisterWndClass(
    CS_HREDRAW | CS_VREDRAW | CS_OWNDC,
    NULL,
    (HBRUSH)GetStockObject(BLACK_BRUSH),
    NULL); CreateEx(
    0,
    className,
    "OpenGL",
    WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
    rect,
    parent,
    0);}void COpenGLControl::OnPaint() 
    {
    rotation += 0.01f; if (rotation >= 360.0f)
    {
    rotation -= 360.0f;
    } /** OpenGL section **/ openGLDevice.makeCurrent(); DrawGLScene();
    }void COpenGLControl::OnSize(UINT nType, int cx, int cy) 
    {
    CWnd::OnSize(nType, cx, cy);

    if (cy == 0)
    {
    cy = 1;
    }
    glViewport(0,0,cx,cy); glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1.0f,1.0f,-1.0f,1.0f,1.0f,-1.0f);
    // gluPerspective(45.0f,cx/cy,0.1f,100.0f); glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }
    int COpenGLControl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CWnd::OnCreate(lpCreateStruct) == -1)
    return -1;

    dc = new CClientDC(this); openGLDevice.create(dc->m_hDC);
    InitGL(); return 0;
    }BOOL COpenGLControl::OnEraseBkgnd(CDC* pDC) 
    {
    return TRUE;
    }
      

  6.   

    上面的代码应该能看懂吧! 在对话框静态控件内显示GL.
    GetDlgItem(IDC_OPENGL_WINDOW) 就是得到静态控件的指针!
    其它的代码和平常的MFC下的GL无异.
      

  7.   

    请问:openGLDevice是你定义的OPENGL类的对象吧?
      

  8.   

    http://tech.163.com/05/0304/10/1E0CDS5R00091589.html
      

  9.   

    我按照http://tech.163.com/05/0304/10/1E0CDS5R00091589.html中的源码做了一遍,但还是画不出图像,怎么搞的。
    按照文中:"在适当的地方调用m_openGL.RenderGLScene()就可以了"
    我尝试在对话框中的OnPaint()中调用m_openGL.RenderGLScene()但是画不出图像。对话框打开时是出现一种忙的状态,但是却没有图像出现,然后一切都正常了,对话框还是原来的对话框,Static控件中一点图形也没有。
    大侠们,救命啊!!!!!!!!!!!!!!!!!!!!!!!