2010-10-21 20 views

Respuesta

16

Como usted ha descubierto, ::LoadBitmap (y el más nuevo ::LoadImage) sólo se ocupan de .bmp s. Con mucho, la solución más fácil es convertir su imagen a .bmp.

Si la imagen tiene transparencia, se puede convertir en un mapa de bits ARGB de 32 bits (aquí hay una herramienta llamada AlphaConv que puede convertirla). A continuación, cargue la imagen con el método CImage clase LoadFromResource. Pase el CImage al m_staticLogo.SetBitmap().

Pero si realmente necesita que sea un .png, se puede hacer.

Método 1 (la forma más fácil): Cargar el .png de un archivo usando CImage::Load. Pase el CImage al m_staticLogo.SetBitmap().

Método 2 (la forma más dura): Cargar el .png de un recurso mediante la carga del recurso en un COM IStream y usando CImage::Load. (NOTA: CImage::LoadFromResource parece tentador, pero no funciona con un gráfico .png). Para obtener el recurso en un COM IStream, vea this Codeproject article. Tenga en cuenta que el artículo funciona con Gdiplus::Bitmap, pero la parte clave es cómo crear el IStream, que debe poder adaptar para CImage. Finalmente, pase el CImage al m_staticLogo.SetBitmap().

Editar: Actualizado para usar CImage, que es más fácil que Gdiplus::Bitmap.

+0

Convertí el archivo png a bmp pero el problema es que el fondo de la imagen ya no es transparente después de la conversión. ¿Hay alguna forma de convertir y aún así preservar el fondo transparente? –

+0

El método 1 funciona pero preferiría tener el gráfico en el archivo de recursos. El Método 2 es muy difícil para mí. –

+0

Puede conservar la transparencia convirtiendo el '.png' a un' ARGB '' .bmp' de 32 bits. Las herramientas estándar como Paint.NET no harán esto. He actualizado el artículo con una herramienta que funciona. Puede parecer extraño cuando se ve en Visual Studio pero se procesa bien. Esto funciona bien contra fondos de un solo color. No funcionará si tiene un fondo complejo como una foto. – Nate

1

Mapa de bits e ícono compatible. No estoy seguro acerca de png. O bien, puede intentar lo siguiente.

  1. png abierto en MS Paint o algún otro visor.
  2. Luego copie la parte de la imagen de eso.
  3. Cree un recurso en el recurso MFC.
  4. Pegue la imagen copiada en el recurso recién creado.
  5. Usa la nueva ID de recurso en LoadBitmap.
0

Si está convirtiendo el archivo de imagen .png al formato .bmp, puede terminar con la claridad de la imagen. Por lo tanto, ponerse al mensaje WM_PAINT en la clase de cuadro de diálogo y utilizar

Graphics :: método DrawImage

Para obtener este método de vincular su proyecto con la biblioteca gdiplus.lib.

3

Para aquellos, que necesitan una solución rápida, aquí es una manera de cargar el archivo PNG de recursos utilizando GDI + (respuesta original para GDI estándar de aquí - 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; 
} 

Puede añadir el archivo PNG como recurso utilizando el comando Agregar recurso y en el panel, elija Importar.

Cuestiones relacionadas