Как загрузить ресурс png в управление изображением в диалоговом окне?
Я попробовал следующий код в OnInitDialog(), но ничего не было показано.
m_staticLogo.SetBitmap(::LoadBitmap(NULL, MAKEINTRESOURCE(IDB_LOGO)));
где m_staticLogo - это элемент управления статическим изображением, а IDB_LOGO - это идентификатор ресурса файла png.
Ответы
Ответ 1
Как вы обнаружили, ::LoadBitmap
(и новый ::LoadImage
) работают только с .bmp
s. Самым простым решением является преобразование вашего изображения в .bmp
.
Если изображение имеет прозрачность, оно может быть преобразовано в 32-битное растровое изображение ARGB (здесь находится инструмент под названием AlphaConv, который может конвертировать его). Затем загрузите изображение с помощью метода CImage
class LoadFromResource
. Передайте CImage
в m_staticLogo.SetBitmap()
.
Но если вам действительно нужно быть .png
, это можно сделать.
Способ 1 (более простой способ): Загрузите .png
из файла с помощью CImage::Load
. Передайте CImage
в m_staticLogo.SetBitmap()
.
Способ 2 (более жесткий путь): Загрузите .png
из ресурса, загрузив ресурс в COM IStream
и используя CImage::Load
. (ПРИМЕЧАНИЕ: CImage::LoadFromResource
выглядит заманчивым, но не работает с графикой .png
). Чтобы получить ресурс в COM IStream
, см. эту статью Codeproject. Обратите внимание, что статья работает с Gdiplus::Bitmap
, но ключевой частью является создание IStream
, которую вы должны адаптировать для CImage
. Наконец, передайте CImage
в m_staticLogo.SetBitmap()
.
Изменить: Обновлено для использования CImage
, что проще, чем Gdiplus::Bitmap
.
Ответ 2
Для тех, кому нужно быстрое решение, вот способ загрузить файл png из ресурсов с помощью GDI + (исходный ответ для стандартного GDI отсюда - http://www.codeproject.com/Questions/377803/How-to-load-PNG-images-in-mfc):
bool GdiPlusUtils::LoadBitmapFromPNG(UINT uResourceID,
Bitmap** ppBitmapOut, HINSTANCE hInstance /*= NULL*/)
{
bool bRet = false;
if (!hInstance)
hInstance = AfxGetInstanceHandle();
HRSRC hResourceHandle = ::FindResource(
hInstance, MAKEINTRESOURCE(uResourceID), L"PNG");
if (0 == hResourceHandle)
{
return bRet;
}
DWORD nImageSize = ::SizeofResource(hInstance, hResourceHandle);
if (0 == nImageSize)
{
return bRet;
}
HGLOBAL hResourceInstance = ::LoadResource(hInstance, hResourceHandle);
if (0 == hResourceInstance)
{
return bRet;
}
const void* pResourceData = ::LockResource(hResourceInstance);
if (0 == pResourceData)
{
FreeResource(hResourceInstance);
return bRet;
}
HGLOBAL hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, nImageSize);
if (0 == hBuffer)
{
FreeResource(hResourceInstance);
return bRet;
}
void* pBuffer = ::GlobalLock(hBuffer);
if (0 != pBuffer)
{
CopyMemory(pBuffer, pResourceData, nImageSize);
IStream* pStream = 0;
if (S_OK == ::CreateStreamOnHGlobal(hBuffer, FALSE, &pStream))
{
*ppBitmapOut = new Bitmap(pStream);
pStream->Release();
bRet = true;
}
::GlobalUnlock(hBuffer);
}
::GlobalFree(hBuffer);
UnlockResource(hResourceInstance);
FreeResource(hResourceInstance);
return bRet;
}
Вы можете добавить файл png в качестве ресурса, используя команду "Добавить ресурс", а в панели выберите "Импорт".
Ответ 3
Растровое изображение и значок, который он поддерживает. Не уверен в png.
В качестве альтернативы, возможно, вы можете попробовать следующее.
- открыть png в MS Paint или какой-либо другой просмотрщик.
- Затем скопируйте часть изображения из этого.
- Создайте ресурс в ресурсе MFC.
- Вставьте скопированное изображение на вновь созданный ресурс.
- Использовать новый идентификатор ресурса в LoadBitmap.
Ответ 4
Если вы конвертируете файл .png изображения в формат .bmp, вы можете получить четкость изображения. Итак, поймайте сообщение WM_PAINT в классе диалогового окна и используйте
Графика:: Метод DrawImage
Чтобы получить этот метод, свяжите свой проект с библиотекой gdiplus.lib.