MFC PictureControl控件上自适应显示图片,分图片失真或者图片不失真两种
ShowPicture(CString Filepath)
{
/*----根据图片文件路径显示图片---------------------------------*/
int height, width;
CRect rect;//定义矩形类
CRect rect1;
CImage image; //创建图片类
image.Load(Filepath);//加载图片
height = image.GetHeight();//得到图片高度
width = image.GetWidth();//得到图片宽度
m_showPMT.GetClientRect(&rect); //获得pictrue控件所在的矩形区域,m_showPMT为与PictureControl相关联的控件变量
CDC *pDc = m_showPMT.GetDC();//获得pictrue控件的Dc
SetStretchBltMode(pDc->m_hDC,STRETCH_HALFTONE);
if(width<=rect.Width() && height<=rect.Width()) //如果图片的尺寸小于图片控件尺寸,则不缩放显示
{
rect1 = CRect(rect.TopLeft(), CSize(width,height));
image.StretchBlt(pDc->m_hDC,rect1,SRCCOPY); //将图片画到Picture控件表示的矩形区域
}
else//如果图片的尺寸大于图片控件的尺寸
{
float xScale=(float)rect.Width()/(float)width;//求X方向的缩放因子
float yScale=(float)rect.Height()/(float)height;//求Y方向的缩放因子
//为了图片在图片控件上显示不失真,采用X和Y方向上较小的缩放因子作为缩放因子,此时图片不失真,但是可能不会铺满整个图片控件区域
float ScaleIndex=(xScale<=yScale?xScale:yScale);
//rect1 = CRect(rect.TopLeft(), CSize((int)width*xScale,(int)height*xScale));//此时图片失真,但是会铺满整个图片控件区域
rect1 = CRect(rect.TopLeft(), CSize((int)width*ScaleIndex,(int)height*ScaleIndex));
image.StretchBlt(pDc->m_hDC,rect1,SRCCOPY); //将图片画到Picture控件表示的矩形区域
}
ReleaseDC(pDc);//释放picture控件的Dc
}
图片失真,但是铺满整个图片控件区域:
图片不失真,但是没有铺满整个图片控件区域:
如果您觉得这篇博文有用,请访问我的个人站:http://www.stubbornhuang.com,更多博文干货等着您。