// файл ресурса DLL example_Resource.rc
...
// RCDATA
RCDATA_16_ICO RCDATA "path\\sample_16.ico"
RCDATA_32_BMP RCDATA "path\\sample_32.bmp"
RCDATA_48_JPG RCDATA "path\\sample_48.jpg" // нет альфа-канала
RCDATA_64_GIF RCDATA "path\\sample_64.gif"
RCDATA_128_TIF RCDATA "path\\sample_128.tif"
RCDATA_256_PNG RCDATA "path\\sample_256.png"
...
// Icon
IDS_ICON ICON "path\\sample.ico"
// Bitmap
IDS_BMP_ANYSIZE BITMAP "path\\sample.bmp"
...
// класс ресурса (загрузка из файла, DLL или
//текущего процесса (hInst = nullptr)
// для загрузки из секции ресурса ICON или BITMAP
// установить pType соответственно = RT_ICON или RT_BITMAP
// Если ресурс используется в CUIX, идентификатор ресурса
// должен иметь только строковое значение
// и находиться в секции RCDATA
// Иначе может использоваться цифровой идентификатор,
// определённый в resource.h :
#define IDS_ICON 124
#define IDS_BMP_ANYSIZE 125
#define RCDATA_256_PNG 126
class GdiPlusBmpResource {
public:
GdiPlusBmpResource() : m_pBitmap(nullptr), m_hBuffer(nullptr) { }
GdiPlusBmpResource (PCWSTR pFile,
BOOL useEmbeddedColorManagement = FALSE) :
m_pBitmap(nullptr), m_hBuffer(nullptr) {
LoadFromFile(pFile, useEmbeddedColorManagement); }
GdiPlusBmpResource (PCWSTR pName,
HMODULE hInst = nullptr, PCWSTR pType = RT_RCDATA) :
m_pBitmap(nullptr), m_hBuffer(nullptr) {
Load(pName, hInst, pType);
}
GdiPlusBmpResource(UINT id, HMODULE hInst = nullptr,
PCWSTR pType = RT_RCDATA) :
m_pBitmap(nullptr), m_hBuffer(nullptr) {
Load(MAKEINTRESOURCE(id), hInst, pType);
}
~GdiPlusBmpResource() { Empty(); }
bool LoadFromFile(PCWSTR pFile,
BOOL useEmbeddedColorManagement = FALSE) {
Empty();
m_pBitmap = Gdiplus::Bitmap::FromFile(pFile,
useEmbeddedColorManagement);
return (m_pBitmap->GetLastStatus() == Gdiplus::Ok);
}
bool Load(PCWSTR pName, HMODULE hInst = nullptr,
PCWSTR pType = RT_RCDATA );
bool Load(UINT id, HMODULE hInst = nullptr, PCWSTR pType = RT_RCDATA) {
return Load(MAKEINTRESOURCE(id), hInst, pType);
}
void Empty() {
if (m_pBitmap) {
delete m_pBitmap;
m_pBitmap = nullptr;
}
if (m_hBuffer) {
::GlobalUnlock(m_hBuffer);
::GlobalFree(m_hBuffer);
m_hBuffer = nullptr;
}
};
inline bool isValid() { return m_pBitmap != nullptr; }
inline Gdiplus::Bitmap* GetBitmap() const { return m_pBitmap; }
inline operator Gdiplus::Bitmap*() const { return m_pBitmap; }
inline Gdiplus::Bitmap* operator->() const { return m_pBitmap; }
private:
Gdiplus::Bitmap *m_pBitmap;
HGLOBAL m_hBuffer;
};
bool GdiPlusBmpResource::Load(PCWSTR pName, HMODULE hInst, PCWSTR pType) {
Empty();
HRSRC hResource = ::FindResource(hInst, pName, pType);
if (hResource) {
DWORD imageSize = ::SizeofResource(hInst, hResource);
if (imageSize) {
const void* pResourceData =
::LockResource(::LoadResource(hInst, hResource));
if (pResourceData && (m_hBuffer =
::GlobalAlloc(GMEM_MOVEABLE, imageSize))) {
void* pBuffer = ::GlobalLock(m_hBuffer);
if (pBuffer) {
CopyMemory(pBuffer, pResourceData, imageSize);
IStream* pStream(nullptr);
if (::CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream)
== S_OK) {
if (m_pBitmap = Gdiplus::Bitmap::FromStream(pStream)) {
pStream->Release();
if (m_pBitmap->GetLastStatus() == Gdiplus::Ok)
return true;
delete m_pBitmap;
m_pBitmap = nullptr;
}
}
::GlobalUnlock(m_hBuffer);
}
::GlobalFree(m_hBuffer);
m_hBuffer = nullptr;
}
}
}
return false;
}
GdiPlusBmpResource* exampleSetIcon(PCWSTR name, HMODULE inst,
HMENU hmenu, int submenu, int menuItemID) {
GdiPlusBmpResource *bmp(nullptr);
CMenu menu;
if (menu.Attach(hmenu)) {
bmp = new GdiPlusBmpResource(name, inst, RT_RCDATA);
if (bmp && bmp->isValid()) {
MENUITEMINFO menuiteminfo = { 0 };
menuiteminfo.cbSize = sizeof(menuiteminfo);
menuiteminfo.fMask |= MIIM_ID | MIIM_DATA |
MIIM_STRING | MIIM_FTYPE;
WCHAR buf[MAX_PATH];
menuiteminfo.dwTypeData = buf;
menuiteminfo.cch = MAX_PATH;
if (menu.GetSubMenu(submenu)->GetMenuItemInfo(menuItemID,
&menuiteminfo)) {
menuiteminfo.fType |= MFT_OWNERDRAW;
menuiteminfo.dwItemData =
reinterpret_cast<ULONG_PTR> (bmp->GetBitmap());
if (menu.GetSubMenu(submenu)->SetMenuItemInfo(menuItemID,
&menuiteminfo)) {
menu.Detach();
return bmp;
}
}
delete bmp;
}
menu.Detach();
}
return nullptr;
}
//Пример загрузки иконки и установки на пункт меню
CString path;
path.GetEnvironmentVariableW(_T("USERPROFILE"));
path.Append(_T("\\Autodesk\\Resource.dll"));
HMODULE resource= ::LoadLibrary(path);
if (resource) {
GdiPlusBmpResource *menuIdBmp = exampleSetIcon(_T("RCDATA_16_ICO"),
resource, myMenuHandle, subMenuNumer, menuItemID);
::FreeLibrary(resource);
}