图片浏览程序初始设置



一   定义变量:

	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()); //第二步  将等屏幕大小内存位图绘制到屏幕上




	}





你可能感兴趣的:(图片浏览程序初始设置)