2010-10-21 63 views
11

我在OnInitDialog()上試過下面的代碼,但沒有顯示任何內容。如何在對話框的圖片控件中加載png資源?

m_staticLogo.SetBitmap(::LoadBitmap(NULL, MAKEINTRESOURCE(IDB_LOGO))); 

其中m_staticLogo是靜態圖片控件,IDB_LOGO是png文件的資源ID。

+1

重複的http://stackoverflow.com/questions/3005685/ – ulatekh 2013-11-19 21:49:56

回答

16

正如你已經發現,::LoadBitmap(和更新的::LoadImage)只能處理.bmp秒。目前最簡單的解決方案是將圖像轉換爲.bmp

如果圖像具有透明度,可以將其轉換爲32位ARGB位圖(這裏是一個名爲AlphaConv的工具,可以將其轉換)。然後使用CImageLoadFromResource方法加載圖像。通過CImagem_staticLogo.SetBitmap()

但是,如果你真的需要它是一個.png,它可以完成。

方法1(更簡單的方法):使用CImage::Load從文件中加載.png。通過CImagem_staticLogo.SetBitmap()

方法2(較硬的方式):通過裝載資源到COM IStream和使用CImage::Load加載從資源的.png。 (注意:CImage::LoadFromResource看起來很誘人,但不適用於.png圖形)。要獲取資源到COM IStream,請參閱this Codeproject article。請注意,該文章與Gdiplus::Bitmap一起工作,但關鍵部分是如何創建IStream,您應該能夠適應CImage。最後,通過CImagem_staticLogo.SetBitmap()

編輯:更新使用CImage,比Gdiplus::Bitmap容易。

+0

我將png文件轉換爲bmp,但問題是轉換後圖像的背景不再透明。有什麼方法可以轉換並保持透明背景嗎? – 2010-10-22 03:19:47

+0

方法1可以工作,但我更願意在資源文件中有圖形。方法2對我來說太困難了。 – 2010-10-22 03:23:24

+0

您可以通過將'.png'轉換爲32位「ARGB」'.bmp'來保持透明度。像Paint.NET這樣的標準工具不會這樣做。我已經使用可用的工具更新了文章。在Visual Studio中查看時可能看起來很奇怪,但渲染正常。這對單色背景很有效。如果你有像照片一樣的複雜背景,它將不起作用。 – Nate 2010-10-22 09:10:02

1

它支持的位圖和圖標。不確定png。或者,也可以嘗試以下方法。

  1. 在MS Paint或其他瀏覽器中打開PNG。
  2. 然後從中複製圖像部分。
  3. 在MFC資源中創建資源。
  4. 將複製的圖像粘貼到新創建的資源。
  5. 在LoadBitmap中使用新資源ID。
0

如果您要將.png圖像文件轉換爲.bmp格式,最終可能會導致圖像清晰。所以,趕上WM_PAINT消息對話框類,並使用

圖形::的DrawImage方法

要獲得此法gdiplus.lib庫鏈接您的項目。

3

對於這些,誰需要快速的解決方案,這裏是加載使用GDI +資源png文件的方式(原來的答案爲標準GDI從這裏 - http://www.codeproject.com/Questions/377803/How-to-load-PNG-images-in-mfc):

bool GdiPlusUtils::LoadBitmapFromPNG(UINT uResourceID, 
    Bitmap** ppBitmapOut, HINSTANCE hInstance /*= NULL*/) 
{ 
    bool bRet = false; 

    if (!hInstance) 
     hInstance = AfxGetInstanceHandle(); 

    HRSRC hResourceHandle = ::FindResource(
     hInstance, MAKEINTRESOURCE(uResourceID), L"PNG"); 
    if (0 == hResourceHandle) 
    { 
     return bRet; 
    } 

    DWORD nImageSize = ::SizeofResource(hInstance, hResourceHandle); 
    if (0 == nImageSize) 
    { 
     return bRet; 
    } 

    HGLOBAL hResourceInstance = ::LoadResource(hInstance, hResourceHandle); 
    if (0 == hResourceInstance) 
    { 
     return bRet; 
    } 

    const void* pResourceData = ::LockResource(hResourceInstance); 
    if (0 == pResourceData) 
    { 
     FreeResource(hResourceInstance); 
     return bRet; 
    } 

    HGLOBAL hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, nImageSize); 
    if (0 == hBuffer) 
    { 
     FreeResource(hResourceInstance); 
     return bRet; 
    } 

    void* pBuffer = ::GlobalLock(hBuffer); 
    if (0 != pBuffer) 
    { 
     CopyMemory(pBuffer, pResourceData, nImageSize); 
     IStream* pStream = 0; 
     if (S_OK == ::CreateStreamOnHGlobal(hBuffer, FALSE, &pStream)) 
     { 
      *ppBitmapOut = new Bitmap(pStream); 
      pStream->Release(); 
      bRet = true; 
     } 
     ::GlobalUnlock(hBuffer); 
    } 
    ::GlobalFree(hBuffer); 

    UnlockResource(hResourceInstance); 
    FreeResource(hResourceInstance); 

    return bRet; 
} 

您可以添加PNG文件作爲資源使用添加資源命令並在面板中選擇導入。