c++ - ¿Cómo cargaría una imagen PNG usando Win32/GDI(si no es posible GDI+)?
winapi (4)
¿Es posible cargar un PNG desde un archivo en un HBITMAP usando las funciones de Win32 GDI? Si no, ¿cuál sería la solución más liviana sin usar bibliotecas externas (como libpng)?
No creas que GDI soporta png, ¿has visto libpng
No es necesario utilizar la biblioteca de Windows Imaging Component, GDI + o PNG. Puede utilizar la funcionalidad de icono.
Agregue un nuevo icono (ICO_PNG) a los recursos del proyecto de VC con Ancho y Altura personalizados (Editor de recursos-> Imagen-> Nuevo tipo de imagen). Copia tu imagen png aquí y usa la herramienta de relleno + color transparente para hacer que el icono sea transparente.
Agregue Picture Control (IDC_PNG) a su cuadro de diálogo (Type = Owner draw).
Código de procedimiento 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;
}
}
}
Puede hacerlo con la API de StretchDIBits
, pero limitada por la disponibilidad del sistema operativo / controlador.
Consulte la documentación de MSDN para más detalles:
http://msdn.microsoft.com/en-us/library/dd145121(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/dd145107(VS.85).aspx
Sinceramente, me disculpo por engañarles a ustedes interesados en este tema. Déjame corregir mi error. No hay StretchDIBits
para dibujo PNG. Será mejor que intente el método WIC o considere la forma de integrar GDI + en sus proyectos.
Puede usar el Componente de imágenes de Windows para cargar archivos PNG (en Windows XP SP2 y posterior). Consulte la revista MSDN para obtener una introducción sobre cómo usar la API y la publicación de mi blog para ver un ejemplo de código que carga un PNG desde un IStream y lo convierte en un HBITMAP.