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

}
相关推荐
weixin_307779133 小时前
C++进程监视器与自动启动程序
开发语言·c++·算法
草莓熊Lotso3 小时前
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day12
c语言·开发语言·c++·刷题
用户7227868123444 小时前
C++ 使用分治减小模板递归深度
c++
尘世闲鱼5 小时前
移动零【三种思路】
c++·leetcode
ALex_zry5 小时前
将C++资源管理测试框架整合到GitLab CI/CD的完整实践指南
c++·ci/cd·gitlab
编啊编程啊程11 小时前
JUC之AQS
java·开发语言·jvm·c++·kafka
jingfeng51414 小时前
C++模板进阶
java·c++·算法
头发掉光的程序员14 小时前
第七章 利用Direct3D绘制几何体
c++·windows·图形渲染·direct12
重启的码农19 小时前
llama.cpp 分布式推理介绍(7) 远程后端缓冲区 (RPC Buffer)
c++·人工智能·神经网络
Vect__19 小时前
链表漫游指南:C++ 指针操作的艺术与实践
数据结构·c++·链表