2010-10-21 3 views

Antwort

16

Wie Sie entdeckt haben, ::LoadBitmap (und die neuere ::LoadImage) nur mit .bmp s beschäftigen. Bei weitem die einfachste Lösung ist, Ihr Bild in eine .bmp zu konvertieren. Wenn das Bild transparent ist, kann es in eine 32-Bit-ARGB-Bitmap konvertiert werden (hier ist ein Tool namens AlphaConv, das es konvertieren kann). Dann laden Sie das Bild mit der CImage Klasse LoadFromResource Methode. Übergeben Sie die 10 an m_staticLogo.SetBitmap().

Aber wenn Sie wirklich brauchen es ein .png, kann es getan werden.

Methode 1 (der einfachere Weg): laden .png aus einer Datei mit CImage::Load. Übergeben Sie die 10 an m_staticLogo.SetBitmap().

Methode 2 (je härter Fahrt): laden .png von einer Ressource durch die Ressource in einem COM IStream Laden und Verwenden CImage::Load. (HINWEIS: CImage::LoadFromResource sieht verlockend aus, funktioniert aber nicht mit einer .png Grafik). Informationen zum Abrufen der Ressource in COM IStream finden Sie unter this Codeproject article. Beachten Sie, dass der Artikel mit Gdiplus::Bitmap funktioniert, aber das Schlüsselelement ist, wie Sie das IStream erstellen, das Sie für CImage anpassen können. Übergeben Sie schließlich die CImage an m_staticLogo.SetBitmap().

Bearbeiten: Aktualisiert, um zu verwenden, die einfacher ist als Gdiplus::Bitmap.

+0

Ich konvertierte die PNG-Datei zu BMP, aber das Problem ist, dass der Hintergrund des Bildes nach der Konvertierung nicht mehr transparent ist. Gibt es eine Möglichkeit, den transparenten Hintergrund zu konvertieren und dennoch zu bewahren? –

+0

Methode 1 funktioniert, aber ich würde lieber die Grafik in der Ressourcendatei haben. Methode 2 ist zu schwierig für mich. –

+0

Sie können die Transparenz erhalten, indem Sie das '.png' in ein 32-Bit" ARGB "' .bmp' konvertieren. Standard-Tools wie Paint.NET werden dies nicht tun. Ich habe den Artikel mit einem Tool aktualisiert, das funktioniert. Es kann seltsam aussehen, wenn es in Visual Studio angezeigt wird, aber es wird gut wiedergegeben. Dies funktioniert gut gegen einfarbige Hintergründe. Es wird nicht funktionieren, wenn Sie einen komplexen Hintergrund wie ein Foto haben. – Nate

1

Bitmap und Symbol unterstützt. Nicht sicher über PNG. Alternativ können Sie Folgendes versuchen.

  1. Öffnen Sie PNG in MS Paint oder einem anderen Viewer.
  2. Kopieren Sie dann den Bildteil davon.
  3. Erstellen Sie eine Ressource in MFC-Ressource.
  4. Fügen Sie das kopierte Bild in die neu erstellte Ressource ein.
  5. Verwenden Sie die neue Ressourcen-ID in LoadBitmap.
0

Wenn Sie die .png-Bilddatei in das BMP-Format konvertieren, können Sie mit der Bildschärfe fertig werden. Also, fangen WM_PAINT Nachricht in Dialogfeld-Klasse und verwenden

Graphics :: DrawImage Methode

diese Methode Ihr Projekt mit gdiplus.lib Bibliothek zu erhalten, verknüpfen.

3

Für diejenigen, die eine schnelle Lösung brauchen, hier ist eine Möglichkeit, png-Datei von Ressourcen zu laden, mit GDI + (ursprüngliche Antwort für Standard-GDI von hier - 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; 
} 

Sie PNG-Datei als Ressource hinzufügen Verwenden Sie den Befehl Ressource hinzufügen und wählen Sie im Panel Importieren.

Verwandte Themen