• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed [WinAPI] Wczytywanie bitmapy do zasobu

Object Storage Arubacloud
0 głosów
539 wizyt
pytanie zadane 11 października 2019 w C i C++ przez dawid2002 Mądrala (5,190 p.)
zamknięte 11 października 2019 przez dawid2002

Witam! Mam taki problem, że chcę wczytać bitmapę do programu w taki sposób, aby sama bitmapa była wewnątrz pliku wykonywalnego. Dlatego właśnie napisałem taki kod:

#include <windows.h>

#define IDB_LOGO 1234

IDB_LOGO BITMAP "DarkCult.bmp"

HBITMAP hLogo = LoadBitmap( hInst, MAKEINTRESOURCE( IDB_LOGO ) );

Jest on ze strony http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Podstawy/Zasoby/336 . W trzeciej linii jest błąd

expected unqualified-id before numeric constant

Nie wiem, dlaczego ten kod nie działa. Generalnie chciałbym po prostu wczytać tę bitmapę właśnie dzięki zasobom.

Z góry dziękuje za pomoc!

 

komentarz zamknięcia: znam już odpowiedź
komentarz 11 października 2019 przez tkz Nałogowiec (42,000 p.)

#define IDB_LOGO 1234

 

IDB_LOGO BITMAP "DarkCult.bmp"

Pomysł dlaczego jest to źle. Co się stanie jak kompilator podmieni IDB_LOGO na 1234.

komentarz 11 października 2019 przez dawid2002 Mądrala (5,190 p.)

@tkz tak wiem wydaje się to dziwne, ale tak było to opisane w tym kursie: http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Podstawy/Zasoby/336

komentarz 11 października 2019 przez tkz Nałogowiec (42,000 p.)
Fakt, kompletnie nielogiczne się wydaje.

1 odpowiedź

0 głosów
odpowiedź 11 października 2019 przez j23 Mędrzec (194,920 p.)
wybrane 11 października 2019 przez dawid2002
 
Najlepsza
IDB_LOGO BITMAP "DarkCult.bmp"

Ta linia powinna być w pliku .rc a nie źródłowym.

HBITMAP hLogo = LoadBitmap( hInst, MAKEINTRESOURCE( IDB_LOGO ) );

A to wywołanie funkcji powinno znaleźć się co najmniej w funkcji main/WinMain.

komentarz 11 października 2019 przez dawid2002 Mądrala (5,190 p.)
Pierwszą linię umieściłem w pliku .rc a drugą w funkcji WinMain tak jak kazałeś ale błąd nadal jest :(
komentarz 11 października 2019 przez j23 Mędrzec (194,920 p.)

Kilka pytań:

  • W jakim IDE kompilujesz.
  • Jak stworzyłeś projekt aplikacji.
  • Jak dodałeś plik .rc do projektu.

 

komentarz 11 października 2019 przez dawid2002 Mądrala (5,190 p.)
1. Code::Blocks 17.12

2. i 3. wybrałem typ projektu "Win32 GUI project" póżniej wybrałem opcję "frame based" . Utworzyłem plik .rc , który dodałem do projektu za pomocą opcji "Add files" w drzewku projektu
komentarz 11 października 2019 przez j23 Mędrzec (194,920 p.)
OK, pokaż kod (z plikiem .rc włącznie).
komentarz 11 października 2019 przez dawid2002 Mądrala (5,190 p.)

kod pliku main.cpp :

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

HINSTANCE hInst;

#include "zasoby.rc"

// definicje tych funkcji sa ponizej
LRESULT CALLBACK WindowEventProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam);
void wypelnienie_struktury_WNDCLASSEX(WNDCLASSEX& KlasaOkna, HINSTANCE& hInstance);
inline HWND Tworzenie_oraz_wyswietlanie_okna(HINSTANCE& hInstance);

LPCSTR NazwaKlasy = "Klasa naszego Okna";

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
    hInst = hInstance;

    WNDCLASSEX KlasaOkna;
    wypelnienie_struktury_WNDCLASSEX(KlasaOkna, hInstance);
    if( RegisterClassEx( &KlasaOkna ) == 0 )
        return 1;

    HWND hwnd;
    hwnd = Tworzenie_oraz_wyswietlanie_okna(hInstance);

    MSG Komunikat;
    Komunikat.message = WM_NULL;

    while ( Komunikat.message != WM_QUIT )
    {
        if ( PeekMessage(&Komunikat, NULL, 0, 0, PM_REMOVE) )
        {
            TranslateMessage (&Komunikat);
            DispatchMessage (&Komunikat);
        }
    }

    return Komunikat.wParam;
}

LRESULT CALLBACK WindowEventProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch(Msg)
    {

    case WM_CLOSE:
    {
        DestroyWindow( hwnd );
        break;
    }

    case WM_DESTROY:
    {
        PostQuitMessage( 0 );
        break;
    }

    default:
        return DefWindowProc( hwnd, Msg, wParam, lParam );
    }

    return 0;

}

void wypelnienie_struktury_WNDCLASSEX(WNDCLASSEX& KlasaOkna, HINSTANCE& hInstance)
{
    ZeroMemory (&KlasaOkna, sizeof(WNDCLASSEX));

    KlasaOkna.cbSize = sizeof(WNDCLASSEX);
    KlasaOkna.hInstance = hInstance;
    KlasaOkna.lpfnWndProc = WindowEventProc;
    KlasaOkna.lpszClassName = NazwaKlasy;
    KlasaOkna.hCursor = LoadCursor(NULL, IDC_ARROW);
    KlasaOkna.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    KlasaOkna.hbrBackground = (HBRUSH) (COLOR_WINDOW);
}

inline HWND Tworzenie_oraz_wyswietlanie_okna(HINSTANCE& hInstance)
{
    HWND hwnd;
    hwnd = CreateWindowEx(NULL,
                          NazwaKlasy,
                          "Okno",
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow (hwnd, SW_SHOWNORMAL);

    return hwnd;
}

kod pliku zasoby.rc :

#include <windows.h>

#define IDB_LOGO 1234

IDB_LOGO BITMAP "DarkCult.bmp"

HBITMAP hLogo = LoadBitmap( hInst, MAKEINTRESOURCE( IDB_LOGO ) );

 

komentarz 11 października 2019 przez j23 Mędrzec (194,920 p.)

#include "zasoby.rc"

Pliku .rc nie dodajesz w ten sposób. Wywal tę linię.

HBITMAP hLogo = LoadBitmap( hInst, MAKEINTRESOURCE( IDB_LOGO ) );

A tę linie wywal z pliku zasoby.rc. W pliku zasobów nie powinno być kodu wykonywalnego.

#define IDB_LOGO 1234

Stwórz sobie plik nagłówkowy (np. zasoby.h), dodaj do niego tę definicję (i inne w przyszłości), załącz go w pliku zasoby.rc i w pliku main.cpp. Tę linie wywal z zasoby.rc.

komentarz 11 października 2019 przez dawid2002 Mądrala (5,190 p.)
Działa! Bardzo ci dziękuje męczę się już drugi dzień z tym, a to było takie proste!

Dzięki raz jeszcze!

Podobne pytania

0 głosów
0 odpowiedzi 332 wizyt
pytanie zadane 11 stycznia 2022 w C i C++ przez MKolaj15 Bywalec (2,270 p.)
0 głosów
2 odpowiedzi 1,525 wizyt
pytanie zadane 5 sierpnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
1 odpowiedź 129 wizyt
pytanie zadane 25 stycznia 2019 w C i C++ przez Bartosz Pawlak Początkujący (370 p.)

92,552 zapytań

141,399 odpowiedzi

319,534 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...