Como eu carregaria uma imagem PNG usando Win32 / GDI (sem GDI + se possível)?

É possível carregar um PNG de um arquivo em um HBITMAP usando funções GDI do Win32? Se não, qual seria a solução mais leve sem usar bibliotecas externas (como libpng)?

Você pode usar o Windows Imaging Component para carregar arquivos PNG (no Windows XP SP2 e posterior). Veja MSDN Magazine para uma introdução sobre como usar a API e minha postagem de blog para um exemplo de código que carrega um PNG de um IStream e o converte em um HBITMAP.

Não há necessidade de usar o Windows Imaging Component, biblioteca GDI + ou PNG. Você pode usar a funcionalidade Icon.

  1. Adicionar novo ícone (ICO_PNG) aos resources do projeto VC com largura e altura personalizadas (Editor de resources-> Imagem-> Novo tipo de imagem). Copie sua imagem PNG aqui e use a ferramenta Preenchimento + cor transparente para tornar o ícone transparente.

  2. Adicionar Picture Control (IDC_PNG) ao seu diálogo (Type = Owner draw).

  3. Código do procedimento de diálogo:

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; } } } 

Você pode fazer isso com a API do StretchDIBits , mas limitada pela disponibilidade do SO / driver.

Consulte a documentação do MSDN para detalhes:

http://msdn.microsoft.com/en-us/library/dd145121(v=VS.85).aspx

http://msdn.microsoft.com/en-us/library/dd145107(VS.85).aspx


Peço sinceras desculpas por enganar vocês interessados ​​nesta questão. Deixe-me corrigir meu erro. Não há StretchDIBits para o desenho PNG. É melhor você tentar o método WIC ou considerar a maneira de integrar o GDI + em seus projetos.

Não acho que o GDI suporta png, você já olhou para libpng