在Windows程序中使用.png文件代替.ico文件

9

你好,我有一组漂亮的.png文件....同时,我正在开发一个基于Windows的软件,需要一些.ico文件作为工具栏按钮的图标...

有没有办法将.png文件用作图标?还是说需要其他方法?

谢谢。


什么语言/平台?使用哪个具体的UI控件? - colithium
4个回答

9

3
您可以使用在线工具 Ico Convert 将图片简单地转换为ico文件。

2
必须承认,Windows仍然是唯一一个不支持图像文件作为图标的主要桌面操作系统。Linux和MacOS都有这个功能...长期以来... - rbaleksandar

2
如果您正在使用.NET,那么这对您来说不是一个真正的问题,因为据我所知,PNG支持已经内置。您可能在谈论使用GDI/win32进行本机C/C++开发吧?
据我所知,您不能仅仅使用GDI就实现这一点。有几个选项可以将一个颜色设置为透明,然后加载一个简单的BMP/JPEG并进行一些位图技巧,但是使用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。


有一件事我没有提到,为了让这个工作起来,你需要在工具栏中切换到自绘按钮... 在我看来,只有在背景颜色变化或多彩的情况下才值得这样做。 - merkuro

0

如果您从资源文件中加载图像,则不能使用PNG格式,必须使用ICO格式。幸运的是,有许多工具可以将PNG格式转换为ICO格式,包括ImageMagick(非常适合自动化)和MSPaint作为最低公共分母。

如果您在运行时加载图像文件,则可以加载任何类型的图像格式(例如使用libpng来加载PNG格式),但仍然必须在内部将它们转换为图标,然后才能对其进行有趣的操作,例如将它们设置为窗口的图标。一旦解码了图像数据,将其转换为正确的格式并不是非常困难,但也不是微不足道的,它涉及到大量的数据处理和Win32 API中的奇怪结构体和函数调用。


只需将您的PNG文件存储为RCDATA资源。但是,您可能需要更改一些加载代码。 - Roddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接