嗨我有一個漂亮的.png文件的集合.... 與此同時,我正在開發一個基於win的軟件,並且需要一些.ico文件作爲圖標爲工具欄按鈕和...在Windows程序中使用.png文件代替使用.ico文件
有沒有什麼辦法可以使用.png文件作爲圖標?或者是什麼?
謝謝
嗨我有一個漂亮的.png文件的集合.... 與此同時,我正在開發一個基於win的軟件,並且需要一些.ico文件作爲圖標爲工具欄按鈕和...在Windows程序中使用.png文件代替使用.ico文件
有沒有什麼辦法可以使用.png文件作爲圖標?或者是什麼?
謝謝
如果你從一個資源文件中加載圖像,然後不,你不能使用png格式,你必須使用感染控制主任。幸運的是,有很多工具可以將PNG轉換爲ICO,包括ImageMagick(很適合自動化)和MSPaint作爲最低公分母。
如果你在運行時加載圖像文件,那麼你可以加載任何你想要的圖像格式(例如使用libpng加載PNG),但你仍然必須在內部將它們轉換爲圖標,然後才能做有趣的事情與他們,如設置他們作爲一個窗口的圖標。一旦你對圖像數據進行了解碼,將其轉換爲正確的格式並不難,但這並不是微不足道的,它只涉及很多來自Win32 API的數據混亂和奇怪的結構和函數調用。
只需將您的PNG存儲爲RCDATA資源即可。不過,您可能需要更改一些加載代碼。 – Roddy 2012-08-17 14:31:47
作爲解決方法,您可以使用IrfanView將* .png文件轉換爲* .ico文件(或任何其他圖像到ico)&使用它。
其中一個最酷的最快輕量級圖像查看器 – Qwerty 2016-06-19 11:17:32
如果您使用的是.NET,這是不是你真正的問題,因爲據我所知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。
我忽略了一件事,爲了使這項工作您需要切換到您的工具欄中的所有者繪製的按鈕...只有在我看來值得它,如果你有一個變化或多彩的背景。 – merkuro 2009-06-29 04:42:58
您可以簡單地將圖像轉換爲在線的ico文件Icon Convert。
想知道Windows仍然是唯一不支持圖標圖像文件的主要桌面操作系統。 Linux有它,MacOS有它......很長一段時間...... – rbaleksandar 2016-08-30 06:09:38
什麼語言/平臺?什麼特定的UI控件? – colithium 2009-06-29 04:15:39