gusucode.com > VC实现图像拉伸、居中、充满显示等 > VC实现图像拉伸、居中、充满显示等/gusucode/ImgWnd.cpp
//Download by http://www.NewXing.com // ImgWnd.cpp : implementation file // #include "stdafx.h" #include "ZoomImgDemo.h" #include "ImgWnd.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CImgWnd CImgWnd::CImgWnd() { m_nStrechType = STRECH_1_1; } CImgWnd::~CImgWnd() { } BEGIN_MESSAGE_MAP(CImgWnd, CStatic) //{{AFX_MSG_MAP(CImgWnd) ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CImgWnd message handlers void CImgWnd::SetImage(UINT resID) { m_bmpImage.LoadBitmap(resID); } void CImgWnd::SetStrechType(int nStrechType) { m_nStrechType = nStrechType; //重画 Invalidate(); } 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); }