使用.png文件而不是在Windows程序中使用.ico文件

时间:2009-06-29 04:07:16

标签: png icons

嗨我有很好的.png文件集合.... 同时,我正在开发一个基于win的软件,需要一些.ico文件作为工具栏按钮的图标......

有没有办法将.png文件用作图标?或者什么?

谢谢

4 个答案:

答案 0 :(得分:8)

作为一种解决方法,您可以使用IrfanView将* .png文件转换为* .ico文件(或任何其他图像转换为ico)&用它。

http://www.irfanview.com/main_download_engl.htm

答案 1 :(得分:1)

如果您正在使用.NET,这对您来说不是一个真正的问题,因为已经内置了afaik PNG支持。您可能正在讨论使用GDI / win32进行本机C / C ++开发?

据我所知,你不会通过简单地使用GDI来实现这一点。有几个选项可以将ONE颜色设置为透明,然后加载一个简单的BMP / JPEG并执行一些BITMAP技巧,但使用ICO / GIF会更容易。

您可能正在寻找的是一个有效的GDI +示例,它将使用带有Alpha通道的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 +内存实际上是CPU /内存密集型的。虽然很有趣但我放弃了这种方法,转而采用gdi和简单的BMP。

答案 2 :(得分:1)

您只需将图像转换为在线Icon Convert的ico文件。

答案 3 :(得分:0)

如果您要从资源文件加载图像,那么不,您不能使用PNG,您必须使用ICO。幸运的是,有许多工具可以将PNG转换为ICO,包括ImageMagick(非常适合自动化),MSPaint作为最低标准。

如果你在运行时加载图像文件,那么你可以加载你想要的任何类型的图像格式(例如使用libpng加载PNG),但你仍然必须在内部将它们转换为图标用它们做有趣的事情,比如将它们设置为窗口的图标。一旦你解码了图像数据,将它转换为正确的格式并不是非常困难,但它并不简单,它只涉及大量的数据修改和来自Win32 API的奇怪结构和函数调用。