Ich habe eine Windows-Anwendung (XP), die ein zweidimensionales Rechteck innerhalb eines Fensters anzeigen muss. Das Rechteck darf nicht beschnitten werden (d.h. es muss immer vollständig innerhalb des Ansichtsfensters liegen) und muss sein Seitenverhältnis bei der Größenänderung beibehalten. Derzeit verzerrt die Methode, die das Layout behandelt, das Seitenverhältnis des Rechtecks, um es an das Fenster anzupassen. Ich möchte, dass das Rechteck auf das Fenster skaliert und im Fenster zentriert wird (wiederum ohne Beschneidung). Die Methode, wie es steht, ist unten. lWinDist und lMaxDepth sind die Breite und Höhe des Rechtecks angezeigt werden (in 48ths von einem Zoll, wenn es darauf ankommt):
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 ) ;
}
}