• [转载]从网络上搜索到的代码,经过部分改造,从资源中加载任何图像资源。


    代码:

    typedef BOOL (*load_function)(void* param, IStream* lpStream);
    
    
    BOOL LoadFromIStream(IStream* lpStream, load_function func, void* param)
    {
        return (*func)(param, lpStream);
    }
    
    BOOL LoadFromBuffer(const BYTE* lpBuf, DWORD dwSize, load_function func, void* param)
    {
        if (NULL == lpBuf || dwSize <= 0)
            return FALSE;
    
        HGLOBAL hGlobal = ::GlobalAlloc(GHND, dwSize);
        if (NULL == hGlobal)
            return FALSE;
    
        LPVOID lpBuffer = ::GlobalLock(hGlobal);
        if (NULL == lpBuffer)
        {
            ::GlobalFree(hGlobal);
            return FALSE;
        }
    
        memcpy(lpBuffer, lpBuf, dwSize);
        ::GlobalUnlock(hGlobal);
    
        LPSTREAM lpStream = NULL;
        HRESULT hr = ::CreateStreamOnHGlobal(hGlobal, TRUE, &lpStream);
        if (hr != S_OK)
        {
            ::GlobalFree(hGlobal);
            return FALSE;
        }
    
        BOOL bRet = LoadFromIStream(lpStream, func, param);
        lpStream->Release();
    
        return bRet;
    }
    
    BOOL LoadFromResource(HINSTANCE hInstance, LPCTSTR pszResourceName, LPCTSTR pszResType, load_function func, void* param)
    {
        HRSRC hRsrc = ::FindResource(hInstance, pszResourceName, pszResType);
        if (NULL == hRsrc)
            return FALSE;
    
        DWORD dwSize = ::SizeofResource(hInstance, hRsrc); 
        if (0 == dwSize)
            return FALSE;
    
        HGLOBAL hGlobal = ::LoadResource(hInstance, hRsrc); 
        if (NULL == hGlobal)
            return FALSE;
    
        LPVOID pBuffer = ::LockResource(hGlobal);
        if (NULL == pBuffer)
        {
            ::FreeResource(hGlobal);
            return FALSE;
        }
    
        HGLOBAL hGlobal2 = ::GlobalAlloc(GHND, dwSize);
        if (NULL == hGlobal2)
        {
            ::FreeResource(hGlobal);
            return FALSE;
        }
    
        LPVOID pBuffer2 = ::GlobalLock(hGlobal2);
        if (NULL == pBuffer2)
        {
            ::GlobalFree(hGlobal2);
            ::FreeResource(hGlobal);
            return FALSE;
        }
    
        memcpy(pBuffer2, pBuffer, dwSize);
        ::GlobalUnlock(hGlobal2);
    
        LPSTREAM pStream = NULL;
        HRESULT hr = ::CreateStreamOnHGlobal(hGlobal2, TRUE, &pStream);
        if (hr != S_OK)
        {
            ::GlobalFree(hGlobal2);
            ::FreeResource(hGlobal);
            return FALSE;
        }
    
        BOOL bRet = LoadFromIStream(pStream, func, param);
    
        if (pStream)
            pStream->Release();
    
        ::FreeResource(hGlobal);
    
        return bRet;
    }
    
    BOOL LoadFromResource(HINSTANCE hInstance, UINT nIDResource, LPCTSTR pszResType, load_function func, void* param)
    {
        return LoadFromResource(hInstance, MAKEINTRESOURCE(nIDResource), pszResType, func, param);
    }

    使用办法:

    typedef BOOL (*load_function)(void* param, IStream* lpStream);
    
    BOOL LoadFromResource(HINSTANCE hInstance, UINT nIDResource, LPCTSTR pszResType, load_function func, void* param);
    
    class CImageStatic : public CWindowImpl<CImageStatic, CStatic>,
        public COwnerDraw<CImageStatic>
    {
    private:
        static BOOL __LoadFunc(void* param, IStream* lpStream)
        {
            return ((CImageStatic*)param)->_LoadFunc(lpStream);
        }
        BOOL _LoadFunc(IStream* lpStream)
        {
            HRESULT hr = x_pImage->Load(lpStream);
            if (hr == S_OK)
            {
                return TRUE;
            }
            else
            {
                return FALSE;
            }
        }
    
    protected:
        CImage    *x_pImage;

        void SetResId(unsigned int res_id)
        {
            if (!x_pImage)
                delete x_pImage;
            x_pImage = new CImage();
            LoadFromResource(::GetModuleHandle(NULL), res_id, MAKEINTRESOURCE(IDR_GIF), &__LoadFunc, this);
            this->Invalidate();
        }
  • 相关阅读:
    Mac 远程连接 Windows
    更优雅的方式: JavaScript 中顺序执行异步函数
    Node.js 上传文件
    win10 系统右键菜单不显示文字(只有小图标)修复方法
    JavaScript 排序算法(JavaScript sorting algorithms)
    JavaScript addEventListener 第三个参数
    前端小白之每天学习记录----angula2--(1)
    H5如何与Native通信Hybrid交互--(1)
    vuex学习--(1)
    前端小白之每天学习记录----php(9)简单的api
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/14648095.html
Copyright © 2020-2023  润新知