Как загрузить ресурс 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.