MFC+OpenGL 怎么计算投影区域在窗口中的大小

Ilson_ 2018-04-24 11:53:56
我用的是正交投影gluOrtho2D以纹理贴图的方式显示一张BMP位图,当我滚动鼠标滚轮时位图会缩小放大;我要求的是纹理贴图在窗口中的大小,如红色框大小:




这是我显示图片的代码:

//贴图的矩形大小与图片比例一致
#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();
}


这是OnSize()函数代码:

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);
}


请问我该怎么求在窗口中投影的大小(图片的大小、红框大小),随着缩放量改变而改变
...全文
580 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ilson_ 2018-04-25
  • 打赏
  • 举报
回复

//计算这个视图的总大小
//这里做判断是因为要根据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_);
	}
《VC++.NET精彩百例》配套代码 [涉及平台] VC++.NET [作者] void [文件大小] 2969KB [更新日期] 2005-10-30 一、资源说明 第1章 界面编程 实例1 "欢迎"界面 实例2 动态字幕效果 实例3 透明窗体 实例4 静态切分窗口 实例5 滚动视图 实例6 字形窗口 实例7 多边形窗口 实例8 HTML浏览器 实例9 窗口的动画效果 实例10 实现动画图标 实例11 动态切分窗口 实例12 橡皮区矩形 实例13 多个定时器 实例14 椭圆窗体 第2章 图像和多媒体编程 实例 15 BMP文件浏览器 实例 16 图像的镜像处理 实例 17 图像的分割处理 实例 18 使用画笔 实例 19 使用画刷 实例 20 显示空心字 实例 21 显示渐进字体 实例 22 显示艺术字体 实例 23 马赛克效果 实例 24 MiDi播放器 实例 25 CD播放器 实例 26 纹理场景效果 实例 27 Bezier线框曲面 实例 28 输出旋转文本 第3章 对话框与控件编程 实例 29 树形控件 实例 30 列表控件 实例 31 时间控件 实例 32 彩色按钮 实例 33 组合框控件 实例 34 单选按钮和复选框 实例 35 工具栏编程 实例 36 状态栏编程 实例 37 对话框显示图片 实例 38 模式对话框 实例 39 非模式对话框 实例 40 位图按钮 实例 41 对话栏编程 第4章 文件与系统编程 实例 42 鼠标绘图 实例 43 键盘输入 实例 44 获取文件属性 实例 45 访问修改注册表 实例 46 设定计算机名称 实例 47 列举驱动器 实例 48 关闭操作系统 实例 49 查找文件 实例 50 获取磁盘空间 实例 51 读写文件 实例 52 系统进程检测 实例 53 获取系统信息 实例 54 获取文件夹路径 实例 55 设定系统时间 第5章 线程操作与COM组件编程 实例 56 创建线程 实例 57 线程间的通信 实例 58 使用自定义消息 实例 59 线程间的优先级 实例 60 线程间的同步 实例 61 重用C++对象 实例 62 创建永久对象 实例 63 MFC建立COM 实例 64 测试COM组件 第6章 网络和数据库编程 实例 65 聊天室服务器 实例 66 HTTP应用程序 实例 67 FTP应用程序 实例 68 HTTP服务器 实例 69 发送电子邮件 实例 70 接收电子邮件 实例 71 ATL Server Web 实例 72 DOA获取信息 实例 73 DAO数据库编程 实例 74 ADO访问数据库 第7章 OPENGL编程 实例 75 绘制对比矩形 实例 76 绘制直线 实例 77 绘制圆和椭圆 实例 78 绘制三角形 实例 79 缩放变换 实例 80 旋转变换 实例 81 平移变换 实例 82 绘制点 实例 83 OpenGL编程 实例 84 实现简单动画 实例 85 视口投影变换 实例 86 键盘控制图形 第8章 OLE和GDI+编程 实例 87 OLE容器 实例 88 保存OLE信息 实例 89 设置跟踪矩形 实例 90 显示多个OLE项 实例 91 ActiveX服务器 实例 92 插值模式 实例 93 图像区域平铺 实例 94 文字填充 实例 95 图形容器 实例 96 线帽组合 实例 97 半透明线条 实例 98 颜色再变换表 实例 99 旋转和扭曲图像 实例 100 显示垂直文本

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧