Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How would I load a PNG image using Win32/GDI (no GDI+ if possible)?

Is it possible to load a PNG from a file into an HBITMAP using Win32 GDI functions? If not, what would be the lightest solution without using external libraries (like libpng)?

like image 226
jnm2 Avatar asked Dec 31 '10 03:12

jnm2


2 Answers

You can use the Windows Imaging Component to load PNG files (on Windows XP SP2 and later). See MSDN Magazine for an introduction on how to use the API and my blog post for a code sample that loads a PNG from an IStream and converts it to an HBITMAP.

like image 95
Bradley Grainger Avatar answered Sep 19 '22 00:09

Bradley Grainger


There is no need to use Windows Imaging Component, GDI+ or PNG library. You can use Icon functionality.

  1. Add new icon (ICO_PNG) to VC project resources with custom Width and Height (Resource Editor->Image->New Image Type). Copy Your png image here and use Fill Tool+transparent color to make icon transparent.

  2. Add Picture Control (IDC_PNG) to Your dialog (Type = Owner draw).

  3. Dialog procedure code:

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;         }     } } 
like image 28
vadim_hr Avatar answered Sep 19 '22 00:09

vadim_hr