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

[C++] [WinAPI] [DirectX 11]Okno "przestaje działać" po naciśnięciu jakiegokolwiek przycisku

Ostatnio zmodyfikowano 2015-05-18 18:31
Autor Wiadomość
TheReclif
Temat założony przez niniejszego użytkownika
[C++] [WinAPI] [DirectX 11]Okno "przestaje działać" po naciśnięciu jakiegokolwiek przycisku
» 2015-05-17 21:56:39
Witam!
Mam problem z programem, a konkretnie z kończeniem pracy przez okno. Założenie jest takie, żeby program po naciśnięciu klawisza Escape wyłączał się(tylko tego przycisku). Niestety, ale po naciśnięciu czegokolwiek(oprócz klawiszy myszki)pojawia się komunikat Windows, że "Program przestał działać". Podejrzewam, że skopałem coś z przechwytywaniem klawiszy, więc daję kod:
C/C++
MSG message;
//Pierdoły związane ze zdarzeniami
WPARAM getActualKey() { return message.wParam; };
A teraz wykorzystanie w pętli komunikatów:
C/C++
//Event NIE jest strukturą MSG! Jest to typ zdarzenia
bool done = false;
while( !done )
switch( Event )
{
case EVENT_TYPE::KeyPressed:
    switch( TaskMgr->getActualKey() )
    {
    case VK_ESCAPE:
        done = true;
        PostQuitMessage( 0 );
        break;
        default:
        break;
    }
    break;
}
//Kod jest okrojony ze zbędnych rzeczy
Jestem w kropce.
P-132438
darko202
» 2015-05-18 10:30:48
nie jestem pewny ale:
1. na początku
// wciśnięcie klawisza (dowolnego)
        case sf::Event::KeyPressed:
http://szymonsiarkiewicz.pl​/zarzadzanie-eventami/


2. potem
switch( TaskMgr->getActualKey() )
czyli zawsze się wykonuje metoda

a ponieważ
WPARAM getActualKey() { return message.wParam; };

to prawdopodobnie stąd masz opisywany komunikat

3
na
http://cpp0x.pl/kursy​/Kurs-WinAPI-C++/Zaawansowane​/MDI/200

widzę
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
...
return messages.wParam;
}
? czym jest messages.wParam 

4. na
https://msdn.microsoft.com​/pl-pl/library​/system.windows.forms.message.w​param(v=vs.110).aspx​?cs-save-lang=1​&cs-lang=cpp#code-snippet-1

Wartość tego pola zależy od wiadomości. Użyj WParam pola, aby uzyskać informacje, które są ważne do obsługi wiadomości. To pole jest zwykle używany do przechowywania niewielkich fragmentów informacji, takich jak flagi.

czyli
case VK_ESCAPE:
chyba odczytujesz z powietrza

5.
? gdzie to pole jest wypełniane
nie widać z zaprezentowanego kodu, ale gdzieś program wypełnia
nie widać aby zaprezentowany kod to zmieniał

stąd prawdopodobnie ten stały komunikat



6
pobadaj ten kod w trybie debag i zobacz co zawierają obiekty i jak się zmieniają



P-132457
TheReclif
Temat założony przez niniejszego użytkownika
» 2015-05-18 18:31:17
Wielkie dzięki za pomoc. Błąd tkwił gdzie indziej:
Jak było:
C/C++
HWND * win = new HWND;
void windowClass::deleteWin()
{
    ShowCursor( true );
    if( fullscreen )
    {
        ChangeDisplaySettings( NULL, 0 );
    }
    delete win;
    win = NULL;
   
    UnregisterClass( winClassName, GetModuleHandle( NULL ) );
}
Jak zmieniłem(i działa!):
C/C++
HWND * win = new HWND;
void windowClass::deleteWin()
{
    ShowCursor( true );
    if( fullscreen )
    {
        ChangeDisplaySettings( NULL, 0 );
    }
    DestroyWindow( * win ); //Nie było tego
    delete win;
    win = NULL;
   
    UnregisterClass( winClassName, GetModuleHandle( NULL ) );
}

Zapomniałem niszczyć okna. Temat zamykam.
P-132465
« 1 »
  Strona 1 z 1