2010-10-21 13 views

risposta

16

Come hai scoperto, ::LoadBitmap (e il più recente ::LoadImage) trattare solo con .bmp s. Di gran lunga la soluzione più semplice è quella di convertire l'immagine in un .bmp.

Se l'immagine ha trasparenza, può essere convertita in un bitmap ARGB a 32 bit (qui è uno strumento chiamato AlphaConv che può convertirlo). Quindi caricare l'immagine utilizzando il metodo LoadFromResource della classe CImage. Passa il numero CImage a m_staticLogo.SetBitmap().

Ma se si veramente è necessario che sia un .png, è possibile farlo.

Metodo 1 (il modo più semplice): Caricare il .png da un file utilizzando CImage::Load. Passa il numero CImage a m_staticLogo.SetBitmap().

Metodo 2 (il senso più duro): Caricare la .png da una risorsa caricando la risorsa in un COM IStream e utilizzando CImage::Load. (NOTA: CImage::LoadFromResource sembra allettante ma non funzionerà con un grafico .png). Per ottenere la risorsa in un COM IStream, vedere this Codeproject article. Nota che l'articolo funziona con Gdiplus::Bitmap ma la parte chiave è come creare il IStream, che dovresti essere in grado di adattare per CImage. Infine, passare il CImage a m_staticLogo.SetBitmap().

Edit: aggiornato per utilizzare CImage, che è più facile che Gdiplus::Bitmap.

+0

Ho convertito il file png in bmp ma il problema è che lo sfondo dell'immagine non è più trasparente dopo la conversione. C'è un modo per convertire e preservare ancora lo sfondo trasparente? –

+0

Il metodo 1 funziona ma preferirei avere l'immagine nel file di risorse. Il metodo 2 è troppo difficile per me. –

+0

È possibile mantenere la trasparenza convertendo il file '.png' in un file" ARGB "a 32 bit' .bmp'. Strumenti standard come Paint.NET non lo faranno. Ho aggiornato l'articolo con uno strumento che funziona. Può sembrare strano se visualizzato in Visual Studio ma viene visualizzato correttamente. Funziona bene contro sfondi a un colore. Non funzionerà se hai uno sfondo complesso come una foto. – Nate

1

Bitmap e icona supportata. Non sono sicuro di png. In alternativa, si può provare quanto segue.

  1. aprire png in MS Paint o qualche altro visualizzatore.
  2. Quindi copiare la parte dell'immagine da quella.
  3. Creare una risorsa nella risorsa MFC.
  4. Incollare l'immagine copiata nella risorsa appena creata.
  5. Utilizzare il nuovo ID risorsa in LoadBitmap.
0

Se si sta convertendo il file di immagine .png in formato .bmp, si può finire con la chiarezza dell'immagine. Quindi, prendere WM_PAINT messaggio nella classe della finestra di dialogo e utilizzare

Graphics :: metodo DrawImage

Per ottenere questo metodo collegare il progetto con biblioteca gdiplus.lib.

3

Per coloro, che hanno bisogno di una soluzione rapida, ecco un modo per caricare file PNG da risorse utilizzando GDI + (risposta originale per lo standard GDI da qui - 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; 
} 

È possibile aggiungere file PNG come risorsa utilizzando il comando Aggiungi risorsa e nel pannello scegliere Importa.

Problemi correlati