2010-12-02 50 views
3

我有一个Windows(XP)应用程序需要在一个窗口内显示一个二维矩形。该矩形不能被剪裁(即必须总是完全躺在视口内),并且必须保持其调整大小的纵横比。目前,处理布局的方法会扭曲矩形的长宽比以匹配窗口。我想要矩形缩放到窗口并居中在窗口中(再次,没有剪辑)。现在的方法如下。 lWinDist和lMaxDepth是要被显示的矩形的宽度和高度(在一英寸的48ths,如果它的事项):在调整窗口大小时保留二维对象的纵横比

void CRoRRecView::RedoLayout(long lWinDist, long lMaxDepth) 
{ 
    CDC* pDC = GetDC() ; 

    if (pDC != NULL) 
    { 
     m_lWinDist = lWinDist; 
     GetClientRect(m_rectClient) ; 
     int nClientWidth = m_rectClient.Width(); 
     int nClientHeight = m_rectClient.Height(); 
     glViewport(0, 0, nClientWidth, nClientHeight); 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 

     m_fWinXDist = (float) lWinDist ; 
     m_fWinYDist = lMaxDepth ; 
     m_fAspectRatio = m_fWinXDist/m_fWinYDist; 

     glOrtho(0.0, m_fWinXDist, 0.0, m_fWinYDist, -1, 1) ; 

     glRotatef(180.0, 0,1,0); 
     glTranslatef((float)(-1 * lWinDist),0,0); // Translate across the x axis 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 

     ReleaseDC(pDC) ; 
    } 
} 

回答

3

这应该规模按预期:

// g++ main.cpp -lglut -lGL 
#include <GL/glut.h> 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    double w = glutGet(GLUT_WINDOW_WIDTH); 
    double h = glutGet(GLUT_WINDOW_HEIGHT); 
    double ar = w/h; 
    glOrtho(-2 * ar, 2 * ar, -2, 2, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3ub(255, 0, 0); 
    glBegin(GL_QUADS); 
    glVertex2i(-1, -1); 
    glVertex2i( 1, -1); 
    glVertex2i( 1, 1); 
    glVertex2i(-1, 1); 
    glEnd(); 

    glutSwapBuffers(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 
    glutInitWindowSize(640, 480); 
    glutCreateWindow("Aspect Ratio"); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 
0

尝试这种情况:

#include <GL/glut.h> 

size_t win_w = 0; 
size_t win_h = 0; 

void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, win_w, 0, win_h, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3ub(255,0,0); 
    glPushMatrix(); 
     glTranslatef(win_w/2,win_h/2,0); 
     glScalef(50,50,50); 
     glBegin(GL_QUADS); 
      glVertex2f(-1,-1); 
      glVertex2f(1,-1); 
      glVertex2f(1,1); 
      glVertex2f(-1,1); 
     glEnd(); 
    glPopMatrix(); 

    glFlush(); 
    glutSwapBuffers(); 
} 

void reshape(int w, int h) 
{ 
    win_w = w; 
    win_h = h; 
    glViewport(0, 0, w, h); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 

    glutInitWindowSize(800,600); 
    glutCreateWindow("Aspect Ratio"); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutMainLoop(); 
    return 0; 
} 
+1

谢谢。但是,虽然保持对象的纵横比和居中,但窗口大小不会调整大小。也就是说,如果物体开始占据窗口高度的3/4,则在调整大小后,它总是占据窗口高度的3/4。 – PSU 2010-12-03 22:21:19

+0

@PSU:是的,你说得对。我有一个稍微不同的版本,做了正确的事情,我会看看我是否可以把它拉起来。 – genpfault 2010-12-04 00:26:15

1

试试这个整形功能。它将保持您的宽高比,调整对象大小,并使视口集中。

// initial window screen size 
int WIDTH = 400; 
int HEIGHT = 300; 

// reshape function, call with glutReshapeFunc(reshape) in yout main function 
void reshape(int width, int height) { 
    const float ar_origin = (float) WIDTH/(float) HEIGHT; 
    const float ar_new = (float) width/(float) height; 

    float scale_w = (float) width/(float) WIDTH; 
    float scale_h = (float) height/(float) HEIGHT; 
    if (ar_new > ar_origin) { 
     scale_w = scale_h; 
    } else { 
     scale_h = scale_w; 
    } 

    float margin_x = (width - WIDTH * scale_w)/2; 
    float margin_y = (height - HEIGHT * scale_h)/2; 

    glViewport(margin_x, margin_y, WIDTH * scale_w, HEIGHT * scale_h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, WIDTH/ar_origin, 0, HEIGHT/ar_origin, 0, 1.0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity() ; 
} 
0

我想你应该看看这个以得到正确的数字:

self.hOffset = (self.wOffset/(16.0/9.0)); 
self.xOffset = ((int)ceil((_backingWidth/2.0) - ((_backingWidth + self.wOffset)/2.0))); 
self.yOffset = ((int)ceil((_backingHeight/2.0) - ((_backingHeight + self.hOffset)/2.0))); 

glViewport(self.xOffset, self.yOffset, _backingWidth + self.wOffset, _backingHeight + self.hOffset); 

在上面的代码,wOffset,这是图像的宽度,或采取它的值通过改变滑块。第一行增加高度,因为宽度以正确的比例增加,恰好为16:9(将宽度除以高度以得到比率效果不佳,明确指定它的效果最好)。接下来的两行调整图像的x,y坐标,使其随着大小的增加或减小而始终保持居中。

这是迄今为止更简单,更简单的方法 - 在GPU上更轻。如果我在这里看到的超级编码方法有更好的理由,我无法弄清楚。祝你好运。

相关问题