#include #include extern HDC hDC; char * buffer; void user_read_data(png_structp, png_bytep data, png_size_t length){ memcpy(data, buffer, length); buffer += length; } HBITMAP ReadPNGIcon(int ID){ HRSRC resource = FindResource(NULL, MAKEINTRESOURCE(ID), RT_RCDATA); buffer = (char *) LockResource(LoadResource(NULL, resource)); png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); png_set_read_fn(png_ptr, NULL, user_read_data); png_infop info_ptr = png_create_info_struct(png_ptr); png_read_info(png_ptr, info_ptr); png_uint_32 width, height; int bit_depth, color_type; png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL); if(color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(png_ptr); else if(color_type == PNG_COLOR_TYPE_PALETTE || color_type == PNG_COLOR_MASK_PALETTE) png_set_palette_to_rgb(png_ptr); png_set_add_alpha(png_ptr, 0xFF, PNG_FILLER_AFTER); png_set_bgr(png_ptr); png_read_update_info(png_ptr, info_ptr); BITMAPINFOHEADER bmi = { sizeof(BITMAPINFOHEADER), //biSize width, //biWidth height, //biHeight 1, //biPlanes 32, //biBitCount BI_RGB, //biCompression width*height*4, //biSizeImage 0, //biXPelsPerMeter 0, //biYPelsPerMeter 0, //biClrUsed 0 //biClrImportant }; unsigned char *buffer; png_bytep row_pointers[height]; HBITMAP hBmp = CreateDIBSection(hDC, (BITMAPINFO*) &bmi, DIB_RGB_COLORS, (void**) &buffer, NULL, 0); for(unsigned i=0; i