Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinApi] wczytywanie bitmapy z pliku

Ostatnio zmodyfikowano 2015-11-29 14:19
Autor Wiadomość
davix408
Temat założony przez niniejszego użytkownika
[WinApi] wczytywanie bitmapy z pliku
» 2015-11-28 19:50:29
Witam,
Niedawno rozpocząłem naukę WinApi. Na początek 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. Wczytanie bitmapy ze ścieżki przekazanej "na sztywno" działa prawidłowo.

Oto kod:
C/C++
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.  
P-141023
carlosmay
» 2015-11-28 21:14:58
C/C++
TCHAR szBMtrack[] = L"C:\\Users\\...\\Documents\\Visual Studio 2015\\bmtest.bmp";
// ....
hbmPict =( HBITMAP ) LoadImage( NULL, szBMtrack, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
 czy o to chodzi?
P-141037
davix408
Temat założony przez niniejszego użytkownika
» 2015-11-28 21:23:22
Nie do końca. Utworzyłem okno dialogowe do wyboru pliku *.bmp:
C/C++
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 sie otwiera można wskazać plik tylko nie wiem jak do uchwytu:
C/C++
bitmapa =( HBITMAP ) LoadImage( 0, "jakas_sciezka", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );

Przekazać ścieżkę do wybranego w oknie dialogowym pliku.
P-141039
carlosmay
» 2015-11-28 21:37:51
(LPSTR)sNazwaPliku
C/C++
bitmapa =( HBITMAP ) LoadImage( 0,( LPCWSTR ) sNazwaPliku, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
 a rzutowania próbowałeś?

edit:
Jeszcze nie wiem jak to rozwiązać, ale wiem czemu nie otwiera pliku.
Nazwa zapisana do zmiennej 'sNazwaPliku' ma format "C:\bbbb\name.bmp",
a ma mieć "C:\\bbbb\\name.bmp".
P-141040
davix408
Temat założony przez niniejszego użytkownika
» 2015-11-29 14:06:09
Udało się, ostatecznie zrobiłem w ten sposób:
C/C++
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;
if( GetOpenFileName( & ofn ) )
{
    LPCTSTR sciezka = ofn.lpstrFile;
    zaladowana = true;
    InvalidateRect( hwnd, NULL, true ); //aktualizacja po wczytaniu nowej
    bitmapa_load =( HBITMAP ) LoadImage( 0, sciezka, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
}
break;

Jak wyświetlić wartość zapisaną do zmiennej sNazwaPliku w outpucie ?
P-141073
carlosmay
» 2015-11-29 14:19:57
Jak wyświetlić wartość zapisaną do zmiennej sNazwaPliku w outpucie ?
 
MessageBox(, sNazwaPliku,, );
 
P-141074
« 1 »
  Strona 1 z 1