[WinAPI] GDI+ PNG aus Resource Laden

Hunter

Erfahrenes Mitglied
Hallo, ist es möglich mit GDI+ oder mit einer anderen Hauseigenen Funktion, PNG Files als Resource zu laden und anzuzeigen?
 
Danke für den Link, jedoch wird hier nichts mit Resourcen gemacht.

Ich habe auch einen Zusatz für GDI+ gefunden, mit dem es möglich ist PNGs aus Resource zu laden, jedoch funktioniert das bei mir irgendwie mit dieser Anleitung nicht:

Code:
{
        CGdiPlusBitmapResource* m_image = new CGdiPlusBitmapResource();
	m_image->Load(IDIMAGE_ANVIL, "PNG", GetModuleHandle(0));
				
	// Create graphics object from HDC
	Gdiplus::Graphics g(hDC);

	// Draw the PNG image using graohics object
	g.DrawImage(*m_image, 20, 20, 150, 150);

}
 
Zuletzt bearbeitet:
Ich habs mir jetzt mal durchgeschaut, jedoch bin ich immer noch nicht schlauer geworden...
Gibt es irgendwo ein verständliches Sample dazu?
 
Da mir das doch schon ein bisschen viel Code für das "kleine" Programm ist, habe ich jetzt doch noch was gefunden, jedoch funktioniert das nicht wirklich.

Dieser Code funktioniert, lädt jedoch nur die vorhandene Datei:
Code:
Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromFile(L"data\\otherItems.png");
 
	if(pBitmap) {
		Gdiplus::Graphics g(hDC);
		g.DrawImage(pBitmap, Gdiplus::PointF(0.0f, 0.0f));
	}
 
	delete pBitmap;

Leider funktioniert es hier mit dem "FromResource" gar nicht:
Code:
Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromResource(GetModuleHandle(0), MAKEINTRESOURCEW(IDIMAGE_ANVIL));
 
	if(pBitmap) {
		Gdiplus::Graphics g(hDC);
		g.DrawImage(pBitmap, Gdiplus::PointF(0.0f, 0.0f));
	}
 
	delete pBitmap;

Was mach ich falsch, oder muss man bei den Resourcen auch "aufpassen" wie man die lädt?


Wäre wirklich sehr froh über eine Antwort :)
 
Hallo,

bei nicht BMP-Dateien ist das Laden aus der Resource leider etwas aufwendig:

C++:
// Eintrag im rc-File

otherItems.png RT_RCDATA DISCARDABLE "otherItems.png"

// Laden der Resource in ein Bitmap-Objeckt

HINSTANCE hResInstance;
HRSRC     hResLocation;
HGLOBAL   hResResource;

Gdiplus::Bitmap* pBitmap = NULL;

if( (hResInstance = AfxFindResourceHandle( _T("otherItems.png"), _T("RT_RCDATA"))) )
{
    if( (hResLocation = FindResource(hResInstance, _T("otherItems.png"), _T("RT_RCDATA"))) )
    {
        if( (hResResource = LoadResource(hResInstance, hResLocation)) )
        {
            LPVOID  lpRes      = LockResource(hResResource);
            DWORD   nBufSize   = SizeofResource(hResInstance, hResLocation);
            HGLOBAL pResBuffer = GlobalAlloc(GMEM_MOVEABLE, nBufSize);

            if( lpRes && nBufSize && pResBuffer )
            {
                void* pBuffer = GlobalLock(pResBuffer);
    
                if( pBuffer )
                {
                    CopyMemory(pBuffer, lpRes, nBufSize);
                    IStream* pIStream = NULL;
        
                    if( CreateStreamOnHGlobal(pResBuffer, FALSE, &pIStream) == S_OK )
                    {
                        pBitmap = Gdiplus::Bitmap::FromStream(pIStream);
                        pIStream->Release();
                    }
        
                    GlobalUnlock(pBuffer);
                }
        
                GlobalFree(pResBuffer);
                UnlockResource(hResResource);  
            }
        }
    }
}

// Löschen, wenn das Bitmap nicht mehr gebraucht wird

if( pBitmap )
{
    delete pBitmap
}
Gruß
MCoder
 
Danke für den Code, jedoch gibt es zwei Probleme:
AFX ist soweit ich weiß nur bei MFC dabei, und das hab ich nicht.

Dieser Eintrag im rc-File gibt einen Error
Code:
otherItems.png


Womit kann ich AfxFindResourceHandle() ersetzen? Macht dieses ".png" später in der Bearbeitung einen Unterschied? :)
 

Neue Beiträge

Zurück