Как загрузить ресурс PNG в элемент управления изображением в диалоговом окне? - PullRequest
12 голосов
/ 21 октября 2010

Я попробовал следующий код в OnInitDialog (), но ничего не было показано.

m_staticLogo.SetBitmap(::LoadBitmap(NULL, MAKEINTRESOURCE(IDB_LOGO)));

, где m_staticLogo - статический элемент управления изображением, а IDB_LOGO - идентификатор ресурса файла png.

Ответы [ 4 ]

16 голосов
/ 22 октября 2010

Как вы обнаружили, ::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.

3 голосов
/ 04 июля 2014

Для тех, кому нужно быстрое решение, вот способ загрузить файл 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-файл в качестве ресурса с помощью команды Добавить ресурс и на панели выберите «Импорт».

1 голос
/ 21 октября 2010

Растровое изображение и значок, который он поддерживает.Не уверен насчет png.Кроме того, может быть, вы можете попробовать следующее.

  1. open png в MS Paint или какой-либо другой программе просмотра.
  2. Затем скопируйте часть изображения из этого.
  3. Создайте ресурс в ресурсе MFC.
  4. Вставьте скопированное изображение во вновь созданный ресурс.
  5. Использовать новыйидентификатор ресурса в LoadBitmap.
0 голосов
/ 26 октября 2010

Если вы конвертируете файл изображения .png в формат .bmp, вы можете получить четкость изображения. Итак, перехватите сообщение WM_PAINT в классе диалогового окна и используйте

Графика :: Метод DrawImage

Чтобы получить этот метод, свяжите ваш проект с библиотекой gdiplus.lib.

...