[Dev C++] Ładowanie bitmapy z zasobów

0

Prosze Was o pomoc, bo już powoli tracę cierpliwość. Szukałem na forum, robiłem tak, jak w przykładowym programie dołączonym do kompilatora, również tak jak jest w kursie, no i mi nie działa...

Mniej wiecej zapisuje to tak:

  1. Dodaję do projektu nowy plik zasobów 'resource.res' i pisze w nim:

    IDB_BITMAP BITMAP "bitmapa.bmp"

  2. Deklaruję takie zmienne:

    HINSTANCE hInstance;
    HDC hDC, hMemDC;
    PAINTSTRUCT Ps;
    HBITMAP bmpBitmapa;

  3. W procedurze zdarzeniowej piszę:
    (...)
    case WM_PAINT:

         hDC = BeginPaint(hWnd, &Ps);
         bmpBitmapa = LoadBitmap(hInstance, "IDB_BITMAP");
         hMemDC = CreateCompatibleDC(hDC); 
         SelectObject(hMemDC, bmpBitmapa);
         BitBlt(hDC, 0,0,100,100, hMemDC, 10,10, SRCPAINT);
         DeleteDC(hMemDC);
         DeleteObject(bmpBitmapa);
         EndPaint(hWnd, &Ps);
    

    (...)

    Odnosnie funkcji LoadBitmap(), drugi parametr zapisywalem tez w nastepujacy
    sposob:

    • IDB_BITMAP
    • MAKEINTRESOURCE(IDB_BITMAP)
    • MAKEINTRESOURCE("IDB_BITMAP")
      Za kazdym razem, peogram kompiluje sie bez problemow, natomiast bitmapa
      nie jest wyswietlana. Plik wykonywalny zwieksza swoje rozmiary mniej wiecej o
      rozmiar pliku "bitmapa.bmp", czyli... nie mam pojecia co jest nie tak.
      Prosze o pomoc i z gory dziekuje.
0

Jeżeli kopiujesz bitmapkę przy użyciu flagi SRCPAINT na kontekst, którego tło jest białe, to nic Ci się nie pokaże gdyż:

MSDN napisał(a)

SRCPAINT
Combines the colors of the source and destination rectangles by using the Boolean OR operator.

Spróbuj użyć flagi SRCCOPY.

0

Uzylem SRCCOPY i nic to nie dalo.

0

Sama procedura rysująca wygląda dobrze. W LoadBitmap użyj MAKEINTRESOURCE(IDB_BITMAP) i upewnij się czy hInstance jest rzeczywiście uchwytem do Twojego programu. Jeżeli nadal będą problemy, to błąd najprawdopodobniej leży w innym miejscu

0

Parametr HINSTANCE hInstance jest taki sam dla LoadBitmap(); WINAPI WinMain(); WNDCLASSEX. Czyli:

HINSTANCE hInstance;
(..)
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, ... )
(...)
LoadBitmap(hInstance, MAKEINTRESOURCE("IDB_BITMAP"));

Brak zmian.

0

Najgorsze jest to, ze do kompilatora jest dolaczony przykladowy plik, w ktorym bitmapa jest ladowana z zasobiw. No ale nie mam zielonego pojecia co moge robic nie tak... niby tak samo, a u mnie nie dziala :(

0

Sprawdz czy w ogole LoadBitmap zwraca uchwyt bitmapy czy blad. Jezeli blad to nie stosuj stalej nazwy tylko sprobuj z sama liczba, jaka reprezentuje nazwa bitmapy w zasobach:

...
HBITMAP H = LoadBitmap(Inst, MAKEINTRESOURCE(1120));
if (H==NULL)
{
 //shit, nie zaladowalo
} 
...
0

FAKTYCZNIE!!! LoadBitmap() nie zwraca uchwytu do HBITMAP. Czyli juz wiadomo, gdzie jest blad.
Dziekuje bardzo!

Tylko skad mam wiedziec, jaka liczba reprezentuje bitmape w zasobach?

0

Qrde! Nie dziala! (...)
:[

0

A w ogole przy kompilacji dolacza Ci sie plik zasobow? Zobacz po kompilacji za pomoca jakiegos edytora zasobow czy plik wynikowy je zawiera i przy okazji czy zasoby maja takie nazwy.

0

Hurrraaa!!! Problem zostal rozwiazany!!! (szczegolne podziekowania za rady, ktorych udzielil 'Twardy')

Dodac musze, ze 'Bialy' od razu domyslil sie w czym tkwi problem, ale glupi ja go zignoralem, bo myslalem, ze w tym aspekcie wszystko MUSI byc OK, a tak nie bylo.

Otoz to kolega 'Twardy' podsunal pomysl ze sprawdzeniem, czy LoadBitmap nie zwraca przypadkiem NULL. Tak tez sie dzialo, wiec wiadome bylo, gdzie powinienem szukac. No i czytajac jeden tutorial znalazlem funkcje GetModuleHandle() - ktora zwraca uchwyt do instancji programu. Poprzedzilem LoadBitmap instrukcja:
HINSTANCE hInstance = GetModuleHandle(NULL);
no i teraz wszystko dziala jak nalezy :)

Jeszcze raz bardzo Wam dziekuje za wszystkie udzielone mi rady.

Pozdrawiam,

      Wojtek
0

tam juz pare osob Tobie wczesniej podalo:
i zreszta nie wiem po co deklarowales w ogole hinstance ono jest przekazywane do glownej funkcji programu winmain
i jak stosujesz identyfikator IDB_BITMAP nie stosujesz MAKEINTERSOURCE tylko przekazujesz bezposrednio jakjo string "IDB_BITMAP"

1 użytkowników online, w tym zalogowanych: 0, gości: 1