一 定义变量:
CRect m_imgRec;// ONSIZE()后,记录新的客户区大小 Image *m_pImage; //原图 保存原始信息 Bitmap *m_pBmp; //内存中保存的图, 长宽与原图不同,主要在这个位图上进行绘制工作 int m_nImgH;//图高 int m_nImgW;//图宽 float m_fRate; //原图与屏幕的比率 float m_fZoom; //放大倍数
设置目的:
初始时,图像等客户区大小
原图用来保存从文件加载的图片,是原始信息
内存中位图,用于将原图绘制到内存位图中,然后操作此内存位图,最后将其绘制到屏幕上
大小改变时,需要重绘,重绘时需要获得新的客户区大小,因此,可以在ONSIZE时,记录客户区大小。
因为,图片最终要绘制到屏幕上,最佳效果时,图片正好和屏幕一样大, 因此,需要获得一个比率值,记录原图与屏幕的比率。
二:定义重绘函数,重绘时将原图重新绘制到内存位图中
void CImgView::ReDrawImg() //重新建立内存位图 { if (m_pBmp) delete m_pBmp; // 释放内存图片 int nWidth=m_nImgW/m_fRate*m_fZoom; //内存图的宽 int nHeight=m_nImgH/m_fRate*m_fZoom; //内存图的高 m_pBmp=new Bitmap(nWidth,nHeight); //创建内存位图 Graphics grp(m_pBmp); grp.DrawImage(m_pImage,0,0,nWidth,nHeight);//将原图绘制到内存图中 InvalidateRect(m_imgRec); //重绘客户区 }
此函数在加载新图片、改变窗口大小ONSIZE时调用
三 在OnDraw中,将位图绘制到屏幕上
第一步 先创建等屏幕的 内存位图
将全局内存位图绘制到等屏幕内存位图中
第二步 将等屏幕内存位图绘制到屏幕中
if (m_pImage) { Graphics graphics(pDC->GetSafeHdc()); Bitmap bmp(m_imgRec.Width(),m_imgRec.Height()); //第一步 创建与屏幕等大小的内存位图 int nWidth=m_nImgW/m_fRate*m_fZoom; int nHeight=m_nImgH/m_fRate*m_fZoom; SolidBrush backBrush(m_backColor); Graphics grbmp(&bmp); grbmp.FillRectangle(&backBrush,0,0,m_imgRec.Width(),m_imgRec.Height()); //以屏幕背景初始化内存位图背景 if (m_fZoom>1.0) { grbmp.DrawImage(m_pBmp,0,0,nWidth,nHeight); //将全局位图 绘制到等屏幕大小的内存位图上 }else{ //将全局位图 绘制到等屏幕大小的内存位图上 grbmp.DrawImage(m_pBmp, (m_imgRec.Width()-nWidth)/2,(m_imgRec.Height()-nHeight)/2, nWidth,nHeight); } graphics.DrawImage(&bmp,m_imgRec.left,m_imgRec.top,m_imgRec.Width(),m_imgRec.Height()); //第二步 将等屏幕大小内存位图绘制到屏幕上 }