簡體   English   中英

如何將png資源加載到對話框的圖片控件中?

[英]How to load a png resource into picture control on a dialog box?

我在OnInitDialog()上嘗試了以下代碼,但沒有顯示任何內容。

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

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

正如您所發現的, ::LoadBitmap (和較新的::LoadImage )僅處理.bmp 到目前為止,最簡單的解決方案是將圖像轉換為.bmp

如果圖像具有透明度,則可以將其轉換為32位ARGB位圖(這是一個名為AlphaConv的工具,可以對其進行轉換)。 然后使用CImageLoadFromResource方法加載圖像。 CImage傳遞給m_staticLogo.SetBitmap()

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

方法1(更簡單的方法):使用CImage::Load從文件加載.png CImage傳遞給m_staticLogo.SetBitmap()

方法2(更難的方法):通過將資源加載到COM IStream並使用CImage::Load從資源加載.png (注意: CImage::LoadFromResource看起來很誘人但不適用於.png圖形)。 要將資源放入COM IStream ,請參閱此Codeproject文章 請注意,本文適用於Gdiplus::Bitmap但關鍵部分是如何創建IStream ,您應該能夠適應CImage 最后,將CImage傳遞給m_staticLogo.SetBitmap()

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

對於那些需要快速解決方案的人來說,這是一種使用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文件添加為資源,然后在面板中選擇“導入”。

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

  1. 在MS Paint或其他一些查看器中打開png。
  2. 然后從中復制圖像部分。
  3. 在MFC資源中創建資源。
  4. 將復制的圖像粘貼到新創建的資源。
  5. 在LoadBitmap中使用新的資源ID。

如果要將.png圖像文件轉換為.bmp格式,則最終可以獲得圖像清晰度。 因此,在對話框類中捕獲WM_PAINT消息並使用

Graphics :: DrawImage方法

要獲取此方法,請將項目與gdiplus.lib庫鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM