MFC中Picture Control控件显示照片的几种方式
目前使用CImage和CBitmap两个类,还有是将CImage转CBitmap显示。
MFC界面拖拽一个button按钮和一个Picture Control控件。
1.CImage显示。这种方式显示图片会有颜色不对的情况
void Cpicture_test_controlDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CImage image;
HRESULT hResult = image.Load("D:\\jpeg.bmp");
if (!SUCCEEDED(hResult)) {
AfxMessageBox("imread error");
}
//获取picture control 句柄
CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);
//获取控件大小
CRect rect;
pStatic->GetClientRect(&rect);
int controlWidth = rect.Width();
int controlHeight = rect.Height();
//获取图片原始尺寸
int imageWidth = image.GetWidth();
int imageHeight = image.GetHeight();
//创建兼容的DC
CDC *pDC = pStatic->GetDC();
CDC memDC;
memDC.CreateCompatibleDC(pDC);
//创建兼容的位图,并选入内存DC
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC, controlWidth, controlHeight);
CBitmap* pOldbmp = memDC.SelectObject(&bmp);
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo); // 获取位图信息
//清空背景
memDC.FillSolidRect(&rect, pDC->GetBkColor());
//使用CImage绘制倒内存DC, 这里使用缩放
image.Draw(memDC.m_hDC, 0, 0, controlWidth, controlHeight, 0, 0, imageWidth, imageHeight);
//将内存DC绘制到控件上
pDC->BitBlt(0, 0, controlWidth, controlHeight, &memDC, 0, 0, SRCCOPY);
//清理
memDC.SelectObject(pOldbmp);
ReleaseDC(pDC);
}
2.CBitmap显示
void Cpicture_test_controlDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//需要再资源视图中增加资源,资源类型为Bitmap
CBitmap img;
if (!img.LoadBitmap(IDB_BITMAP2)) {
AfxMessageBox("imread error");
}
// 获取Picture Control的设备上下文
CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);
CDC *pDC = pStatic->GetDC();
// 获取对话框和图片的尺寸
CRect rect;
pStatic->GetClientRect(&rect);
BITMAP bmpInfo;
img.GetBitmap(&bmpInfo);
// 创建兼容的内存设备上下文
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = memDC.SelectObject(&img);
// 绘制缩放后的图片
int iStretchMode = pDC->SetStretchBltMode(COLORONCOLOR); // 色彩保留
pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);
pDC->SetStretchBltMode(iStretchMode);
// 清理
memDC.SelectObject(pOldBitmap);
ReleaseDC(pDC);
}
3.将CImage转CBitmap显示。有两种方式
void Cpicture_test_controlDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CImage image;
HRESULT hResult = image.Load("D:\\jpeg.bmp");
if (!SUCCEEDED(hResult)) {
AfxMessageBox("imread error");
}
HBITMAP hBitmap = image.Detach();
CBitmap img;
img.DeleteObject();
img.Attach(hBitmap);
// 获取Picture Control的设备上下文
CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);
CDC *pDC = pStatic->GetDC();
// 获取对话框和图片的尺寸
CRect rect;
pStatic->GetClientRect(&rect);
BITMAP bmpInfo;
img.GetBitmap(&bmpInfo);
// 创建兼容的内存设备上下文
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = memDC.SelectObject(&img);
// 绘制缩放后的图片
int iStretchMode = pDC->SetStretchBltMode(COLORONCOLOR); // 色彩保留
pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);
pDC->SetStretchBltMode(iStretchMode);
// 清理
memDC.SelectObject(pOldBitmap);
ReleaseDC(pDC);
}
void Cpicture_test_controlDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CImage image;
HRESULT hResult = image.Load("D:\\jpeg.bmp");
if (!SUCCEEDED(hResult)) {
AfxMessageBox("imread error");
}
HBITMAP hBitmap = image.Detach();
CBitmap *img = CBitmap::FromHandle(hBitmap);
// 获取Picture Control的设备上下文
CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);
CDC *pDC = pStatic->GetDC();
// 获取对话框和图片的尺寸
CRect rect;
pStatic->GetClientRect(&rect);
BITMAP bmpInfo;
img->GetBitmap(&bmpInfo);
// 创建兼容的内存设备上下文
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = memDC.SelectObject(img);
// 绘制缩放后的图片
int iStretchMode = pDC->SetStretchBltMode(COLORONCOLOR); // 色彩保留
pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);
pDC->SetStretchBltMode(iStretchMode);
// 清理
memDC.SelectObject(pOldBitmap);
ReleaseDC(pDC);
}