2009-06-29 5 views

Antwort

0

Wenn Sie die Bilder aus einer Ressourcendatei einlegen, dann nein, man kann nicht PNGs verwenden, haben Sie ICOs zu verwenden. Glücklicherweise gibt es eine Reihe von Tools, die PNGs in ICOs konvertieren können, einschließlich ImageMagick (ideal für die Automatisierung) und MSPaint als kleinsten gemeinsamen Nenner.

Wenn Sie Bilddateien zur Laufzeit laden, können Sie jedes gewünschte Bildformat laden (z. B. libpng zum Laden von PNGs), müssen diese jedoch intern in Symbole konvertieren, bevor Sie interessante Dinge tun können mit ihnen, wie sie als ein Fenster-Symbol festlegen. Sobald Sie die Bilddaten entschlüsselt haben, ist es nicht besonders schwer, sie in das richtige Format zu konvertieren, aber es ist nicht trivial, es beinhaltet nur eine Menge Datenmangel und seltsame Strukturen und Funktionsaufrufe von der Win32-API.

+0

Speichern Sie Ihre PNGs einfach als RCDATA-Ressourcen. Möglicherweise müssen Sie jedoch etwas Ladecode ändern. – Roddy

8

Als Workaround können Sie IrfanView verwenden, um Ihre * .png Datei in * .ico Datei (oder jedes andere Bild zu ico) zu konvertieren & verwenden Sie es. wahrscheinlich reden über native C/C++ Entwicklung mit GDI/win32

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

+0

einer der coolsten schnellsten leichten Bildbetrachter – Qwerty

1

Wenn Sie mit .NET dies nicht für Sie ist ein echtes Problem, da afaik bereits PNG-Unterstützung in bauen. Sie sind?

Nach meinem Wissen werden Sie dies nicht erreichen, indem Sie einfach GDI verwenden. Es gibt eine Reihe von Optionen, bei denen Sie EINE Farbe als transparent festlegen, dann ein einfaches BMP/JPEG laden und einige BITMAP-Tricks ausführen können, aber die Verwendung von ICO/GIF wird wesentlich einfacher.

Was Sie wahrscheinlich suchen, ist ein funktionierendes GDI + Beispiel, das ein PNG mit Alphakanal verwendet? Dies ist nur ein Auszug und ich links von einem DLL Teil den ganzen Schlamassel Laden externer Funktionen aus, aber vielleicht wird diese Ihnen helfen:

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); 
} 

Nur eine kurze Anmerkung: Diese GDI + Zeug ist wirklich CPU/Speicher-intensive aus ein paar Gründen. Obwohl Spaß habe ich diesen Ansatz zugunsten von GDI und einfachen BMPs aufgegeben.

+0

Eine Sache, die ich ausgelassen habe, um das funktioniert zu bekommen, müssen Sie auf Besitzer gezeichneten Schaltflächen in der Symbolleiste wechseln ... nur lohnt es sich meiner Meinung nach, wenn Sie einen wechselnden oder mehrfarbigen Hintergrund haben. – merkuro

1

Sie können die Bilder einfach in ico Dateien online konvertieren Icon Convert.

+0

Ich muss die Tatsache lieben, dass Windows immer noch das einzige große Desktop-Betriebssystem ist, das keine Bilddateien für Icons unterstützt. Linux hat es, MacOS hat es ... Lange Zeit ... – rbaleksandar