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);

}
相关推荐
岁忧2 分钟前
(LeetCode 每日一题) 3541. 找到频率最高的元音和辅音 (哈希表)
java·c++·算法·leetcode·go·散列表
小六子成长记25 分钟前
【C++】:list容器全面解析(超详细)
c++·windows·list
IT灰猫1 小时前
C++轻量级配置管理器升级版
开发语言·c++·设计模式·配置管理·ini解析
大白同学4213 小时前
【C++】C++11介绍(Ⅱ)
开发语言·c++
油炸自行车3 小时前
【Qt】编写Qt自定义Ui控件步骤
开发语言·c++·qt·ui·自定义ui控件·qt4 自定义ui控件
呱呱巨基5 小时前
C/C++ 内存管理
c++·笔记·学习
半桔5 小时前
【网络编程】TCP 服务器并发编程:多进程、线程池与守护进程实践
linux·服务器·网络·c++·tcp/ip
橘子135 小时前
C++实战:搜索引擎项目(二)
开发语言·c++·搜索引擎
应用市场6 小时前
Qt C++ 图形绘制完全指南:从基础到进阶实战
开发语言·c++·qt
青草地溪水旁6 小时前
设计模式(C++)详解—单例模式(2)
c++·单例模式