Загрузить ресурс PNG в CBitMap - PullRequest
8 голосов
/ 09 июня 2010

Как загрузить ресурс png в CBitMap? Когда я пытаюсь это сделать, это не работает:

CImage image;
image.LoadFromResource(AfxGetInstanceHandle(), IDB_PNG1);
bitmap.Attach(image.Detach());

Это дает мне тип ресурса ошибки не найден. Есть ли другой способ загрузить ресурс PNG?

Ответы [ 4 ]

17 голосов
/ 15 мая 2012

Если вы используете VS2008 или новее (MFC Feature Pack), вы можете использовать CPngImage, который получен из CBitmap и содержится в <afxtoolbarimages.h>.CPngImage является внутренним классом :

Следующие классы используются внутри MFC.Для полноты в этом разделе описаны эти внутренние классы, но они не предназначены для использования непосредственно в вашем коде.

Если вы хотите использовать CPngImage, вам нужно использовать тип ресурса "PNG":

#define AFX_PNG_RESOURCE_TYPE  _T("PNG")

Пример использования

CPngImage image;
image.Load(IDB_PNG1, nullptr);
bitmap.Attach(image.Detach());
5 голосов
/ 10 июня 2010

LoadFromResource внутренне использует LoadImage, он не поддерживает PNG в прошлый раз, когда я пытался, несмотря на то, что говорится в документации.Вы можете связать с CxImage (посмотрите на codeproject), но это большая работа для небольшой реальной выгоды.

В конце концов я забыл о PNG, использовал AlphaConv для преобразования PNG в 32-битные растровые изображения Windows ииспользуйте CImage с теми.Дополнительным преимуществом является то, что вы можете использовать их с CBitmapButton и т. Д. В MFC без каких-либо преобразований.

Еще один способ обойти это - извлечь содержимое ресурса во временный файл, а затем использовать CImage :: Load для его чтенияоттуда.Если я поймаю тебя на том, что ты делаешь это в одной из моих баз кода, я ударю тебя по лицу;)

3 голосов
/ 05 апреля 2014

Если вам не нужен CBitmap, а только дескриптор, это может быть полезно для вас.

Или, если вы можете получить CBitMap из HBITMAP, эта функция вернет, это тоже хорошо.

Я использую это в коммерческом приложении, и оно работает.

// Based on afxbutton.cpp's static function ButtonLoadBitmap
HBITMAP __stdcall ButtonLoadBitmap(UINT uiBmpResId)
{
    if (uiBmpResId == 0)
    {
        return NULL;
    }

    LPCTSTR lpszResourceName = MAKEINTRESOURCE(uiBmpResId);
    ENSURE(lpszResourceName != NULL);

    HBITMAP hbmp = NULL;

    // Try to load PNG image first:
    CPngImage pngImage;
    if (pngImage.Load(lpszResourceName))
    {
        hbmp = (HBITMAP) pngImage.Detach();
    }
    else
    {
        HINSTANCE hinstRes = AfxFindResourceHandle(lpszResourceName, RT_BITMAP);
        if (hinstRes == NULL)
        {
            return NULL;
        }

        UINT uiLoadImageFlags = LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS;

        hbmp = (HBITMAP) ::LoadImage(hinstRes, lpszResourceName, IMAGE_BITMAP, 0, 0, uiLoadImageFlags);
    }

    return hbmp;
}
1 голос
/ 15 июля 2010

Используйте библиотеку типа CxImage (http://www.xdp.it/cximage.htm), чтобы выполнить всю тяжелую работу за вас. Код становится таким простым: -

CxImage image;
if (image.LoadResource(<resource_instance_handle>, <resource_id>, CXIMAGETYPE_PNG))
{
    HBITMAP hbmp = image.CreateHBITMAP();
    ... do something with hbmp ...
}

(обратите внимание, что я пишу этот кодиз памяти - вам, возможно, придется немного подправить его, чтобы заставить его работать!)

Я часто использую CxImage для графики в своих программах, и это сильно упрощает вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...