2010-06-09 12 views
6

में लोड करें मैं एक सीबीटीमैप में पीएनजी संसाधन कैसे लोड करूं? जब मैं इसे आज़माता हूं तो यह काम नहीं करता है।एक पीएनजी संसाधन को सीबीआईटीएपी

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

यह मुझे एक त्रुटि संसाधन प्रकार नहीं मिला है। क्या पीएनजी संसाधन लोड करने का कोई और तरीका है?

+0

क्या LoadFromResource में या अटैच में त्रुटि है? एक डेवलपर के लिए – dwo

उत्तर

5

लोडफ्रॉम रिसोर्स आंतरिक रूप से लोडइमेज का उपयोग करता है, यह पिछली बार मैंने कोशिश की है कि पीएनजी का समर्थन नहीं किया गया है, दस्तावेज़ीकरण के बावजूद। आप सीएक्सआईमेज (कोडप्रोजेक्ट पर देखें) से लिंक कर सकते हैं लेकिन यह थोड़ा वास्तविक लाभ के लिए बहुत काम है।

मैंने अंत में जो किया वह पीएनजी के बारे में भूल गया था, पीएनजी को 32-बिट विंडोज बिटमैप्स में बदलने के लिए अल्फाकोनव का उपयोग करें और उन लोगों के साथ सीमैज का उपयोग करें। अतिरिक्त लाभ यह है कि आप बिना किसी परिवर्तन के एमएफसी में सीबीआईटीमैप बटन आदि के साथ उनका उपयोग कर सकते हैं।

इसके आस-पास हैक करने का एक और तरीका संसाधन सामग्री को एक अस्थायी फ़ाइल में निकालना है, फिर वहां से इसे पढ़ने के लिए CImage :: लोड का उपयोग करें। अगर मैं आपको अपने कोड बेस में से किसी एक में कर दूंगा, तो मैं आपको चेहरे पर फेंक दूंगा;)

+2

+1 जो वास्तव में अपने कोड बेस – Lothar

1

आपके लिए भारी भारोत्तोलन करने के लिए सीएक्सआईमेज (http://www.xdp.it/cximage.htm) जैसी लाइब्रेरी का उपयोग करें। कोड हो जाता है के रूप में सरल रूप में: -

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

(ध्यान दें कि मैं स्मृति से कोड लिख रहा हूँ - आप इसे काम करने के लिए प्राप्त करने के लिए यह थोड़ा बदलाव करने की आवश्यकता हो सकती!)

मैं CxImage एक का उपयोग मेरे कार्यक्रमों में ग्राफिक्स के लिए बहुत कुछ और यह चीजों को काफी सरल बनाता है।

16

आप VS2008 या नए (MFC फ़ीचर पैक) का उपयोग कर रहे हैं, तो आप CPngImage जो CBitmap से निकला है और <afxtoolbarimages.h>

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

की रक्षा करने जा रहा है अच्छा खोज! काश यह बेहतर दस्तावेज था, मैं वास्तव में वर्षों से इसका इस्तेमाल कर सकता था :( – Roel

+1

पैरामीटर इसके विपरीत हैं: 'image.Load (IDB_PNG1, AfxGetInstanceHandle());' – cwschmidt

2

में निहित है क्या तुम सच में एक CBitmap की जरूरत नहीं है, लेकिन केवल एक इस संभाल उपयोग कर सकते हैं आपके लिए उपयोगी हो सकता है

या यदि आप एचबीआईटीएमएपी से सीबीआईटीएपी प्राप्त कर सकते हैं तो यह फ़ंक्शन देता है यह भी अच्छा है।

मैं इसे वाणिज्यिक अनुप्रयोग पर उपयोग करता हूं और यह काम करता है।

// 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; 
} 
संबंधित मुद्दे