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

[C++ WinAPI] Bitmapa

Ostatnio zmodyfikowano 2017-01-02 20:42
Autor Wiadomość
Krzychu97
Temat założony przez niniejszego użytkownika
[C++ WinAPI] Bitmapa
» 2016-12-30 03:35:07
Witam! Mam problem z wczytaniem bitmapy. Próbowałem dowiedzieć się co może źle działać więc umieściłem w kodzie funkcję GetLastError() która zwraca mi wartość 0 co oznacza że wszystko działa dobrze. Pomimo tego nadal w oknie nie ma bitmapy.

C/C++
#include <windows.h>
#include <stdio.h>

using namespace std;
HWND Okno;
HBITMAP bitmapa; //uchwyt naszej bitmapy
BITMAP info_bitmapy; //struktura inforamcyjna bitmapy

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR lStart, INT nShow )
{
    //wczytywanie bitmapy z dysku i pobranie informacji
    bitmapa =( HBITMAP ) LoadImage( 0, "D:\\CodeBlock Projekty\\Bitmapa\\BMP.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
    if( bitmapa == 0 )
    {
        char msg_text[ 256 ];
        sprintf( msg_text, "%i", GetLastError() );
        MessageBox( Okno, msg_text, "Komunikat", MB_OK );
    }
    GetObject( bitmapa, sizeof( BITMAP ), & info_bitmapy ); //pobieramy informacje o bitmapie, potrzebujemy jej wymiarów
   
    WNDCLASSEX wc;
    wc.hInstance = hInst;
    wc.lpszClassName = "Klasa okna";
    wc.lpfnWndProc = WndProc;
    wc.style = CS_DBLCLKS;
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.hIcon = LoadIcon( 0, IDI_APPLICATION );
    wc.hIconSm = LoadIcon( 0, IDI_APPLICATION );
    wc.hCursor = LoadCursor( 0, IDC_ARROW );
    wc.lpszMenuName = 0;
    wc.hbrBackground =( HBRUSH ) GetStockObject( WHITE_BRUSH );
    wc.cbWndExtra = 0;
    wc.cbClsExtra = 0;
    if( RegisterClassEx( & wc ) == 0 ) return 0;
   
    HWND Okno = CreateWindowEx( 0, "Klasa okna", "Tytu³ okna", WS_OVERLAPPEDWINDOW, 50, 50, 800, 600, 0, 0, hInst, 0 );
    MSG msgs;
   
    ShowWindow( Okno, nShow );
    UpdateWindow( Okno );
   
    while( GetMessage( & msgs, 0, 0, 0 ) )
    {
        TranslateMessage( & msgs );
        DispatchMessage( & msgs );
    }
    //po zakoñczeniu pracy programu zwalniamy bitmapê
    DeleteObject( bitmapa );
    return msgs.wParam;
}

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wPar, LPARAM lPar )
{
    HDC hdc, hdcBitmapy; //zmienne na 2 konteksty
    PAINTSTRUCT ps;
    switch( msg )
    {
    case WM_PAINT:
        hdc = BeginPaint( hwnd, & ps ); //kontekst okna uzyskujemy w momencie odrysowywania
        hdcBitmapy = CreateCompatibleDC( hdc ); //teraz musimy utworzyæ kontekst pamiêciowy dla bitmapy
        bitmapa =( HBITMAP ) SelectObject( hdcBitmapy, bitmapa ); //zamieniamy konteksty wi¹¿¹c bitmapê z kontekstem
        BitBlt( hdc, 0, 0, info_bitmapy.bmWidth, info_bitmapy.bmHeight, hdcBitmapy, 0, 0, SRCCOPY );
        bitmapa =( HBITMAP ) SelectObject( hdcBitmapy, bitmapa ); //z powrotem zamieniamy bitmapy w kontekœcie
        DeleteDC( hdcBitmapy ); //usuwamy kontekst pamiêciowy bitmapy
        EndPaint( hwnd, & ps );
        break;
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
        default:
        return DefWindowProc( hwnd, msg, wPar, lPar );
    }
    return 0;
}
P-155681
j23
» 2016-12-30 11:08:06
info_bitmapy zawiera oczekiwane dane?
P-155683
Krzychu97
Temat założony przez niniejszego użytkownika
» 2016-12-30 15:02:04
Spróbowałem tego kodu:

C/C++
bitmapa =( HBITMAP ) LoadImage( 0, "D:\\CodeBlock Projekty\\F4\\BMP.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
GetObject( bitmapa, sizeof( BITMAP ), & info_bitmapy ); //pobieramy informacje o bitmapie, potrzebujemy jej wymiarów
char msg_text[ 256 ];
sprintf( msg_text, "GetWindowText failed -> %i", info_bitmapy.bmWidth );
MessageBox( Okno, msg_text, "Komunikat", MB_OK );

i otrzymałem odpowiedz GetWindowText failed -> 0. Bitmapa ma wymiary 300 na 300. Próbowałem jeszcze wczytać ją bez funkcji wczytującej rozmiar bitmapy podając odpowiednie wartości jako argumenty dla BitBlt (zamiast info_bitmapy.bmWidth,info_bitmapy.bmHeight podałem 300, 300) ale też nie przyniosło to żadnych rezultatów.
P-155696
j23
» 2016-12-30 18:30:36
Dobra, jeszcze raz. Czy LoadImage zwraca uchwyt do bitmapy (czy NULL)?
P-155709
Krzychu97
Temat założony przez niniejszego użytkownika
» 2016-12-31 16:50:22
Wykonuje mi się kod w tym if:

C/C++
if( bitmapa == 0 )
{
    char msg_text[ 256 ];
    sprintf( msg_text, "%i", GetLastError() );
    MessageBox( Okno, msg_text, "Komunikat", MB_OK );
}

więc zwraca NULL.
P-155745
j23
» 2016-12-31 18:10:53
I GetLastError zwraca 0? Spróbuj z flagą LR_CREATEDIBSECTION.
P-155748
Krzychu97
Temat założony przez niniejszego użytkownika
» 2017-01-02 00:35:14
Tak GetLastError zwraca zero. Zamieniłem flagę i teraz zwraca 1814.
ERROR_RESOURCE_NAME_NOT_FOUND
1814 (0x716)
The specified resource name cannot be found in the image file.
Uprzedzając pytanie czy dany plik istnieje:
C/C++
bitmapa =( HBITMAP ) LoadImage( 0, "D:\\CodeBlock Projekty\\SXSXSXSXSXSX\\BMP.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
 https://zapodaj.net​/0ad8e06b06dbd.png.html
P-155800
j23
» 2017-01-02 10:52:56
No ale dlaczego usunąłeś flagę LR_LOADFROMFILE? Obie powinny tam być.
P-155808
« 1 » 2
  Strona 1 z 2 Następna strona