【VC++】(一):MFC在Picture control控件中显示Bitmap

本文介绍了在VC++环境下如何使用PictureControl显示Bitmap图片。通过一个具体的代码示例,展示了如何打开并加载位图文件,然后将其显示在对话框中的静态控件上。

今天在《VC++指纹模式识别系统及算法概述》一书中,看到有一段代码——在Picture Control中显示Bitmap。把它的代码和显示结果摘出来,作为今天的小小学习成果,鼓励一下自己。代码中所用的函数能够理解,还有一些函数的详细用法待以后补充。

void CFingerprintDlg::OnBnClickedOpen()
{
	// TODO: 在此添加控件通知处理程序代码
	CString ImagePathName;
	CFileDialog dlg(TRUE, _T("bmp"), _T(".bmp"),
		OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "Bitmap(*.BMP)|*.BMP||");

	HBITMAP m_hImage;
	if (dlg.DoModal() != IDOK)
	{
		return;
	}

	ImagePathName = dlg.GetPathName();

	m_hImage = (HBITMAP)LoadImage(AfxGetInstanceHandle(),
		ImagePathName, 
		IMAGE_BITMAP,
		0,
		0,
		LR_LOADFROMFILE|LR_CREATEDIBSECTION);

	GetDlgItem(IDC_STATIC_IMAGE)->SendMessage(STM_SETIMAGE, IMAGE_BITMAP,
		(LPARAM)m_hImage);
}

运行结果截图:



MFC中动态更换Picture Control控件显示图片有以下几种常见方法: #### 使用 `CBitmap` 显示 通过 `CBitmap` 类加载位图资源,并将其显示在 `Picture Control` 中。示例代码如下: ```cpp void Cpicture_test_controlDlg::OnBnClickedButton1() { // 需要在资源视图中增加资源,资源类型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); } ``` 此方法通过按钮点击事件触发,加载指定的位图资源并显示在 `Picture Control` 中,涉及图片的加载、设备上下文的获取和图片的绘制等操作[^2]。 #### 使用 `CImage` 类 `CImage` 类可以加载多种格式的图片文件,然后将其显示在 `Picture Control` 中。示例代码如下: ```cpp void COpticDisplayDlg::ShowLensPic(CString imgPath) { int height, width; CRect rect; // 定义矩形类 CRect rect1; CImage image; // 创建图片类 image.Load(imgPath); height = image.GetHeight(); width = image.GetWidth(); pic_display.GetClientRect(&rect); // 获得pictrue控件所在的矩形区域 CDC *pDc = pic_display.GetDC(); // 获得pictrue控件的Dc SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE); if (width <= rect.Width() && height <= rect.Width()) { // 小图片,不缩放 rect1 = CRect(rect.TopLeft(), CSize(width, height)); image.StretchBlt(pDc->m_hDC, rect1, SRCCOPY); // 将图片画到Picture控件表示的矩形区域 } else { float xScale = (float)rect.Width() / (float)width; float yScale = (float)rect.Height() / (float)height; float ScaleIndex = (xScale >= yScale) ? xScale : yScale; rect1 = CRect(rect.TopLeft(), CSize((int)width * ScaleIndex, (int)height * ScaleIndex)); image.StretchBlt(pDc->m_hDC, rect1, SRCCOPY); // 将图片画到Picture控件表示的矩形区域 } ReleaseDC(pDc); // 释放picture控件的Dc } ``` 该方法可以根据图片的大小进行缩放处理,适用于不同尺寸的图片显示,通过传入图片的路径加载图片并显示在 `Picture Control` 中[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值