本帖最后由 u010173056 于 2013-05-09 17:59:02 编辑

解决方案 »

  1.   

    这个挺简单的吧?你左边的按钮应该是动态创建的,那么在创建的时候应该给其一个ID号,这个你知道吧?然后分下面三步:
    1,在xx.h文件里DECLARE_MESSAGE_MAP下面(其实哪儿都行我感觉)声明其函数:afx_msg void OnBnXX(),随便你写就行
    2.在xx.cpp文件里
    BEGIN_MESSAGE_MAP(CCanRunMainDlg, CBCGPDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
           (就这地方写吧)ON_COMMAND(ID_XX(你的buttonID), &CCanRunMainDlg::OnBnXX)
    END_MESSAGE_MAP()
    3,然后呢写其实现函数就行了啊
    xx.cpp文件里
    void  CMainFrame::OnBnxx()
    {
       //你要实现的代码
    }应该没错吧?呵呵
      

  2.   

    void  CMainFrame::OnBnxx()
    {
       //你要实现的代码
    }
    就这一步不会写,上面的已经全都实现了。你的意思是直接把话曲面的代码放进来就行?
      

  3.   

    对了,你估计要修改下曲面在显示在什么地方,应该就是你那个显示图形的窗体,我看好像有个picturebox?没有的话也可以显示的其实
      

  4.   

    没有picturebox,直接就在窗口显示的。。你可说对了!我就是不知道如何修改使它显示在右面那个窗口啊啊啊...
      

  5.   

    我说,你初始化的时候图像怎么显示的就怎么改,这个在初始化里查看吧,你这个是文档形式的,应该是CMainFram::OnCreate函数里,你仔细看看就能搞定滴
      

  6.   

    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if(!(m_wndSplitter.CreateStatic(this, 1, 2) ) ||              !(m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMyDrawView), CSize(220,0), pContext) ) ||              !(m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightView), CSize(0,0), pContext) ) )       {              return FALSE;       }       return TRUE;

    }
    初始化里是这个啊,这是拆分窗口用的啊,,,,我的第二个窗口类名是“CRightView”,我个人觉得应该在 “CRightView”和“void CMyDrawView::OnClickButton()”里写一些代码
      

  7.   

    如果右边是个视图类的话,在视图类的OnDraw函数里添加绘制曲面的代码。另外,按说,你既然能显示出第一个图像,第二个应该是一样的道理。
      

  8.   

    我现在添加完代码了,但是图像显示不出来,一点击按钮程序就中断了,具体代码如下,高手给看看啊!!!
    CRightView::CRightView()
    {
    m_bIsInit = FALSE;
    }CRightView::~CRightView()
    {
    }
    BEGIN_MESSAGE_MAP(CRightView, CView)
    //{{AFX_MSG_MAP(CRightView)
    ON_WM_CREATE()
    ON_WM_DESTROY()
    ON_WM_SIZE()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()void CRightView::OnDraw(CDC* pDC)
    {
    CDocument* pDoc = GetDocument();
    // TODO: add draw code here
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    ///////////////////////////////////////////////////////////////////////
    //获得视区的宽与高,用于设置OpenGL的视口
    if(!m_bIsInit)
    {
    CRect rcClient;
    GetClientRect(&rcClient);
    GLsizei w = rcClient.Width(); //视区宽度
    GLsizei h = rcClient.Height(); //视区高度 ///////////////////////////////////////////////////////////////////////
    //初始化各种设置
    wglMakeCurrent(pDC->m_hDC,m_hGLRC); //将绘图上下文绑定到设备上下文上
    glClearColor(0.5,0.5,0.5,0.0); //设置背景色
    glClearDepth(1.0f); //初始化深度
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //清空缓冲区
    glEnable(GL_DEPTH_TEST); //开启深度测试
    glShadeModel(GL_SMOOTH); //平滑阴影模式 ///////////////////////////////////////////////////////////////////////
    //设置透视模式
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION); //选择投影矩阵
    glLoadIdentity(); //重置投影矩阵
    gluPerspective(60.0,(GLfloat)w/h,0.1,100.0); //设置投影方式及投影参数
    glMatrixMode(GL_MODELVIEW); //选择模视矩阵
    glLoadIdentity(); //重置模视矩阵 ///////////////////////////////////////////////////////////////////////
    //设置光照(定义一个位于左上方的白色定位光源)
    GLfloat lmodel_ambient[] = {1.0f,1.0f,1.0f,1.0f}; //定义环境光
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient); //设置环境光 GLfloat light0_ambient[] = {1.0,1.0,1.0,1.0}; //定义光源环境光
    GLfloat light0_diffuse[] = {1.0,1.0,1.0,1.0}; //定义光源散射光
    GLfloat light0_specular[] = {1.0,1.0,1.0,1.0}; //定义光源反射光
    GLfloat light0_position[] = {15.0,15.0,15.0,10.0}; //定义光源位置
    glLightfv(GL_LIGHT0,GL_AMBIENT,light0_ambient); //设置光源环境光
    glLightfv(GL_LIGHT0,GL_DIFFUSE,light0_diffuse); //设置光源散射光
    glLightfv(GL_LIGHT0,GL_SPECULAR,light0_specular); //设置光源反射光
    glLightfv(GL_LIGHT0,GL_POSITION,light0_position); //设置光源位置
    glEnable(GL_LIGHT0); //启用光源 glEnable(GL_LIGHTING); //启用光照效果 ///////////////////////////绘制金字塔(正四棱锥)////////////////////////
    ///////////////////////////////////////////////////////////////////////
    //定义黄铜材质
    GLfloat brass_ambient[] = {0.329412f,0.223529f,0.027451f,1.0f}; //定义材质环境光
    GLfloat brass_diffuse[] = {0.780392f,0.568627f,0.113725f,1.0f}; //定义材质散射光
    GLfloat brass_specular[] = {0.992157f,0.941176f,0.807843f,1.0f}; //定义材质反射光
    GLfloat brass_sinines[] = {100.0f}; //定义材质镜面反射强度
    glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,brass_ambient); //设置材质环境光
    glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,brass_diffuse); //设置材质散射光
    glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,brass_specular); //设置材质反射光
    glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,brass_sinines); //设置材质镜面反射强度 ///////////////////////////////////////////////////////////////////////
    //设置坐标系统
    glTranslatef(0.0f,-0.1f,-2.0f); //将坐标系统下移0.1,后移2.0
    glRotatef(45,1.0,0.0,0.0); //将坐标系统绕x轴逆时针旋转45度
    glRotatef(30,0.0,-1.0,0.0); //将坐标系统绕y轴顺时针旋转30度 ///////////////////////////////////////////////////////////////////////
    //绘制金字塔
    GLfloat pyramid[][3] = {{0.0,1.0,0.0},{0.5,0.0,0.5}, //定义顶点坐标
    {-0.5,0.0,0.5},{-0.5,0.0,-0.5},{0.5,0.0,-0.5}};  glBegin(GL_TRIANGLE_FAN); //使用扇形三角形模式
    glNormal3f(0.0,0.447214f,0.894427f); //前平面法向量
    glVertex3fv(pyramid[0]); //前平面
    glVertex3fv(pyramid[1]);
    glVertex3fv(pyramid[2]);
    glNormal3f(-0.894427f,0.447214f,0.0); //左平面法向量
    glVertex3fv(pyramid[3]); //左平面
    glNormal3f(0.0,0.447214f,-0.894427f); //后平面法向量
    glVertex3fv(pyramid[4]); //后平面
    glNormal3f(0.894427f,0.447214f,0.0); //右平面法向量
    glVertex3fv(pyramid[1]); //右平面
    glEnd(); //结束绘制 glFlush(); //强制输出
    SwapBuffers(pDC->m_hDC); //交换缓冲区 wglMakeCurrent(pDC->m_hDC,NULL); //置绘图上下文为非当前状态,释放设备上下文 m_bIsInit = TRUE;
    }
        int style = ((CMyDrawApp*)AfxGetApp())->nStyle; switch(style)
    {
    case 1:
    m_MyOpenDraw.OpenDraw1(0);//这里OpenDraw1(0)括号里的参数0是我自己乱加的,不加就报错,加CDC *pDC也报错,我随便写了个0就调试通过了,不知道怎么回事。
    break;
    case 2:
    break;
    }
    }
    上面这是右面窗口的显示代码。点击按钮要实现的视图代码如下:void CMyOpenDraw::OpenDraw1(CDC *pDC)
    {
        
    #define ustride 3 //u的跨度
    #define uorder 6 //u的阶数
    #define vstride (ustride * uorder) //v的跨度
    #define vorder 5 //v的阶数
    GLdouble points[vorder][uorder][ustride] = //定义顶点坐标(x,y,z)
    {
    {{-2.00f,0.4f,-1.00f},{-1.20f,0.3f,-1.00f},{-0.40f,0.4f,-1.00f},
    {0.40f,-0.3f,-1.00f},{1.20f,0.0f,-1.00f},{2.00f,0.5f,-1.00f}}, {{-2.00f,0.1f,-0.60f},{-1.20f,0.0f,-0.60f},{-0.40f,0.5f,-0.60f},
    {0.40f,0.0f,-0.60f},{1.20f,0.0f,-0.60f},{2.00f,0.0f,-0.60f}}, {{-2.00f,0.3f,-0.20f},{-1.20f,0.3f,-0.20f},{-0.40f,0.0f,-0.20f},
    {0.40f,0.0f,-0.20f},{1.20f,0.0f,-0.20f},{2.00f,0.5f,-0.20f}}, {{-2.00f,0.1f,0.50f},{-1.20f,0.2f,0.20f},{-0.40f,0.0f,0.50f},
    {0.40f,0.0f,0.20f},{1.20f,0.6f,0.60f},{2.00f,0.0f,0.40f}}, {{-2.00f,-0.5f,1.00f},{-1.20f,0.6f,1.00f},{-0.40f,0.0f,1.00f},
    {0.40f,0.0f,1.00f},{1.20f,0.1f,1.00f},{2.00f,0.5f,1.00f}}
    }; glMap2d( //定义顶点坐标求值器
    GL_MAP2_VERTEX_3,
    0,1,ustride,uorder,
    0,1,vstride,vorder,
    &points[0][0][0]
    );
    glEnable(GL_MAP2_VERTEX_3); //激活顶点坐标求值器 ///////////////////////////////////////////////////////////////////////
    //绘制曲面
    glPushMatrix(); //将当前模视矩阵压栈,防止当前变换影响原有的变换模式
    glLoadIdentity(); //重置模视矩阵
    glTranslatef(0.0f,-0.1f,-2.2f); //将坐标系统下移0.1,后移2.2
    glRotatef(45,1.0,0.0,0.0); //将坐标系统绕x轴逆时针旋转45度

    glMapGrid2f(20,0.0,1.0,20,0.0,1.0); //定义二维均布网格
    glEvalMesh2(GL_FILL,0,20,0,20); //生成二维多边形网格 glDisable(GL_TEXTURE_2D); //禁用纹理映射
    glPopMatrix(); //将模视矩阵出栈 glFlush(); //强制输出
    SwapBuffers(pDC->m_hDC); //交换缓冲区 wglMakeCurrent(pDC->m_hDC,NULL); //置绘图上下文为非当前状态,释放设备上下文
    }
      

  9.   

    大致思路是这样的,请参考:
    在App类中定义
    CMyDrawView * m_pMyDrawView
    CRightView * m_pRightView
    在分别在这两个类的初始化函数里指定
         ((CMyOpenGLApp*)AfxGetApp())->m_pMyDrawView=this;
        ((CMyOpenGLApp*)AfxGetApp())->m_pRightView=this;
    这样就可以传递信息了。
    比如画曲面,就传递参数1给ondraw函数,画立方体就传递参数2,等等。
    ondraw函数里面,加个switch语句就可以判断了。