2009-06-29 83 views
3

嗨我有一個漂亮的.png文件的集合.... 與此同時,我正在開發一個基於win的軟件,並且需要一些.ico文件作爲圖標爲工具欄按鈕和...在Windows程序中使用.png文件代替使用.ico文件

有沒有什麼辦法可以使用.png文件作爲圖標?或者是什麼?

謝謝

+0

什麼語言/平臺?什麼特定的UI控件? – colithium 2009-06-29 04:15:39

回答

0

如果你從一個資源文件中加載圖像,然後不,你不能使用png格式,你必須使用感染控制主任。幸運的是,有很多工具可以將PNG轉換爲ICO,包括ImageMagick(很適合自動化)和MSPaint作爲最低公分母。

如果你在運行時加載圖像文件,那麼你可以加載任何你想要的圖像格式(例如使用libpng加載PNG),但你仍然必須在內部將它們轉換爲圖標,然後才能做有趣的事情與他們,如設置他們作爲一個窗口的圖標。一旦你對圖像數據進行了解碼,將其轉換爲正確的格式並不難,但這並不是微不足道的,它只涉及很多來自Win32 API的數據混亂和奇怪的結構和函數調用。

+0

只需將您的PNG存儲爲RCDATA資源即可。不過,您可能需要更改一些加載代碼。 – Roddy 2012-08-17 14:31:47

1

如果您使用的是.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。

+0

我忽略了一件事,爲了使這項工作您需要切換到您的工具欄中的所有者繪製的按鈕...只有在我看來值得它,如果你有一個變化或多彩的背景。 – merkuro 2009-06-29 04:42:58

1

您可以簡單地將圖像轉換爲在線的ico文件Icon Convert

+0

想知道Windows仍然是唯一不支持圖標圖像文件的主要桌面操作系統。 Linux有它,MacOS有它......很長一段時間...... – rbaleksandar 2016-08-30 06:09:38

相關問題