VC++图片伸缩按比例放大缩小,有一些功能挺不错,在窗口中单击【1:1】按钮,图片不缩放;单击【按宽度】按钮,图片充满图片框的宽度;单击【按高度】按钮,图片充满图片框的高度;单击【充满】按钮,图片充满整个图片框;单击【居中显示】按钮,图片正好出现于图片框的中心,宽度和高度分别为图片框宽度和高度的一半。VC++图片伸缩按比例放大缩小代码编写步骤:
(1)通过AppWizard 生成一个基于对话框的应有程序ZoomImgDemo。
(2)以CStatic 为基类派生类CImgWnd,并在其头文件中定义几种缩放模式:
#define STRECH_1_1 0
#define STRECH_FULL_X 1
#define STRECH_FULL_Y 2
#define STRECH_FULL 3
#define STRECH_CENTER 4
(3)在CImgWnd 的在头文件中定义整型的缩放参数m_nStretchType,在构造函数中初始化,并增加SetStretchType 函数来设定缩放类型:
CImgWnd::CImgWnd()
{
m_nStretchType = STRECH_1_1;
}
void CImgWnd::SetStretchType(int nStretchType)
{
m_nStretchType = nStretchType;
//重画
Invalidate();
}
(4)给CImgWnd 增加CBitmap 类型的变量m_bmpImage,并增加SetImage 函数来获得位图资源:
void CImgWnd::SetImage(UINT resID)
{
m_bmpImage.LoadBitmap(resID);
}
(5)重载CImgWnd 的OnPaint 函数,实现图片的缩放显示:
void CImgWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
//获得窗口大小
CRect r;
GetClientRect(&r);
//填充背景
HBRUSH brush = (HBRUSH)::GetStockObject(GRAY_BRUSH);
::FillRect(dc.m_hDC,&r,brush);
dc.SetStretchBltMode(HALFTONE);
//将位图选进设备场景中
CDC memdc;
memdc.CreateCompatibleDC( &dc );
CBitmap* pOldBmp= memdc.SelectObject(&m_bmpImage);
//获得位图参数
BITMAP bmp;
m_bmpImage.GetBitmap(&bmp);
//开始缩放
switch(m_nStrechType)
{
case STRECH_1_1://1:1
dc.BitBlt(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,SRCCOPY);
break;
case STRECH_FULL_X://按宽度
dc.StretchBlt(r.left,r.top,r.Width(),bmp.bmHeight,&memdc,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY);
break;
case STRECH_FULL_Y://按高度
dc.StretchBlt(r.left,r.top,bmp.bmWidth,r.Height(),&memdc,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY);
break;
case STRECH_FULL://充满窗口
dc.StretchBlt(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY);
break;
case STRECH_CENTER://居中显示,大小为窗口的一半
dc.StretchBlt(r.Width()/4,r.Height()/4,r.Width()/2,r.Height()/2,&memdc,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY);
break;
}
//还原
memdc.SelectObject(pOldBmp);
}
(6)给对话框增加几个缩放的按钮,分别为“1:1”、“按宽度”、“按高度”、“充满”和“居中显示”,并响应消息:
//1:1
void CZoomImgDemoDlg::On11()
{
m_wndImage.SetStrechType(STRECH_1_1);
}
//按宽度
void CZoomImgDemoDlg::OnFullX()
{
m_wndImage.SetStrechType(STRECH_FULL_X);
}
//按高度
void CZoomImgDemoDlg::OnFullY()
{
m_wndImage.SetStrechType(STRECH_FULL_Y);
}
//充满窗口
void CZoomImgDemoDlg::OnFull()
{
m_wndImage.SetStrechType(STRECH_FULL);
}
//居中显示,大小为窗口的一半
void CZoomImgDemoDlg::OnCenter()
{
m_wndImage.SetStrechType(STRECH_CENTER);
}