2010-06-09 16 views
6

Bir png kaynağını CBitMap'e nasıl yüklerim? Bunu denediğimde çalışmıyor.Bir png kaynağını CBitMap içine yükleme

CImage image; 
image.LoadFromResource(AfxGetInstanceHandle(), IDB_PNG1); 
bitmap.Attach(image.Detach()); 

Bana bulunamadı bir hata kaynağı türü verir. PNG kaynağını yüklemek için başka bir yolu var mı?

+0

Hata, LoadFromResource veya Attach? Kod tabanını gerçekten savunacak bir geliştirici için – dwo

cevap

5

LoadFromResource, bu belgeler ne diyor rağmen PNG denedim son kez, desteklemez içten LoadImage kullanır. CxImage ile bağlantı kurabilirsiniz (codeproject'e bakınız), ancak gerçek fayda için çok iş var. Sonunda ne yaptık

32-bit Windows bitmap'lerin içine PNG en dönüştürmek ve kişilerle CImage kullanmak AlphaConv kullanmak, PNG unutun oldu. Ek avantaj, bunları herhangi bir dönüşüm olmadan MFC'de CBitmapButton vb. Ile kullanabilmenizdir.

o geçici bir dosyaya kaynak içeriğini ayıklamak için etrafında kesmek için başka bir yol, sonra oradan okumak için CImage :: Load kullanın. Benim kod üsleri olsa yüzüne yumruk ediyorum bunu yaparken yakalamak istiyorsanız;)

+2

+1 – Lothar

1

sizin için ağır işleri yapmak CxImage (http://www.xdp.it/cximage.htm) gibi bir kitaplık kullanın. Kod olur gibi basit: -

CxImage image; 
if (image.LoadResource(<resource_instance_handle>, <resource_id>, CXIMAGETYPE_PNG)) 
{ 
    HBITMAP hbmp = image.CreateHBITMAP(); 
    ... do something with hbmp ... 
} 

(Bu bellekten kod yazıyorum unutmayın - bu işe almak için hafifçe değişiklikler yapmanızı gerektirecek!)

Ben CxImage a kullanın Programlarımdaki grafikler için çok fazla ve işleri büyük ölçüde basitleştirir. Eğer VS2008 veya daha yeni (MFC Feature Pack) kullanıyorsanız

16

Eğer CBitmap kaynaklanmaktadır ve gerçekten bir CBitmap gerekmiyorsa <afxtoolbarimages.h>

CPngImage image; 
image.Load(AfxGetInstanceHandle(), IDB_PNG1); 
bitmap.Attach(image.Detach()); 
+1

İyi bulma! Keşke daha iyi belgelenmiş olsaydı, bunu yıllardır gerçekten kullanabilirdim :( – Roel

+1

Parametreler tam tersi: 'image.Load (IDB_PNG1, AfxGetInstanceHandle());' – cwschmidt

2

bulunan CPngImage, fakat sadece bir kolu bunu kullanabilirsiniz sizin için yararlı olabilir.

Yoksa HBITMAP bir CBitMap alabilirsiniz eğer bu fonksiyon aynı zamanda iyidir döndürür.

Bunu ticari bir uygulamada kullanıyorum ve çalışıyor.

// Based on afxbutton.cpp's static function ButtonLoadBitmap 
HBITMAP __stdcall ButtonLoadBitmap(UINT uiBmpResId) 
{ 
    if (uiBmpResId == 0) 
    { 
     return NULL; 
    } 

    LPCTSTR lpszResourceName = MAKEINTRESOURCE(uiBmpResId); 
    ENSURE(lpszResourceName != NULL); 

    HBITMAP hbmp = NULL; 

    // Try to load PNG image first: 
    CPngImage pngImage; 
    if (pngImage.Load(lpszResourceName)) 
    { 
     hbmp = (HBITMAP) pngImage.Detach(); 
    } 
    else 
    { 
     HINSTANCE hinstRes = AfxFindResourceHandle(lpszResourceName, RT_BITMAP); 
     if (hinstRes == NULL) 
     { 
      return NULL; 
     } 

     UINT uiLoadImageFlags = LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS; 

     hbmp = (HBITMAP) ::LoadImage(hinstRes, lpszResourceName, IMAGE_BITMAP, 0, 0, uiLoadImageFlags); 
    } 

    return hbmp; 
} 
İlgili konular