使用CStatic显示图片(bmp、ico、png)
阅读原文时间:2023年07月15日阅读:1

一、显示bmp及ico

//h文件

CStatic m_static;

//cpp文件

CBitmap bitmap;
bitmap.LoadBitmapW(IDB_BITMAP); //加载位图
BITMAP bmp;
bitmap.GetBitmap(&bmp); //获取位图参数
CRect rect(10,10,10+bmp.bmWidth,10+bmp.bmHeight); //显示区域
m_static.Create(L"",WS_CHILD | SS_BITMAP | SS_CENTERIMAGE,rect,this,12345); //创建static

//关联控件和位图,其中 IDB_BITMAP 是加载的位图资源ID号
m_static.SetBitmap(::LoadBitmap(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDB_BITMAP)));

m_static.ShowWindow(true);

显示ICO和BMP是一个道理,函数改成LoadIcon 、SetIcon等就行了

二、路径动态加载方式显示PNG

//h文件

#include "atlimage.h"

CStatic m_static;

//cpp文件

CImage image;
image.Load(_T("res/node.png")); //以相对路径加载PNG图片
HBITMAP hBmp = image.Detach();

CRect rect(50,50,50+image.GetWidth(),50+image.GetHeight());
m_static.Create(L"", SS_BITMAP | SS_CENTERIMAGE,rect,this,12346);
m_static.SetBitmap(hBmp);
m_static.ShowWindow(true);

三、静态加载资源方式显示PNG

//h文件

#include "atlimage.h"

CStatic m_static;

//cpp文件

CImage image;
LoadImageFromIDResource(&image,IDB_PNG,_T("PNG")); //自定义函数加载资源
HBITMAP hBmp = image.Detach();

CRect rect(50,50,50+image.GetWidth(),50+image.GetHeight());
m_static.Create(L"", SS_BITMAP | SS_CENTERIMAGE,rect,this,12346);
m_static.SetBitmap(hBmp);
m_static.ShowWindow(true);

其中LoadImageFromIDResource实现函数如下:

BOOL LoadImageFromIDResource(CImage *pImage, UINT nResID,LPCTSTR lpTyp)
{
if ( pImage == NULL)
return false;
pImage->Destroy();
// 查找资源
HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), lpTyp);
if (hRsrc == NULL)
return false;
// 加载资源
HGLOBAL hImgData = ::LoadResource(AfxGetResourceHandle(), hRsrc);
if (hImgData == NULL)
{
::FreeResource(hImgData);
return false;
}
// 锁定内存中的指定资源
LPVOID lpVoid = ::LockResource(hImgData);
LPSTREAM pStream = NULL;
DWORD dwSize = ::SizeofResource(AfxGetResourceHandle(), hRsrc);
HGLOBAL hNew = ::GlobalAlloc(GHND, dwSize);
LPBYTE lpByte = (LPBYTE)::GlobalLock(hNew);
::memcpy(lpByte, lpVoid, dwSize);
// 解除内存中的指定资源
::GlobalUnlock(hNew);
// 从指定内存创建流对象
HRESULT ht = ::CreateStreamOnHGlobal(hNew, TRUE, &pStream);
if ( ht != S_OK )
{
GlobalFree(hNew);
}
else
{
// 加载图片
pImage->Load(pStream);
GlobalFree(hNew);
}
// 释放资源
::FreeResource(hImgData);
return true;
}