[WinAPI] Wyświetlanie bitmapy


(rycerz2000) #1

Potrzebny mi kod który wyświetli obrazek (bitmapę) Próbowałem go pisać z pomocą kursów ale się nie udało.

Oto kod:

#include <windows.h>

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    HBITMAP hbmObraz;
    hbmObraz =( HBITMAP ) LoadImage( NULL, "obrazek.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );

    HDC hdcNowy = CreateCompatibleDC( hdc );
    SelectObject( hdcNowy, hbmObraz );

    BITMAP bmInfo;
    GetObject( hbmObraz, sizeof( bmInfo ), & bmInfo );

    HBITMAP hbmOld =( HBITMAP ) SelectObject( hdcNowy, hbmObraz );

    hdc = GetDC( hwnd );
    BitBlt( hdc, 50, 50, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCCOPY );
    ReleaseDC( hwnd, hdc );

    SelectObject( hdcNowy, hbmOld );
    DeleteDC( hdcNowy );
    DeleteObject( hbmObraz );
    return 0;
}

Z błędów wynika że hdc i hwnd nie są zdeklarowane ale ja nie wiem jak je zdeklarować. :frowning:

C:\Users\Kom\Favorites\Desktop\mój program\test\program1.cpp:8:39: error: 'hdc' was not declared in this scope
C:\Users\Kom\Favorites\Desktop\mój program\test\program1.cpp:16:18: error: 'hwnd' was not declared in this scope

Czy ktoś mógłby pomóc i poprawić ten kod tak aby działał? [-o<


(Rolek0) #2

CreateCompatibleDC tworzy pamięciowy kontekst kompatybilny z innym kontekstem.

Z czym twój kontekst ma być kompatybilny? (jeśli chcesz wyświetlać na ekranie, to dobrze by było, żeby był kompatybilny z ekranem; HDC hdc = GetDC(NULL); //dostaniesz kontekst całego ekranu).

GetDC pobiera kontekst danego okna, więc musisz najpierw zdobyć uchwyt jakiegoś okna (albo rysować bezpośrednio na ekran [patrz wyżej]).

Polecam :arrow: http://xion.org.pl/productions/texts/coding/megatutorial/ :wink:


(rycerz2000) #3

Po próbuje z tym.  :-k  Co prawda nie do końca rozumiem dokumentacje microsofta  :|  ale może jakoś dam rady.


(Edgarus) #4

BTW, powinno się to wrzucić do obsługi komunikatu WM_PAINT w procedurze okna:

switch (message)
{
  case WM_PAINT:
  hdc = BeginPaint(hwnd, &ps);
  // tutaj Twoje rysowanie
  EndPaint(hwnd, &ps);
  return 0L;

// inne komunikaty
}