[WIN32]-PNG einbinden und verwenden

Mr Apfelkuchen

Erfahrenes Mitglied
Also hi erstmal,
ich bin beim schreiben eines Programms im Eifer auf ein Problem gestoßen. Unzwar hab ich zuviele Bitmaps benutzt so das das Programm sehr groß geworden ist und ausserdem lassen sich Bitmaps nur schwer an gewissen Stellen durchsichtig machen.

Daher meine Frage: Kann man PNG-Bilder einbinden und wenn ja wie? Irgendwie wurde die Frage beim Surfen im Inet nicht so richtig klar beantwortet...

Freue mich über Antworten oder auch Anregungen
 
Danke für den Link :) aber wenn das so kompliziert is ein PNG-Bild einzubinden dann glaub ich ist das nichts für mich... dachte das geht so ähnlich wie bei Bitmaps, die man als Visual Studio Ressourcen hinzufügt und mit
Code:
hBmp = LoadBitmap (hInstance, TEXT ("BITMAPNAME"));
GetObject (hBmp, sizeof (BITMAP), &Bmp);

SelectObject (hdcMem, hBmp);
BitBlt (hdc,  x,  y,  größe x,  größe y,  hdcMem,  0,  0,  SRCPAINT) ;
ausgibt... weil der Code ist erstmal sehr kompliziert (für mich^^) und sehr lang daher nochmal die frage...:rolleyes: gibt es einen weg der einfacher ist?

mfg Apfelkuchen
 
Na nimm doch einfach von der Seite http://members.gamedev.net/lode/projects/LodePNG/picopng.cpp so, da übergibst du als Parameter einfach folgendes:
C++:
std::ifstream file_stream("C:\\sample.png", std::ios_base::binary);
if (!file_stream) { std::cerr << "FEHLER: Datei nicht gefunden!"; return 1; }

std::vector<unsigned char> image(file_stream.seekg(0, std::ios_base::end).tellg());
file_stream.seekg(0, std::ios_base::beg).read(&image[0], image.size());

std::pair<unsigned long, unsigned long> size;
decodePNG(image, size.first, size.second, &image[0], image.size());
dann solltest du die Daten in image einfach wie normale BitmapPixel benutzen können :)
 
GDI+ ist Bestandteil der Windows-API. Infos sollten also in der MSDN oder im Netz nicht allzu schwer zu finden sein.
Hier mal ein paar Code-Snippets:
C++:
// Header und Library
#include <gdiplus.h>
#pragma comment (lib, "Gdiplus.lib")

// Starten (einmal am Anfang der App)
ULONG_PTR token;
Gdiplus::GdiplusStartupInput startupInput;
Gdiplus::GdiplusStartup(&token, &startupInput, NULL);

// Stoppen (am Ende der App); 
Gdiplus::GdiplusShutdown(token);

// Bild laden und anzeigen
LRESULT APIENTRY WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch( message ) 
    { 
        case WM_PAINT:
            { 
                PAINTSTRUCT ps; 
                HDC hdc = BeginPaint(hwnd, &ps); 
            
                Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromFile(L"C:\\Bild.png");

                if( pBitmap )
                {
                    Gdiplus::Graphics g(hdc);
                    g.DrawImage(pBitmap, Gdiplus::PointF(0.0f, 0.0f));
                }

                delete oBitmap;
                EndPaint(hwnd, &ps); 
            }
            return 0L; 

        // ...
    } 
}
Gruß
MCoder
 
Hmm also ich probier das mal wenn das geht wär natürlich cool ;-) muss ich die header oder die lib noch iwo runterladen oder is die bei msvs 2005 express dabei?
Kann ich das erstellen und stoppen mit WM_CREAT bzw. WM_DESTROY erledigen?
 
Zuletzt bearbeitet:
Also wenn ich diesen Quelltext kompilieren will kommen 26 Fehler heraus (siehe unten):
Code:
#include <windows.h>
#include <gdiplus.h>
#pragma comment (lib, "Gdiplus.lib")

LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrewInstance,
					PSTR szCmdLine,int iCmdShow)
{
	static TCHAR szAppName[] = TEXT ("HelloWin") ;
	HWND		 hwnd ;
	MSG			 msg ;
	WNDCLASS	 wndclass ;

	wndclass.style			= CS_HREDRAW | CS_VREDRAW ;
	wndclass.lpfnWndProc	= WndProc ;
	wndclass.cbClsExtra		= 0 ;
	wndclass.cbWndExtra		= 0 ;
	wndclass.hInstance		= hInstance ;
	wndclass.hIcon			= LoadIcon (NULL,IDI_APPLICATION) ;
	wndclass.hCursor		= LoadCursor (NULL,IDC_ARROW) ;
	wndclass.hbrBackground	= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
	wndclass.lpszMenuName	= NULL ;
	wndclass.lpszClassName	= szAppName ;

	if (!RegisterClass (&wndclass))
	{	//UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit
		MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode!"),
					szAppName,MB_ICONERROR) ;
		return 0;
	}

	hwnd = CreateWindow (szAppName,				// Name der Fensterklasse
		TEXT ("Counter-Strike Befehle V 1.0"),	// Fenstertitel
		WS_OVERLAPPEDWINDOW,					// Fensterstil
		CW_USEDEFAULT,							// X-Position des Fensters
		CW_USEDEFAULT,							// Y-Position des Fensters
		CW_USEDEFAULT,							// Fensterbreite
		CW_USEDEFAULT,							// Fensterhöhe
		NULL,									// übergeordnetes Fenster
		NULL,									// Menü
		hInstance,								// Programm-Kopiezähler (Programm-ID)
		NULL) ;									// zusätzliche Parameter

	ShowWindow (hwnd,iCmdShow) ;
	UpdateWindow (hwnd) ;

	while (GetMessage (&msg, NULL, 0, 0))
	{
		TranslateMessage (&msg) ;
		DispatchMessage (&msg) ;
	}
	return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HDC			hdc ;
	PAINTSTRUCT	ps ;

	switch (message)
	{
	case WM_CREATE:
		ULONG_PTR token;
		Gdiplus::GdiplusStartupInput startupInput;
		Gdiplus::GdiplusStartup(&token, &startupInput, NULL);
		return 0 ;

	case WM_PAINT:
		{
			PAINTSTRUCT ps;
			HDC hdc = BeginPaint(hwnd, &ps);
			
			Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromFile(L"C:\\00NewGame.png");
			
			if( pBitmap ) {
				Gdiplus::Graphics g(hdc);
				g.DrawImage(pBitmap, Gdiplus::PointF(0.0f, 0.0f));
			}
			delete oBitmap;
			EndPaint(hwnd, &ps);
		}
		return 0L;

	case WM_DESTROY:
		Gdiplus::GdiplusShutdown(token);
		PostQuitMessage (0) ;
		return 0;
	}
	return DefWindowProc (hwnd, message, wParam, lParam) ;
}
Unbenannt.JPG
 

Neue Beiträge

Zurück