none
如何内部加载PNG? RRS feed

  • 问题

  • 我用VC6.0对话框成功的加载并显示了PNG格式图片,但使用的是外部导入。

    像这样: Image image(L"Interface.jpg");

    我想知道如何使Image对象采用内部资源方式初始化(用ID初始化)?

    老郁闷了,麻烦各位了!

    2012年1月17日 4:51

答案

  • Image *pImg = NULL;
    HGLOBAL hGlobal = NULL;
    HRSRC hSource = NULL;
    LPVOID lpVoid = NULL;
    int nSize = 0;

    hSource = FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_PNG/*PNG资源的ID号*/), "PNG");

    if(hSource == NULL)
    return pRtImg;

    hGlobal = LoadResource(AfxGetResourceHandle(), hSource);
    if(hGlobal == NULL)
    {
    FreeResource(hGlobal); return pRetImg;
    }

    lpVoid = LockResource(hGlobal);
    if(lpVoid == NULL)
    goto Exit;

    nSize = (UINT)SizeofResource(AfxGetResourceHandle(), hSource);

    HGLOBAL hGlobal2 = GlobalAlloc(GMEM_MOVEABLE, nSize);
    if(hGlobal2 == NULL)
    {
    goto Exit;
    }

    void* pData = GlobalLock(hGlobal2);
    memcpy(pData, (void *)hGlobal, nSize);
    GlobalUnlock(hGlobal2);

    IStream* pStream = NULL;

    if(CreateStreamOnHGlobal(hGlobal2, TRUE, &pStream) == S_OK)
    {

    pRetImg = Image::FromStream(pStream, FALSE);
    pStream->Release();
    }

    FreeResource(hGlobal2);

     

    酱紫就可以了.

    • 已标记为答案 yshkcj 2012年1月18日 11:40
    2012年1月18日 4:58

全部回复

  • 可以将资源释放到文件中然后再加载。

    FindResource/SizeofResource/LoadResource/GlobalAlloc/GlobalFree/FreeResource
    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2012年1月17日 5:54
    版主
  • 不好意思,我已经放到工程中了。但是我不懂得如何用Image对象加载。

    2012年1月17日 6:01
  • Image *pImg = NULL;
    HGLOBAL hGlobal = NULL;
    HRSRC hSource = NULL;
    LPVOID lpVoid = NULL;
    int nSize = 0;

    hSource = FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_PNG/*PNG资源的ID号*/), "PNG");

    if(hSource == NULL)
    return pRtImg;

    hGlobal = LoadResource(AfxGetResourceHandle(), hSource);
    if(hGlobal == NULL)
    {
    FreeResource(hGlobal); return pRetImg;
    }

    lpVoid = LockResource(hGlobal);
    if(lpVoid == NULL)
    goto Exit;

    nSize = (UINT)SizeofResource(AfxGetResourceHandle(), hSource);

    HGLOBAL hGlobal2 = GlobalAlloc(GMEM_MOVEABLE, nSize);
    if(hGlobal2 == NULL)
    {
    goto Exit;
    }

    void* pData = GlobalLock(hGlobal2);
    memcpy(pData, (void *)hGlobal, nSize);
    GlobalUnlock(hGlobal2);

    IStream* pStream = NULL;

    if(CreateStreamOnHGlobal(hGlobal2, TRUE, &pStream) == S_OK)
    {

    pRetImg = Image::FromStream(pStream, FALSE);
    pStream->Release();
    }

    FreeResource(hGlobal2);

     

    酱紫就可以了.

    • 已标记为答案 yshkcj 2012年1月18日 11:40
    2012年1月18日 4:58
  • 太有才了你!!
    2012年1月18日 11:41