1. 程式人生 > >在MFC的圖片控制元件上用OpenGL的glDrawPixels函式畫圖時指定起點座標

在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當控制元件比圖片大時,不需要縮放,四周空白