目标
实现滚轮的缩放:滚轮向上,以鼠标当前在绘图区的位置进行放大;滚轮向下,以绘图去的中心进行缩小。
核心
1、OnDraw函数
2、CImage
3、CImage::StretchBlt方法【缩放原理】
4、滚轮的消息响应函数
5、工作区Client坐标、屏幕Screen坐标
核心概述
1、OnDraw函数
- 应用窗口的工作区Client进行绘图的代码都必须写在这个函数当中
2、CImage
- 首先需要用一个CImage的对象去加载一个地址的图片,也就是我们要显示的图片
- 如果之前有图片对象,则销毁对象,重新创建
- 然后获取相关的图片参数:宽、高
//判断是否加载过图片
if (!cimgImage.IsNull())
{
//加载过,销毁
cimgImage.Destroy();
}
//加载图片
cimgImage.Load(cstrLoadPathName);
//放大倍数清零
m_fMultiple = 0;
//原图的宽度
m_nWidthSrc = cimgImage.GetWidth();
//原图的高度
m_nHeightSrc = cimgImage.GetHeight();
//源的原点清零
m_OriginSrcPoint = (0, 0);
//使当前的窗口无效:让Windows知道这个窗口现在该重新绘制一下了
Invalidate();
3、CImage::StretchBlt()方法【缩放原理】
- 显示图片的核心方法
- 主要是通过改变源Src的坐标原点xSrc、ySrc以及宽度nSrcWidth和高度nSrcHeight进行缩放的操作
- 坐标原点影响缩放的位置
- 宽度nSrcWidth、高度nSrcHeight影响缩放的大小(小于原图的宽高:相当于放大原图的某个区域)
BOOL StretchBlt(
//目标
HDC hDestDC, //对目标设备上下文的句柄。【pDC->m_hDC】pDC是画布的对象指针,m_hDC是对象的成员,画布的句柄
int xDest, //x坐标,在逻辑单位,目标矩形的左上角。
int yDest, //y坐标,在逻辑单位,目标矩形的左上角。
int nDestWidth, //宽度,在逻辑单位,目标矩形。
int nDestHeight, //高度,在逻辑单位,目标矩形。
//源:不需要源的DC句柄,加载的时候已经获取
int xSrc, //x坐标,在逻辑单位,源矩形的左上角。
int ySrc, //y坐标,在逻辑单位,源矩形的左上角。
int nSrcWidth, //宽度,在逻辑单位,源矩形。
int nSrcHeight, //高度,在逻辑单位,源矩形。
DWORD dwROP = SRCCOPY
) const throw( );
4、滚轮的消息响应函数
- 类视图》CxxxView类》右键》属性》消息》WM_MOUSEWHEEL:添加
- 主要有滚轮上/下的标识为zDelta,屏幕坐标系的坐标点pt
- BOOL CMyRipView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
5、工作区Client坐标、屏幕Screen坐标
- 屏幕坐标系转工作区坐标系:ScreenToClient(&p