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

}
相关推荐
RAN_PAND8 分钟前
STL介绍1:vector、pair、string、queue、map
开发语言·c++·算法
mit6.8243 小时前
[实现Rpc] 通信-Muduo库的实现 | && 完美转发 | reserve | unique_lock
c++·网络协议·rpc
JANGHIGH4 小时前
c++ std::list使用笔记
c++·笔记·list
画个逗号给明天"4 小时前
C++STL容器之list
开发语言·c++
Lqingyyyy5 小时前
P2865 [USACO06NOV] Roadblocks G 与最短路的路径可重复的严格次短路
开发语言·c++·算法
C语言小火车6 小时前
深入解析C++26 Execution Domain:设计原理与实战应用
java·开发语言·c++·异构计算调度·c++26执行模型·domain定制
ox00807 小时前
C++ 设计模式-中介者模式
c++·设计模式·中介者模式
黄铎彦7 小时前
使用GDI+、文件和目录和打印API,批量将图片按文件名分组打包成PDF
c++·windows·pdf
Ciderw7 小时前
LLVM编译器简介
c++·golang·编译·编译器·gcc·llvm·基础设施