MFC将png添加成资源,然后用GDI+绘制

如下图,将png图添加到资源中,这样在编译程序时,编译器会自动将png图打包到生成得exe中,这样可以防止图片资源丢失或者被普通人盗用。

将资源中的png图使用GDI+绘制的代码:

BOOL CFrameView::ImageFormResource(UINT nID, LPCTSTR str, Image *& pImage)
{
	HINSTANCE hIns = AfxGetResourceHandle();
	HRSRC hRsrc = ::FindResource(hIns, MAKEINTRESOURCE(nID), str);
	if(!hRsrc)
		return FALSE;

	DWORD dwLen = SizeofResource(hIns, hRsrc);
	BYTE * lpRsrc = (BYTE *)LoadResource(hIns, hRsrc);
	if(!lpRsrc)
		return FALSE;

	HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, dwLen);
	BYTE * pMem = (BYTE *)GlobalLock(m_hMem);
	memcpy(pMem, lpRsrc, dwLen);
	GlobalUnlock(m_hMem);
	IStream * pStream;
	CreateStreamOnHGlobal(m_hMem, FALSE, &pStream);

	pImage = Image::FromStream(pStream);//如果pImage加载成功,需要释放,不然会有内存泄漏
	pStream->Release();
	FreeResource(lpRsrc);
	GlobalFree(m_hMem);
	return TRUE;
}

使用实例代码:

void CFrameView::DrawScreenFrameBackImage(CDC * pDC, Rect rect)
{
	Graphics g(pDC->GetSafeHdc());
	Image * im = NULL;
	ImageFormResource(IDB_FRAME, _T("PNG"), im);
	
	if (im->GetLastStatus() == Ok)//如果im加载成功,需要释放,不然会有内存泄漏
	{
		g.DrawImage(im, rect);
		delete im;
	}
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 MFC 中使用 GDI+PNG 图像显示到指定的矩形区域中,可以按照以下步骤进行操作: 1. 在头文件中包含 GDI+ 库: ``` #include <gdiplus.h> #pragma comment (lib,"Gdiplus.lib") using namespace Gdiplus; ``` 2. 在 MFC 对话框的 OnInitDialog 函数中初始化 GDI+: ``` GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); ``` 3. 加载 PNG 图像并创建 GDI+ 的 Image 对象: ``` Image* pImage = Image::FromFile(L"test.png", FALSE); ``` 4. 获取指定矩形区域的设备上下文(DC): ``` CRect rect; GetDlgItem(IDC_STATIC_IMAGE)->GetClientRect(rect); CDC* pDC = GetDlgItem(IDC_STATIC_IMAGE)->GetDC(); ``` 5. 创建 GDI+ 的 Graphics 对象,并将其绑定到 DC 上: ``` Graphics graphics(pDC->GetSafeHdc()); ``` 6. 将 PNG 图像绘制到指定矩形区域中: ``` graphics.DrawImage(pImage, rect.left, rect.top, rect.Width(), rect.Height()); ``` 7. 释放 GDI+ 相关资源: ``` delete pImage; GdiplusShutdown(gdiplusToken); ``` 完整代码示例: ``` #include <gdiplus.h> #pragma comment (lib,"Gdiplus.lib") using namespace Gdiplus; ... BOOL CMyDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // 初始化 GDI+ GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // 加载 PNG 图像并创建 Image 对象 Image* pImage = Image::FromFile(L"test.png", FALSE); // 获取指定矩形区域的 DC CRect rect; GetDlgItem(IDC_STATIC_IMAGE)->GetClientRect(rect); CDC* pDC = GetDlgItem(IDC_STATIC_IMAGE)->GetDC(); // 创建 Graphics 对象,并将其绑定到 DC 上 Graphics graphics(pDC->GetSafeHdc()); // 将 PNG 图像绘制到指定矩形区域中 graphics.DrawImage(pImage, rect.left, rect.top, rect.Width(), rect.Height()); // 释放资源 delete pImage; GdiplusShutdown(gdiplusToken); return TRUE; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值