Если вы используете .NET, то это не является для вас реальной проблемой, потому что уже встроена поддержка PNG. Возможно, вы говорите о разработке на C / C ++ с использованием GDI / win32?
Насколько мне известно, вы не достигнете этого, просто используя GDI. Есть пара опций, в которых вы можете установить ОДИН цвет как прозрачный, затем загрузить простой BMP / JPEG и выполнить некоторые трюки с BITMAP, однако использовать ICO / GIF будет намного проще.
Что вы, вероятно, ищете, это рабочий пример GDI +, который будет использовать PNG с альфа-каналом? Это всего лишь отрывок, и я исключил весь беспорядок загрузки внешних функций из части DLL, но, возможно, это поможет вам:
static GpImage *background = NULL;
GDIPLOADIMAGEFROMSTREAM GdipLoadImageFromStream;
GDIPLUSSTARTUP GdiplusStartup;
GDIPPLUSSHUTDOWN GdiplusShutdown;
GDIPCREATEFROMHDC GdipCreateFromHDC;
GDIPDELETEGRAPHICS GdipDeleteGraphics;
GDIPDRAWIMAGEI GdipDrawImageI;
GDIPDRAWIMAGERECTI GdipDrawImageRectI;
GDIPLUS_STARTUP_INPUT GdiplusStartupInput;
void LoadPNG(GpImage **image, int resource, HMODULE hInstance)
{
HRSRC resrc;
LPSTREAM lpstr;
HGLOBAL hPng;
LPVOID fByte;
GpImage *img = NULL;
resrc = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(resource), TEXT("PNG"));
hPng = LoadResource(GetModuleHandle(NULL), resrc);
fByte = LockResource(hPng);
lpstr = SHCreateMemStream(fByte, 200000);
GdipLoadImageFromStream(lpstr, &img);
*image = img;
}
void CreateBack(HWND hWnd)
{
HDC memDC = NULL;
HDC hdc = NULL;
RECT rect;
DeleteObject(curBack);
GetClientRect(hWnd, &rect);
hdc = GetDC(hWnd);
memDC = CreateCompatibleDC(hdc);
curBack = CreateCompatibleBitmap(hdc, rect.right, 44);
SelectObject(memDC, curBack);
/* gdiplus - background*/ {
int e = 0;
GpGraphics *g;
GdipCreateFromHDC(memDC, &g);
GdipDrawImageRectI(g, background, e, 0, 971, 44);
GdipDeleteGraphics(g);
}
DeleteObject(memDC);
ReleaseDC(hWnd, hdc);
}
Просто короткое примечание: этот материал GDI + действительно требует значительных ресурсов процессора / памяти по нескольким причинам. Хотя забавно, я отказался от этого подхода в пользу gdi и простых BMP.