2009-10-07 7 views
6

Używam programu Visual Studio 2008, plik PNG jest ładowany w widoku zasobów, przypisano mu IDB_BANG_PNG.Programowe ustawianie pliku PNG na przetwarzanie obrazu w interfejsach API Win32

Kontrola obrazu nazywa się IDC_STATIC15.

Mam problemy z próbą załadowania PNG do sterowania obrazem.

LRESULT CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 

// Way of loading a bmp with a mask perhaps? Or a PNG file programatically? 

static HBRUSH hBrushStatic; 
HBITMAP hBmp = LoadBitmap(hDlg,MAKEINTRESOURCE(IDB_BANG_PNG)); 

switch(message) 
{ 
case WM_INITDIALOG:  
    CheckDlgButton(hDlg, IDC_CHECK, FALSE); 
    EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); 
    // Bitmap version is IDB_BANG, PNG is at IDB_BANG_PNG 
    // IDC_STATIC15 is the picture frame 
    HWND item = GetDlgItem(hDlg,IDC_STATIC15); 
    SendMessage(item,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hBmp); 
    return TRUE; 

// .... snip 

Jestem raczej naiwny, jeśli chodzi o programowanie Win32/GUI, robiąc szybki projekt i utknąłem, każda pomoc jest doceniana.

+0

Potrzebujesz pliku bitmapowego. Chcesz przekonwertować obraz PNG na obraz BMP. – anno

+0

Przeczytałem, że można obsługiwać PNG, ale trzeba to zrobić programowo. Gdy dodam obrazy, używając filtru obrazu hte, * .png jest jednym z wymienionych elementów. –

+0

Problem polega na tym, że chcę zachować przezroczyste tło, dlatego chcę używać formatu PNG. O ile nie mogę utworzyć maski przy użyciu BMP lub zezwolić, aby plik ICO korzystał z ikony o większym rozmiarze, a nie 32x32. –

Odpowiedz

0

Osobiście używam klasy CPictureEx. Myślę, że nie obsługuje png, ale bmp, jpeg i animowanego gif.

Używam również grafiki Cairo do renderowania specjalnego. Kair obsługuje format png.
Oczywiście Kair jest nieco trudniejszy w użyciu.

+0

Ten projekt nad którym pracuję jest w C, nie w C++. Klasy, CImage, MFC itd. Nie będą możliwe i nie będą się kompilować. Jak mogę pomalować bmp w formant obrazu, w oknie dialogowym w czasie wykonywania? –

4

Działa to za pomocą GDI+ a bitmap class:

Bitmap oBmp(L"D:\\test.png"); 
HBITMAP hBmp; 
oBmp.GetHBITMAP(0, &hBmp); 
SendMessage(item,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hBmp); 

Niektóre kontrola caveats.Your potrzebuje styl SS_BITMAP. Nie zapomnij dołączyć gdiplus.h i jego biblioteki. Musisz zainicjować (GdiplusStartup) i zamknąć GDI +. Uwolnienie wszystkich zasobów systemowych jest na ciebie.

0

Czy sprawdziłeś bibliotekę DevIL/OpenIL? Jest on oparty na nazwie funkcji OpenGL i jest zapisany w dobrym języku C. C.

Użyłem w przeszłości, z powodzeniem. Jest również bardzo przenośny.

Sprawdź to tutaj: http://openil.sourceforge.net/features.php

2

Nie sądzę LoadBitmap lub inny zwykły funkcja GDI (takich jak LoadImage) załaduje PNG.

Możesz zapisać swój zasób do 32-bitowego BMP za pomocą narzędzia do edycji obrazu, a następnie użyć LoadImage z LR_CREATEDIBSECTION.

Lub możesz użyć biblioteki, która załaduje plik PNG do DIBSECTION. GDI + będzie ładować PNG i JPG oprócz BMP.

Biblioteki automatyzacji OLE mają również interfejs IPicture, który można utworzyć z różnymi typami obrazów, a następnie uzyskać podstawową DIBSECTION. Używanie go jest niezręczne, zwłaszcza jeśli nie znasz COM. Aby uzyskać punkt początkowy, patrz OleLoadPicture.