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

Odpowiedz Nowy wątek
2011-10-06 20:28
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.

Pozostało 580 znaków

2011-10-06 20:52
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ć.


Pozdro & poćwicz!

Pozostało 580 znaków

2011-10-06 21:08
0

Nadal nie działa :(

Super, a teraz powiedz co nie działa i wstaw kod za to odpowiedzialny. - stfu 2011-10-06 21:32
Dałem if (g_hgracc == true){ ... } przed hdcBitmapy=CreateCompatibleDC(hdc); i zamknąłem za DeleteDC(hdcBitmapy); - Kamil9132 2011-10-06 21:52
Sprawdź debuggerem czy wchodzi w ten kawałek kodu, jaką wartość ma wtedy g_hgracc i dlaczego taką, a nie inną. - stfu 2011-10-06 22:21
Wydaje mi się że tego nie muszę sprawdzać, ponieważ kawałek pod tym jest kolejne if (g_hgracc == true), ale tam wszystko działa " if (g_hgracc == true){ LineTo( hdcOkno, 210, 100 );}" - Kamil9132 2011-10-06 22:45
To znaczy nie musisz sprawdzać, bo rysuje tę linię? Czyli co, nie pokazuje bitmapy czy pokazuje, bo już nie rozumiem o co ci chodzi. - stfu 2011-10-06 22:50
Tamto nie pokazuje bitmapy jeżeli jest w if (g_hgracc == true), a to co rysuje linię też jest w if (g_hgracc == true) i rysuje linię, więc nasuwa mi się wniosek że program omija tę cześć kodu która rysuje bitmapę w ponownym wywołaniu WM_PAINT, tylko nie wiem dlaczego tak się dzieje, możesz skompilować ten kod z dodaniem tego if (g_hgracc == true) tam gdzie pisałeś i samemu zobaczyć co się dzieje. - Kamil9132 2011-10-06 22:56

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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