你好,我有一组漂亮的.png文件....同时,我正在开发一个基于Windows的软件,需要一些.ico文件作为工具栏按钮的图标...
有没有办法将.png文件用作图标?还是说需要其他方法?
谢谢。
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+技术对CPU和内存的占用非常高。虽然很有趣,但我还是放弃了这种方法,转而使用gdi和简单的BMP。
如果您从资源文件中加载图像,则不能使用PNG格式,必须使用ICO格式。幸运的是,有许多工具可以将PNG格式转换为ICO格式,包括ImageMagick(非常适合自动化)和MSPaint作为最低公共分母。
如果您在运行时加载图像文件,则可以加载任何类型的图像格式(例如使用libpng来加载PNG格式),但仍然必须在内部将它们转换为图标,然后才能对其进行有趣的操作,例如将它们设置为窗口的图标。一旦解码了图像数据,将其转换为正确的格式并不是非常困难,但也不是微不足道的,它涉及到大量的数据处理和Win32 API中的奇怪结构体和函数调用。