Picture控件(其他控件也可以)加载BMP格式图片
方法一:此方法是MFC的原始方法,只能加载BMP格式图片
CRect pictureRect;
m_ctrlPic.GetClientRect(&pictureRect);
CDC* pDC = m_ctrlPic.GetDC(); //m_ctrlPic是Picture控件的变量
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP); //IDB_BITMAP是要加载的位图的ID
BITMAP StatBmp;
bmp.GetBitmap(&StatBmp);
CDC memdc;
memdc.CreateCompatibleDC(pDC);
memdc.SelectObject(&bmp);
CDC ppDC;
ppDC.CreateCompatibleDC(pDC);
CBitmap bmpBuf; //bmpbuf是要放入控件中的位图
bmpBuf.CreateCompatibleBitmap(pDC, pictureRect.right, pictureRect.bottom);
ppDC.SelectObject(&bmpBuf);
ppDC.StretchBlt(pictureRect.left, pictureRect.top, pictureRect.Width(), pictureRect.Height(), &memdc, 0, 0, StatBmp.bmWidth, StatBmp.bmHeight, SRCCOPY); //将IDB_BITMAP_PROTOCOL_3复制到bmpbuf位图中,并按指定的大小转换
m_ctrlPic.SetBitmap((HBITMAP)bmpBuf.Detach());
m_ctrlPic.ReleaseDC(pDC);
memdc.DeleteDC();
ppDC.DeleteDC();
m_ctrlPic:是Picture控件的对象
IDB_BITMAP:是你自己添加的BMP图片资源ID
方法二:此方法是使用MFC的CImage类来加载jpg格式的图片
void ShowImage(CString strImgFilePath)
{
int cx, cy;
CImage image;
CRect rect;
if(!PathFileExists(strImgFilePath)) //判断此路径是否存在
return ;
//根据路径载入图片
image.Load(strImgFilePath);
//获取图片的宽 高度
cx = image.GetWidth();
cy = image.GetHeight();
//获取Picture Control控件的大小
GetDlgItem(IDC_STATIC_Thumbnails)->GetWindowRect(&rect);
//将客户区选中到控件表示的矩形区域内
ScreenToClient(&rect);
//窗口移动到控件表示的区域,使控件的大小等于图片的大小
GetDlgItem(IDC_STATIC_Thumbnails)->MoveWindow(rect.left, rect.top, cx, cy, TRUE);
CWnd *pWnd = NULL;///使用这种方法获取控件句柄,可以动态获取不同控件的句柄,尤其在批量控件设置时很方便
pWnd = GetDlgItem(IDC_STATIC_Thumbnails);//获取控件句柄
pWnd->GetClientRect(&rect);//获取句柄指向控件区域的大小
CDC *pDC = NULL;
pDC = pWnd->GetDC();//获取picture的DC
image.Draw(pDC->m_hDC, rect);//将图片绘制到picture表示的区域内
ReleaseDC(pDC);
}
方法三:使用GDIPlus加载图片,这种方法简单而且支持的图片格式多,此方法是加载外部图片,还可以加载资源ID
CDC* pDC = m_ctrlPic.GetDC(); //m_ctrlPic是Picture控件的变量
Gdiplus::Graphics graphics(pDC->GetSafeHdc());
Gdiplus::Image image(m_StrImgFilePath );//若路径不对,则无法实现在客户区里绘图
graphics.DrawImage(&image, 0, 0);
m_StrImgFilePath:指的是外部图片路径
GDIPlus加载资源ID
关于GDIPlus装载,可以看我博客《GDIPlus装载》很简单
以上这些方法都有一个弊端,不能对图片进行缩放去适应控件的大小