#include <windows.h>
#include <gdiplus.h> HBITMAP LoadBitmapFromResource(DWORD ResourceID, bool transparent = true)
{
HANDLE hGlobal = NULL;
ULONG_PTR GDIToken = ;
Gdiplus::Image* Img = NULL;
Gdiplus::GdiplusStartupInput GDIStartInput = NULL; Gdiplus::GdiplusStartup(&GDIToken, &GDIStartInput, NULL); HRSRC hResource = FindResource(NULL, MAKEINTRESOURCE(ResourceID), "BINARY");
if (!hResource) {return NULL;} HGLOBAL hFileResource = LoadResource(NULL, hResource);
if (!hFileResource) {return NULL;} LPVOID lpFile = LockResource(hFileResource);
if (!lpFile) {return NULL;} DWORD dwSize = SizeofResource(NULL, hResource);
if (!dwSize) {return NULL;} void* data = LockResource(hFileResource);
if (!data) {return NULL;} IStream* pStream = NULL;
hGlobal = GlobalAlloc(GMEM_FIXED, dwSize); memcpy(hGlobal, data, dwSize);
UnlockResource(hFileResource);
FreeResource(hFileResource); if (CreateStreamOnHGlobal(hGlobal, true, &pStream) == S_OK)
{
Img = new Gdiplus::Image(pStream, false);
pStream->Release();
GlobalFree(hGlobal);
hGlobal = NULL; HBITMAP hBitmap = NULL;
static_cast<Gdiplus::Bitmap*>(Img)->GetHBITMAP(transparent ? Gdiplus::Color::Transparent : Gdiplus::Color(, , ), &hBitmap); delete Img;
Gdiplus::GdiplusShutdown(GdiImage::GDIToken);
GDIStartInput = NULL;
GDIToken = ; return hBitmap;
} GlobalFree(hGlobal);
hGlobal = NULL;
Gdiplus::GdiplusShutdown(GdiImage::GDIToken);
GDIStartInput = NULL;
GDIToken = ; return NULL;
}

最后会返回可操作的hBitmap句柄

另附上异曲同工的代码:

Gdiplus::Bitmap *loadimage(HINSTANCE hinst, const wchar_t* name)
{
auto hres = FindResource(hinst, name, RT_RCDATA);
if(!hres)
return nullptr;//resource not found if(auto size = SizeofResource(hinst, hres))
if(auto data = LockResource(LoadResource(hinst, hres)))
if(auto stream = SHCreateMemStream((const BYTE*)data, size))
{
auto *bmp = new Gdiplus::Bitmap(stream);
if(!bmp)
{
//wrong input, or gdiplus was not initialized
}
stream->Release();
return bmp;
} return nullptr;
} ...
auto gimg = loadimage(hinst, MAKEINTRESOURCE(ID_PNG1));
Gdiplus::Color clr = Gdiplus::Color::Transparent;
gimg->GetHBITMAP(Gdiplus::Color::Transparent, &bitmap);
ImageList_AddMasked(himage, bitmap, ));
DeleteObject(bitmap);
//资源定义应如下所示: ID_PNG1 RCDATA "file.png"
//确保初始化Gdiplus: struct gdiplus_init
{
Gdiplus::GdiplusStartupInput tmp;
ULONG_PTR token;
gdiplus_init(){ Gdiplus::GdiplusStartup(&token, &tmp, NULL); }
~gdiplus_init(){ Gdiplus::GdiplusShutdown(token); }
} gdipls_init;

附上代码链接:https://stackoverflow.com/questions/58751417/how-can-i-add-a-transparent-png-as-a-toolbar-icon

       https://stackoverflow.com/questions/58749796/win32-unable-to-add-custom-toolbar-icon-having-transparency

使用GDI+加载32位的位图或者PNG图片(具有透明通道)的更多相关文章

  1. 解决windows server2003 64位操作系统上不能加载32位应用程序dll 的问题

    [FileLoadException: Could not load file or assembly 'sapnco_utils, Version=3.0.0.42, Culture=neutral ...

  2. VB6之GDI+加载PNG图片

    原生的VB6不支持PNG个图片,因为刚有VB的时候还没有PNG的概念呢.不过,利用GDI+加载解析个PNG简直是砍瓜切菜般简单. GDI+的模块是我在网上下载的,地址应该是:http://vistas ...

  3. Android 高清加载巨图方案, 拒绝压缩图片

    源地址:http://blog.csdn.net/lmj623565791/article/details/49300989 一.概述 距离上一篇博客有段时间没更新了,主要是最近有些私事导致的,那么就 ...

  4. 代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)

    代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到 ...

  5. UWP开发细节记录:加载图像文件到D2D位图和D3D纹理

    在UWP中加载文件一般先创建 StorageFile 对象,然后调用StorageFile.OpenReadAsync 方法得到一个IRandomAccessStream 接口用来读取数据: Stor ...

  6. ★android开发--ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)

    例子中用于解析Json的Gson请自己Google下载 主Activity: package COM.Example.Main; import java.util.HashMap; import ja ...

  7. img加载不出来,给个默认图片。

    忽然发现,jq里也有坑,很多东西莫名其妙的被废弃了……所以,只能用原生js来做了: $('img').each(function() { if (!this.complete || typeof th ...

  8. SDWebImage 加载Https自签名证书时的图片问题

    你是否遇到了这种情况,好不容易把自签名HTTPS证书配置好了,访问https接口也成功了,但是图片加载不出来? 传了SDWebImageAllowInvalidSSLCertificates 还是没效 ...

  9. idea 设置加载多个资源文件,显示本地图片

    idea 经常只会设置一个资源路径,这个路径就是项目的路径.但是当要加载的文件处于其他位置时,则需要增加虚拟路径的配置. 如图:第一个是项目路径 第二个是图片路径

随机推荐

  1. app测试自动化操作方法之三

    首先导包: from appium.webdriver.common.touch_action import TouchAction #(导包指针定位滑动手势密码那个) #设置手势密码(前提是在设备上 ...

  2. react中递归生成列表

    import React, {Component} from 'react'; import { Menu, Icon } from 'antd'; import {Link} from 'react ...

  3. 【JulyEdu-Python基础】第 1 课:入门基础

    一些学习资源的收集: 可汗学院 视频 公开课 Grossin 编程教室: 一个非常简单,对初学者非常友好的教程和在线联系 廖雪峰教程 书籍: Python核心编程: 这本书应该是最清楚.最深入全面的书 ...

  4. 华为HCNA乱学Round 10:PPP&PAP

  5. C++学习笔记-C++对C语言的扩充和增强

    C++兼容C,在C的基础上学习C++是一个不错的选择,也能够更好的了解C与C++的区别与联系. 变量定义 C语言中的变量都必须在作用域开始的位置定义 C++中更强调语言的实用性,所有的变量都可以在需要 ...

  6. 递归拷贝目录与删除目录 WindowsAPI C++

    /*判断一个路径是否是已存在的目录*/ bool IsDirectory(const std::wstring& pstrPath) { DWORD dw = GetFileAttribute ...

  7. [转帖]ORA-00600: internal error code, arguments: [4193]问题解决

    ORA-00600: internal error code, arguments: [4193]问题解决 https://www.cnblogs.com/linyfeng/p/7496736.htm ...

  8. Fiddle-常用设置和操作记录

    1.导出证书: 2.清空屏幕: 3.字段认识 4.保存会话: 5.解码

  9. Codeforces 1209D Cow and Snacks

    题目大意 有 $n$ 个不同的糖果,从 $1$ 到 $n$ 编号.有 $k$ 个客人.要用糖果招待客人. 对于每个客人,这些糖果中恰有两个是其最爱.第 $i$ 个客人最爱的糖果编号是 $x_i$ 和 ...

  10. # Tallest Cows(差分)

    Tallest Cows(差分) n头牛,给出最高牛的位置和身高,其他牛身高未知,给出m对相对关系,表示可以相互看见当且仅当他们中间的牛都比他们矮.求每头牛身高最大值是多少. 差分数组的性质:前缀和为 ...