在MFC的图片控件上用OpenGL的glDrawPixels函数画图时指定起点坐标

         在MFC的图片控件(Picture Control)上用OpenGL的glDrawPixels函数画图时,是从图片控件的左下角开始画的,当高度上不能填满控件时,控件的顶部是空白的(图中的红色),如图1所示;当宽度上不能填满控件时,控件的右边是空白的(图中的红色),如图3所示。

         图1的情况,为了能将图画在图片控件高度上的中间(即图2所示),需要指定画图的起点坐标。找了好久才在“不想昵称”转的文章“opengl版本和扩展 (入门学习十四)”(http://blog.sina.com.cn/s/blog_4d035b080100k3ei.html)中找到用OpenGL的glDrawPixels函数画图时指定起点坐标的方法。

         图1、3、5是没有指定起点坐标的情形,图2、4、6是指定了起点坐标的情形。

 

         GLdouble AdjustXPos=0,AdjustYPos=0;    //X、Y方向上需要调整的坐标值

    //当图片大于控件的大小时需要缩放

    GLfloatControlWidth=m_rect.right-m_rect.left;   //图片控件的宽

    GLfloatControlHeight=m_rect.bottom-m_rect.top;  //图片控件的高

    GLfloatXScale=1.0*ControlWidth/ImageWidth;

    GLfloatYScale=1.0*ControlHeight/ImageHeight;

    if(XScale<1||YScale<1)      //判断是否需要缩放

       if(XScale<YScale)

       {

           glPixelZoom(XScale,XScale);

           AdjustXPos=0;

           AdjustYPos=(ControlHeight-XScale*ImageHeight)/2;

       }

       else

       {

           glPixelZoom(YScale,YScale);       

           AdjustXPos=(ControlWidth-YScale*ImageWidth)/2;

           AdjustYPos=0;

       }

    else                     //不需要缩放

    {

       AdjustXPos=(ControlWidth-ImageWidth)/2;

       AdjustYPos=(ControlHeight-ImageHeight)/2;

    }

    //先计算出一个经过变换后能够得到(AdjustXPosAdjustYPos)的坐标(x, y, z)

    // 然后调用glRasterPos3d(x, y, z);设置画图的起点坐标

    GLintviewport[4];

    GLdoublemodelview[16], projection[16];

    GLdoublex, y, z;

    glGetIntegerv(GL_VIEWPORT, viewport);

    glGetDoublev(GL_MODELVIEW_MATRIX, modelview);

    glGetDoublev(GL_PROJECTION_MATRIX, projection);

    gluUnProject(AdjustXPos, AdjustYPos,0, modelview, projection,viewport,

       &x,&y, &z);

    glRasterPos3d(x, y, z);

图1 高度方向没有填充满时,顶部空白


图2高度方向没有填充满时,上下空白


图3 宽度方向上没有填充满时,右边空白


图4 宽度方向上没有填充满时,左右空白


图5 当控件比图片大时,不需要缩放,上部和右边空白


图6当控件比图片大时,不需要缩放,四周空白

 

 

 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页