如何使用Win32/GDI加载PNG图像(如果可能,没有GDI +)?

jnm*_*nm2 22 c++ winapi png gdi image

是否可以使用Win32 GDI函数将PNG从文件加载到HBITMAP中?如果没有,没有使用外部库(如libpng),最轻的解决方案是什么?

Bra*_*ger 24

您可以使用Windows Imaging Component加载PNG文件(在Windows XP SP2及更高版本上).有关如何使用API​​和我的博客文章的介绍,请参阅MSDN杂志,以获取从IStream加载PNG并将其转换为HBITMAP的代码示例.

  • @jrh是的,看起来Microsoft将该页面拉低了,但是可以使用存档副本:http://web.archive.org/web/20080507014245/http://msdn.microsoft.com/zh-cn/magazine/ cc500647.aspx (2认同)

vad*_*_hr 7

无需使用Windows Imaging Component,GDI +或PNG库.您可以使用图标功能.

  1. 使用自定义宽度和高度(资源编辑器 - >图像 - >新图像类型)将新图标(ICO_PNG)添加到VC项目资源.复制您的png图像并使用填充工具+透明颜色使图标透明.

  2. 将Picture Control(IDC_PNG)添加到对话框(Type = Owner draw).

  3. 对话程序代码:

switch (msg)
{
    ...

    case WM_DRAWITEM:
    {
        LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)lParam;
        if (pDIS->CtlID == IDC_PNG)
        {
            HICON hIcon = (HICON)LoadImage(GetModuleHandle(0), MAKEINTRESOURCE(ICO_LOGO), IMAGE_ICON, 0, 0, LR_LOADTRANSPARENT); 
            DrawIconEx(pDIS->hDC, 0, 0, hIcon, 0, 0, 0, NULL, DI_NORMAL);
            DestroyIcon(hIcon);
            return TRUE;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你确定LoadImage可以加载PNG资源吗?我没有创建IDC,只需要加载资源,但看起来它没有加载。 (2认同)