1,221
社区成员
发帖
与我相关
我的任务
分享
//贴图的矩形大小与图片比例一致
#define MAPWIDTH 20.0
#define MAPHIGHT GLfloat(20.0 / (1920.0 / 1080.0))
//背景图
void CDrawView::DrawImage()
{
glPushMatrix();
glLoadIdentity();
glScalef(mScale_, mScale_, 1); //横纵坐标缩放量
glTranslatef(mTranslateX_ * mVcWidthRatio_, mTranslateY_ * mVcHightRatio_, 0); //横纵坐标平移量
//纹理图像的坐标范围是从(0,0)到(1,1),左下角为(0,0),右上角为(1,1)
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2d(0.0, 0.0);
glVertex2d(-MAPWIDTH, -MAPHIGHT);
glTexCoord2d(1.0, 0.0);
glVertex2d(MAPWIDTH, -MAPHIGHT);
glTexCoord2d(1.0, 1.0);
glVertex2d(MAPWIDTH, MAPHIGHT);
glTexCoord2d(0.0, 1.0);
glVertex2d(-MAPWIDTH, MAPHIGHT);
glEnd();
glDisable(GL_TEXTURE_2D);
glPopMatrix();
}
mViewHalfWidth_ = 12;
mViewHalfHight_ = 12;
void CDrawView::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
//以下两行保证窗口大小变化后图像中心点不发生变化
mTranslateX_ *= (GLfloat)(cx * 1.0 / mClientWidth_);
mTranslateY_ *= (GLfloat)(cy * 1.0 / mClientHight_);
mClientWidth_ = cx;
mClientHight_ = cy;
if (mClientHight_==0) // Prevent A Divide By Zero By 防止除以0
{
mClientHight_=1; // Making Height Equal One
}
if (mClientWidth_==0) // Prevent A Divide By Zero By
{
mClientWidth_=1; // Making Height Equal One
}
mVcWidthRatio_ = (GLfloat)(mViewHalfWidth_ * 2 / mClientWidth_);//视窗比(视景体/窗口)
mVcHightRatio_ = (GLfloat)(mViewHalfHight_ * 2 / mClientHight_);
wglMakeCurrent(mhDC_, mhGLContext_);
glViewport(0, 0, cx, cy); // Reset The Current Viewport
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix 选择投影矩阵
glLoadIdentity(); // Reset The Projection Matrix
//改变窗口大小时,使视图等比缩放
//正交投影
GLdouble glScale = (GLdouble)cx / cy;
if (cx <= cy)
gluOrtho2D(-mViewHalfWidth_, mViewHalfWidth_, -mViewHalfHight_ / glScale, mViewHalfHight_ / glScale);
else
gluOrtho2D(-mViewHalfWidth_ * glScale, mViewHalfWidth_ * glScale, -mViewHalfHight_, mViewHalfHight_);
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
CurrentGLpoint(CPoint(), TRUE);
}
//计算这个视图的总大小
//这里做判断是因为要根据OnSize函数里面设置gluOrtho2D()平行投影的大小计算
GLdouble fScale = (GLdouble)mClientWidth_ / mClientHight_;
if (mClientWidth_ <= mClientHight_)
{
//mViewHalfWidth_ * 2实景体宽度 mViewHalfHight_ * 2 / fScale实景体高度
//(mViewHalfWidth_ * 2 / mClientWidth_ 求出实景体与窗口宽的比
//MAPWIDTH * 2纹理贴图时给定的矩形框的宽 MAPHIGHT * 2纹理贴图时给定的矩形框的高 然后各乘于缩放量mScale_ 得到缩放后的纹理矩形框大小
//然后用 缩放后的纹理矩形宽/实景体与窗口宽的比 得到窗口的投影大小
//else分支也是一样
int w = (MAPWIDTH * 2 * mScale_) / (mViewHalfWidth_ * 2 / mClientWidth_);
int h = (MAPHIGHT * 2 * mScale_) / (mViewHalfHight_ * 2 / fScale / mClientHight_);
}
else
{
int w = (MAPWIDTH * 2 * mScale_) / (mViewHalfWidth_ * 2 * fScale / mClientWidth_);
int h = (MAPHIGHT * 2 * mScale_) / (mViewHalfHight_ * 2 / mClientHight_);
}