在MFC的圖片控制元件上用OpenGL的glDrawPixels函式畫圖時指定起點座標
在MFC的圖片控制元件(Picture Control)上用OpenGL的glDrawPixels函式畫圖時,是從圖片控制元件的左下角開始畫的,當高度上不能填滿控制元件時,控制元件的頂部是空白的(圖中的紅色),如圖1所示;當寬度上不能填滿控制元件時,控制元件的右邊是空白的(圖中的紅色),如圖3所示。
圖1的情況,為了能將圖畫在圖片控制元件高度上的中間(即圖2所示),需要指定畫圖的起點座標。找了好久才在“不想暱稱”轉的文章“opengl版本和擴充套件 (入門學習十四)”(
圖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
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;
}
//先計算出一個經過變換後能夠得到(AdjustXPos, AdjustYPos)的座標(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當控制元件比圖片大時,不需要縮放,四周空白