none
Wie kann ich eine PNG-Datei unter Windows CE 6.0 laden? RRS feed

  • Frage

  • Hallo, 

    bisher habe ich noch keine Möglichkeit gefunden ein PNG Bild aus einer Resource Datei zu laden. Vlt. weiß ja jemand im Forum Rat :-)

    Ich habe beim googlen gesehen, dass es einige Methoden (SHLoadImageResource, GDI+, libpng und CImage) gibt, allerdings werden die nicht von meiner Plattform unterstützt bzw. erscheinen mir etwas aufwändig. Gibt es eine einfache und schöne Methode mit den Hausmitteln das Problem zu lösen? Habe ich evtl. was übersehen?

    Hintergrund: In meinem Projekt wird die GUI mit Silverlight dargestellt. Nachdem ich nun meinen User Control erzeugt habe, möchte ich dem Image Control nun eine png-Datei übergeben. Eine bmp-Datei kann ich ohne Probleme mit HBITMAP myBitmap = LoadBitmap(myInstance, MAKEINTRESOURCE(IDB_BITMAP1)) laden und an das Image Control übergeben.

    Danke und Gruß

    Deniz

    Donnerstag, 23. September 2010 15:07

Antworten

Alle Antworten

  • In Deinem CE ist GDI+ enthalten. GDI+ kann auch PNG Dateien laden verarbeiten.

    Siehe auch hier:
    http://www.codeproject.com/KB/GDI-plus/cgdiplusbitmap.aspx


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 24. September 2010 10:13
    Moderator
  • Ist GDI+ wirklich offiziell in Windows Mobile 6 enthalten?

    Ich habe mich damit abgefunden, z. B. unter Windows Mobile PNGs nicht aus der Ressource, sondern vom Filesystem zu laden:

     // Create the imaging factory.
    	hr = CoCreateInstance (CLSID_ImagingFactory,
    		NULL, CLSCTX_INPROC_SERVER, IID_IImagingFactory, (void **)&s_pImgFactory);
    	if (SUCCEEDED(hr))
    	{
    		hr = s_pImgFactory->CreateImageFromFile(szFilename, &s_pImgBkgr);
    		if (FAILED(hr))
    			s_pImgBkgr = NULL;
    	}
    
    ...
    OnDraw...
    		ImageInfo imgInfo;
    		// wir vergrößern das Hintergrundbild nicht (eher verkleinern es auf die Displaygröße)
    			hr = s_pImgBkgr->GetImageInfo(&imgInfo);
    			if (SUCCEEDED(hr))
    			{
    				SIZE sizeImg = {imgInfo.Width, imgInfo.Height };
    				// aber wir verkleinern es, wenn nötig
    				if (sizeImg.cx > rcClient.right - rcClient.left)
    					sizeImg.cx = rcClient.right - rcClient.left;
    				if (sizeImg.cy > rcClient.bottom - rcClient.top)
    					sizeImg.cy = rcClient.bottom - rcClient.top;
    
    				// das Bild zentrieren
    				RECT rcImg;
    				rcImg.left = ((rcClient.right - rcClient.left) - sizeImg.cx)/2;
    				rcImg.top = ((rcClient.bottom - rcClient.top) - sizeImg.cy)/2;
    				rcImg.right = rcImg.left + sizeImg.cx;
    				rcImg.bottom = rcImg.top + sizeImg.cy;
    				hr = s_pImgBkgr->Draw(hdcMem, &rcImg, NULL);
    				if (FAILED(hr))
    				{
    					TRACE(_T("Fehler 0x%08X beim Zeichnen des Hintergrundbildes.\n"), hr);
    				}
    			}
    
    Falls aber gdiplus auf dem Zielsystem verfügbar ist, ziehe gdiplus vor. Damit bist du flexibler, falls du mehr machen möchstest, als nur darstellen (Draw).
    Dienstag, 28. September 2010 23:04
  • Ist GDI+ wirklich offiziell in Windows Mobile 6 enthalten?

    Nach meinen Wissen seit der Mobile 5 Version.
    Siehe auch hier:
    http://community.opennetcf.com/articles/cf/archive/2007/10/31/using-gdi-on-windows-mobile.aspx


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 29. September 2010 06:28
    Moderator
  • Das klingt gut: GDI Plus als PhoneWare. Gelällt mir.

    Bei mir fehlt das GDI-Plus-Thema in MSDN-Doku, welche mit dem Windows Mobile Platform SDK 6 ausgeliefert wird.

    Aber wenn es funktional das gleiche ist, wir auf den Desktop-Systemen, dann ists ja schön.

    Danke

    Mittwoch, 29. September 2010 09:16