WinApi Pojawienie się bitmapy jeżeli dany warunek zostanie spełniony

0

Witam
Mam taki kod:

#include <string>
#include <windows.h>

#define IDT_TIMER1 1

LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
HWND g_hmenu;
HWND g_hstart;
WORD KulkaX = 100, KulkaY = 100;
SHORT SpeedX = 2, SpeedY = 2;
HWND g_hwnd;



HBITMAP bitmapa; //uchwyt naszej bitmapy
BITMAP info_bitmapy; //struktura inforamcyjna bitmapy



bool g_hgracc = false;




int gra(int gramenu){


    
if (gramenu == 1){
    
    

        
g_hgracc = true; 
           

bool z0 = true;


bool z2 = false;
bool z3 = false;
bool z4 = false;
bool z5 = false;


while (z0 == true){
    
z0 = false;
    
    
}




    
    

}

return g_hgracc;
}



void RysujKulke()
{


}


LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );









int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{



//wczytywanie bitmapy z dysku i pobranie informacji
  bitmapa=(HBITMAP)LoadImage(0,"bitmapa.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
  if(bitmapa==0)
  {
    MessageBox(0,"Nie można otworzyć pliku bitmap.bmp z folderu z aplikacją","Brak pliku",MB_ICONERROR);
    return 0; //zamkniecie programu w razie braku pliku bitmapy
  }
  GetObject(bitmapa,sizeof(BITMAP),&info_bitmapy); //pobieramy informacje o bitmapie, potrzebujemy jej wymiarów




    // WYPEŁNIANIE STRUKTURY
    WNDCLASSEX wc;
    
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = NazwaKlasy;
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
    
    // REJESTROWANIE KLASY OKNA
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
    
    // TWORZENIE OKNA
    HWND hwnd;
    
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Oto okienko", WS_OVERLAPPED | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU,
    CW_USEDEFAULT, CW_USEDEFAULT, 600, 800, NULL, NULL, hInstance, NULL );
    
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION );
        return 1;
    }
    
    ShowWindow( hwnd, nCmdShow ); // Pokaż okienko...
    UpdateWindow( hwnd );


    





  
    SetTimer(hwnd,             // handle to main window 
    IDT_TIMER1,            // timer identifier 
    10000,                 // 10-second interval 
    (TIMERPROC) NULL); 
     
    g_hstart = CreateWindowEx( 0, "BUTTON", "Rozpocznij gre", WS_CHILD | WS_VISIBLE,
    200, 50, 150, 30, hwnd, NULL, hInstance, NULL );
    
  
   
    
    
  
    

    
    // Pętla komunikatów
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;

DeleteObject(bitmapa);
  return  Komunikat.wParam;


}


// OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    
   HDC hdc,hdcBitmapy; //zmienne na 2 konteksty
  PAINTSTRUCT ps; 
    
    switch( msg )
    {
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
        

    
    case WM_PAINT:
     
       if (g_hgracc == false){  
     
    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
    //tutaj możemy przeprowadzać jakieś operacje graficzne z naszym kontekstem bitmapy
    //uwaga te operacje będą przeprowadzane co każde odświeżenie okna
    //wyświetlenie bitmapy na oknie, operacja przekopiowania


    BitBlt(hdc,100,200,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

    
    HDC hdcOkno;
    hdcOkno = GetDC( hwnd );
    
    POINT stary_punkt;
    MoveToEx( hdcOkno, 100, 100, & stary_punkt );
        if (g_hgracc == true){ 
    LineTo( hdcOkno, 210, 100 );
}

    ReleaseDC( hwnd, hdcOkno ); }
    EndPaint(hwnd,&ps);
      break;
    

    
    
    
    
    
    
    

    
    case WM_TIMER: 

    if (wParam == IDT_TIMER1) 
    { 
        
            // process the 10-second timer 

//       RysujKulke();

             return 0; 

} break;
    
    case WM_COMMAND:
    if(( HWND ) lParam == g_hmenu ){
     MessageBox( hwnd, "Nacisnąłeś przycisk!", "Ha!", MB_ICONINFORMATION );}
    
    
     if(( HWND ) lParam == g_hstart ){
     MessageBox( hwnd, "Nacisnąłeś start!", "Ha!", MB_ICONINFORMATION );
     gra (1);
     if (g_hgracc == true){
     
      
     DestroyWindow( g_hstart );
     
     g_hmenu = CreateWindowEx( 0, "BUTTON", "Menu", WS_CHILD | WS_VISIBLE,
     10, 10, 150, 30, hwnd, NULL, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL );
     
     CreateWindowEx( 0, "BUTTON", "Nowy guzik", WS_CHILD | WS_VISIBLE,
    300, 50, 150, 30, hwnd, NULL, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL );
     
     }  }     
    
    break;
    
    

    
    
    
        case WM_KEYDOWN:
        {
        switch(( int ) wParam )
        {
            
            
            
        case VK_ESCAPE:
        int msgboxID = MessageBox( hwnd, "Czy na pewno chcesz zamknac okno?", "Wyjście", MB_YESNOCANCEL );
        
        
        switch (msgboxID)
    {
    case IDYES:
        
        DestroyWindow( hwnd );
        // TODO: add code
        
    }
        
        
        
        
        break;
        
        
        }
        }
        break;
    
        
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
        
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
    
    


    
    
    
    
    
    
    
    return 0;
} 

Dopiero się uczę winapi i nie wiem jak zrobić żeby bitmapa pojawiła się dopiero po spełnieniu jakiegoś warunku (if cośtam). Próbowałem w różnych miejscach to dodać ale nie działa :(
Bardzo proszę o szybką pomoc.

0

Popraw formatowanie, bo oczopląsu można dostać. Po drugie, kiedy chcesz ten warunek sprawdzać? Jak okno "chce się" narysować, to dostajesz komunikat WM_PAINT i wtedy się rysuje co trzeba. Jak nie chcesz rysować tej bitmapy, to sobie ustawiasz if'a przed hdcBitmapy=CreateCompatibleDC(hdc); i kończysz za DeleteDC(hdcBitmapy); i się nie powinna chyba (bo źle mi patrzeć ;) ) narysować.

0

Nadal nie działa :(

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