Przechwytywanie naciśnięcia strzałki w górę i dół

0

Witam.
Program ma wyświetlać bitmapę i rysować kursor(inną bitmapę z tekstem) w zależności od ustawień struktury obsługującej pozycję.
Mam problem ponieważ naciśnięcie klawisza w górę po klikukrotnym naciskaniu w dół powoduje jedno więcej przejście klawisza w dół i dopiero potem w górę.

Tu jest kod:

struct pozycje {
    int pos;
    RECT posxy[30];
    wchar_t tablica[30][30];
};
pozycje pozycja;
void LoadScreen(HWND hWnd) {//..} //rysuje tło całej aplikacji
void LoadScreen2(HWND hWnd, RECT rozmiar) {//.. }//rysuje tło kursora i wyświetla napis
void DrawPos(HWND hWnd) {//..}  // wypisuje dane o aktualnej pozycji - dane techniczne

Incjalizowanie struktury:

//w winMain
 hMain = hWnd;
   
   pozycja.pos = 0;

   
   
   int starty=155, stopy=180;

   for (int i = 0; i < 20; i++) {
    
       pozycja.posxy[i].left = 10;
       pozycja.posxy[i].right = 100;
       pozycja.posxy[i].top = starty;
       pozycja.posxy[i].bottom = starty + 25;
       starty += 30;
   }

Problem jest w tym miejscu:

 // Główna pętla komunikatów:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            if ((msg.wParam == VK_DOWN || msg.wParam == VK_UP) && msg.message==WM_KEYDOWN)
            {

                if (msg.wParam == VK_DOWN) {
                    for (int i = 0; i < 19; i++) {
                        if (i < 20) {
                            if (pozycja.pos == i) {
                                LoadScreen(hMain);
                                LoadScreen2(hMain, pozycja.posxy[i]);

                                pozycja.pos++;
                                DrawPos(hMain);
                               
                            }
                        }

                    }
                }
                else {
                        for (int i = 0; i < 20; i++) {
                       
                        if (pozycja.pos == i && i > 0) {
                            LoadScreen(hMain);
                            LoadScreen2(hMain, pozycja.posxy[i]);

                            pozycja.pos--;
                            DrawPos(hMain);
                        

                        }
                   

                    }
                DispatchMessage(&msg); }
            }else{ DispatchMessage(&msg); }
            
            
           
        }

111111a.jpg

Po pierwszym naciśnięciu strzałki(pierwsza rzecz po uruchomieniu programu) w dół pojawiają się takie informacje o strukturze:
(ale kursor jest wyświetlany nie na miejscu 1 tylko zerowym nadal)
111111.jpg

0

Nie wiem, czy w przypadku WinAPI to zadziała, ale proponuję wypisywać przez cout lub cerr informację, który klawisz został naciśnięty, np. słowo "gora" lub "dol", a potem program uruchomić z konsoli, żeby widzieć, co wypisuje.

Wtedy będzie wiadomo, czy problem jest z rozpoznawaniem naciśnięć klawiszy, czy z odpowiednią reakcją na nie.

0
andrzejlisek napisał(a):

Nie wiem, czy w przypadku WinAPI to zadziała, ale proponuję wypisywać przez cout lub cerr informację, który klawisz został naciśnięty, np. słowo "gora" lub "dol", a potem program uruchomić z konsoli, żeby widzieć, co wypisuje.

Wtedy będzie wiadomo, czy problem jest z rozpoznawaniem naciśnięć klawiszy, czy z odpowiednią reakcją na nie.

for (int i = 0; i < 19; i++) {
                        if (i < 20) {
                            if (pozycja.pos == i) {
                                LoadScreen(hMain);
                                LoadScreen2(hMain, pozycja.posxy[i]);

                                pozycja.pos++;
                                DrawPos(hMain);
                               
                            }
                        }}

Problem był w "LoadScreen2(hMain, pozycja.posxy[pozycja.pos]);" - wcześniej miałem pozycja.posxy[i] (zliczał mi kolejne zamiast brać ze struktury dane o położeniu)

for (int i = 0; i < 19; i++) {
                        if (i < 20) {
                            if (pozycja.pos == i) {
                                pozycja.pos++;
                                LoadScreen(hMain,FALSE);
                                
                                LoadScreen2(hMain, pozycja.posxy[pozycja.pos]);

                                
                                DrawPos(hMain);
                                
                                break;

                               
                            }
                        }

                    }

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