WINAPI - wczytywanie bitmapy z pliku

0

Witam,
Chciałbym napisać programik wczytujący i wyświetlający bitmapę. Utworzyłem sobie odpowiednie buttony itp. Mam jedynie problem z przekazaniem do LoadImage ścieżki do pliku.

Oto kod:

 LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    PAINTSTRUCT ps;
    switch( msg )
    {
    case WM_PAINT:
        {
            
            
            bitmapa =( HBITMAP ) LoadImage( 0, a.bmp, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
            GetObject( bitmapa, sizeof( BITMAP ), & info_bitmapy );
            HDC hdc = BeginPaint( hwnd, & ps );
            HDC hdcBitmapy = CreateCompatibleDC( hdc );
            bitmapa =( HBITMAP ) SelectObject( hdcBitmapy, bitmapa );
            BitBlt( hdc, 10, 10, info_bitmapy.bmWidth, info_bitmapy.bmHeight, hdcBitmapy, 0, 0, SRCCOPY );
            bitmapa =( HBITMAP ) SelectObject( hdcBitmapy, bitmapa );
            EndPaint( hwnd, & ps );
            DeleteDC( hdcBitmapy );
        }
        break;
    case WM_COMMAND:
        {
            switch( LOWORD( wParam ) )
            {
            case WCZYTAJ:
                OPENFILENAME ofn;
                char sNazwaPliku[ MAX_PATH ] = "";
                
                ZeroMemory( & ofn, sizeof( ofn ) );
                ofn.lStructSize = sizeof( ofn );
                ofn.lpstrFilter = "Pliki graficzne (*.bmp)\0*.bmp\0";
                ofn.nMaxFile = MAX_PATH;
                ofn.lpstrFile = sNazwaPliku;
                ofn.lpstrDefExt = "bmp";
                ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
            }
            break;
        }
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
    case WM_DESTROY:
        //zwolnienie bitmapy
        DeleteObject( bitmapa );
        PostQuitMessage( 0 );
        break;
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
    return 0;
}

Prośba o sugestie i pomoc w rozwiązaniu problemu.

1

Ta w WM_PAINT zawsze wczytujesz obrazek bo pewnie nie da się go raz załadować i zapamiętać w zmiennej uchwyt, wymiary... i tylko raz usuwasz bitmapę przypominam że ilość zasobów jest ograniczona! Za każdym razem rób tylko to od BeginPaint do EndPaint a co do problemu to kto wie co to jest to a.bmp?

0

Słuszna sugestia.
a.bmp jest to przykładowy plik bitmapy umieszczony w katalogu z programem (w ten sposób wczytuje się prawidłowo). Generalnie zgodnie z dokumentacją na msdni-e umieszcza się tam ścieżkę do pliku który chcemy wczytać. Właśnie tą ścieżkę chcę pobrać w oknie dialogowym:

 case WM_COMMAND:
        {
            switch( LOWORD( wParam ) )
            {
            case WCZYTAJ:
                OPENFILENAME ofn;
                char sNazwaPliku[ MAX_PATH ] = "";
 
                ZeroMemory( & ofn, sizeof( ofn ) );
                ofn.lStructSize = sizeof( ofn );
                ofn.lpstrFilter = "Pliki graficzne (*.bmp)\0*.bmp\0";
                ofn.nMaxFile = MAX_PATH;
                ofn.lpstrFile = sNazwaPliku;
                ofn.lpstrDefExt = "bmp";
                ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
            }
            break;

Okno wyświetla mi się prawidłowo, można wybrać dowolny plik z rozszerzeniem *.bmp tylko nie wiem jak przekazać później ścieżkę wybranego pliku do

bitmapa =( HBITMAP ) LoadImage( 0, //ścieżka//, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
1

Po wypełnieniu ofn musisz uruchomić GetOpenFileName, i ścieżkę dostaniesz w sNazwaPliku.

0

Dzięki !

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