[WinAPI] Blokujacy przycisk

0

Witam.

Mam taki problem.Program który pisze, ma sterować ramieniem robota za pomocą klawiatury i wyświetlać ramie w oknie. Grafika jest wyświetlana w osobnym oknie, ale nie robi to różnicy, to samo jak wszystko jest w jednym oknie.

Chodzi o to, że mam przycisk, który przypisuje pewnej zmiennej wartość, na podstawie tej wartości w pętli przetwarzania komunikatów wyświetlam grafikę z linii lub z figur( za pomocą OpenGL). Ale po wciśnięciu guzika reakcja na klawisze chyba wysiada, przynajmniej wcześniej wciskam klawisze i ramie się porusza. Gdy wcisnę przycisk, to "zapada się i nie odbija" i reakcja na klawisze wysiada, mysz jednak działa dalej (bo mysz steruje kamerą). Co może być tego powodem ?

Zauważyłem, że gdy włożę do guzika MessageBox, to po wyświetleniu komunikatu, wciskam OK i wracam do programu gdzie przycisk wygląda normalnie i wszystko działa. Tak jakby się "odbijał".

Co jest nie tak? Muszę coś wysłać, czy co mam źle. Dam niżej definicję przycisków.
( w WinMain);

HWND hPrzyciskCzworokaty = CreateWindowEx(0, "BUTTON", "Figury",
WS_CHILD | WS_VISIBLE,
40, 5,
30, 30,
okno_grafiki, (HMENU)501, hInstance, NULL);

Mam nadzieję, że nie zamieszałem za bardzo, proszę o pomoc, dopiero się uczę.
Pozdrawiam Mrowa.

0

to by sugerowalo, ze kod reakcji na klawisze wpada w jakas nieskonczona petle i w ogole nie wraca do petli obslugi komunikatow.. mysze z kolei moze masz w innym wakut obslugiwana?

0

Wygląda to tak, że mam masakryczny styl programowania, bo to mój pierwszy większy projekt, który nie jest czymś w stylu, sprawdzam czy działa to co sie nauczyłem.

Tutaj Procedura Okienkowa:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        static HDC hDC;              // Kontekst urządzenia
        static HGLRC hRC;            // kontekst tworzenia grafiki
        int staraMyszX, staraMyszY;
        //-------------------------------------------------------------------------------
          
        switch(message)
        {
             case WM_CREATE:
                  hDC = GetDC(hwnd);   // pobiera kontekst urzadzenia dla okna
                  g_HDC = hDC;
                  SetupPixelFormat(hDC);
                  
                  hRC = wglCreateContext(hDC);
                  wglMakeCurrent(hDC, hRC);
                  
                  return 0;
                  break;
                            
             case WM_CLOSE:
                  wglMakeCurrent(hDC, NULL);
                  wglDeleteContext(hRC);
                  CloseHandle(hCom);
                  
                  PostQuitMessage(0);
                  return 0;
                  break;
             
             case WM_COMMAND:
                  if(LOWORD(wParam) == 105)     // Obsluga Menu -> Zakoncz
                  {
                     wglMakeCurrent(hDC, NULL);
                     wglDeleteContext(hRC);
                     PostQuitMessage(0);
                  }
                  if(LOWORD(wParam) == 108)     // Obsluga Menu -> Grafika -> Figury
                  {
                     grafika = FIGURY;
                     CheckMenuItem(Menu, 109, MF_BYCOMMAND |MF_UNCHECKED);
                     CheckMenuItem(Menu, 108, MF_BYCOMMAND |MF_CHECKED);
                     
                  }
                  if(LOWORD(wParam) == 109)     // Obsluga Menu -> Grafika -> Linie
                  {
                     grafika = LINIE;
                     CheckMenuItem(Menu, 108, MF_BYCOMMAND |MF_UNCHECKED);
                     CheckMenuItem(Menu, 109, MF_BYCOMMAND |MF_CHECKED);
                  }
                  
                  if(LOWORD(wParam) == 500)    // Obsluga guzikow trybu graficznego.
                  {                            // Linie
                     
                     grafika = LINIE;
                     MessageBox(NULL, "Grrr", "Co sie stao?", MB_OK);
                  }
             
                  if(LOWORD(wParam) == 501)
                  {                            // Czworokaty
                         
                     grafika = FIGURY;
                  }
                  
                  
                  return 0;
                  break;
             
             case WM_MOUSEMOVE:
                  
                  staraMyszX = MyszX;  // Zapamietuje stare wspolrzedne myszy
                  staraMyszY = MyszY;
                  
                  MyszX = LOWORD(lParam);  // Pobiera nowe wspolrzedne myszy
                  MyszY = HIWORD(lParam);
                     
                  if((MyszX - staraMyszX) > 0)       // mysz przesunięta w prawo
                     myszPrawo = true;
                  else myszPrawo = false; 
                  if((MyszX - staraMyszX) < 0)   // mysz przesunięta w lewo
                     myszLewo = true;
                  else myszLewo = false;
                            
                  if((MyszY - staraMyszY) > 0)       // mysz przesunięta w dół
                     myszDol = true;
                  else myszDol = false;
                  if((MyszY - staraMyszY) < 0)   // mysz przesunięta w górę
                     myszGora = true;
                  else myszGora = false;
          
                  return 0;
                  break;
        
                  
             case WM_LBUTTONDOWN:
                  LPM = true;
                  return 0;
                  break;
                  
             case WM_LBUTTONUP:
                  LPM = false;
                  return 0;
                  break;
             
             case WM_RBUTTONDOWN:
                  PPM = true;
                  return 0;
                  break;
                  
             case WM_RBUTTONUP:
                  PPM = false;
                  return 0;
                  break;
                  
             case WM_KEYDOWN:
                  keyPressed[wParam] = true;
                  return 0;
                  break;
        
             case WM_KEYUP:
                  keyPressed[wParam] = false;
                  return 0;
                  break;
                  
           
                  
             default:
                     break;
        }
    
        return (DefWindowProc(hwnd, message, wParam, lParam));
}

Reakcja na klawisze jest w pętli przetwarzania komunikatów, też wrzucę:

/* Pętla przetwarzania komunikatów */
        while(!done)
        {
             PeekMessage(&msg, NULL, 0 ,0 , PM_REMOVE);
             
             if(msg.message == WM_QUIT)
             {
                done = true;
             }
             else
             {
                 // Reakcja na wciskanie klawiszy - sterowanie ramieniem
                 if(keyPressed['A'])
                 {
                      if(kat_ramienia[0] <= 90.0)
                         kat_ramienia[0]+= predkosc;
                 }
                 if(keyPressed['F'])
                 {
                      if(kat_ramienia[0] >= -90.0)              
                         kat_ramienia[0]-= predkosc;
                 }
                 if(keyPressed['W'])
                 {
                      if(kat_ramienia[1] >= -90.0)              
                         kat_ramienia[1]-= predkosc;
                 }     
                 if(keyPressed['S'])
                 {
                      if(kat_ramienia[1] <= 90.0)              
                         kat_ramienia[1]+= predkosc;
                 }
                 if(keyPressed['E'])
                 {
                      if(kat_ramienia[2] >= -90.0)              
                         kat_ramienia[2]-= predkosc;
                 }     
                 if(keyPressed['D'])
                 {
                      if(kat_ramienia[2] <= 90.0)              
                         kat_ramienia[2]+= predkosc;
                 }
                    if(keyPressed['U'])
                 {
                      if(kat_ramienia[3] >= -90.0)              
                         kat_ramienia[3]-= predkosc;
                 }     
                 if(keyPressed['J'])
                 {
                      if(kat_ramienia[3] <= 90.0)              
                         kat_ramienia[3]+= predkosc;
                 }
                 if(keyPressed['H'])
                 {
                      if(kat_ramienia[4] >= -90.0)              
                         kat_ramienia[4]-= predkosc;
                 }
                 if(keyPressed['L'])
                 {
                      if(kat_ramienia[4] <= 90.0)              
                         kat_ramienia[4]+= predkosc;
                 }
                 if(keyPressed['I'])
                 {
                      if(kat_ramienia[5] >= 0.0)              
                         kat_ramienia[5]-= predkosc;
                 }
                 if(keyPressed['K'])
                 {
                      if(kat_ramienia[5] <= 90.0)              
                         kat_ramienia[5]+= predkosc;
                 }
              
        
                 Ustawienia();
                 Kamera();
                 Rysuj();
                 
                 TranslateMessage(&msg);
                 DispatchMessage(&msg);
             }
             
        }

W funkcji Kamera() sprawdzam te zmienne od myszy: LPM, PPM, myszGora ....

Kompletnie nie wiem co jest, dziwi mnie to zapadniecie sie guzika, a jak jest MessageBox to przechodzę do komunikatu który wywalił i potem jak wrócę do programu to wszystko śmiga i przycisk normalnie wygląda.</quote>

P.S Czy da sie jakoś zrobić suwaki w kodzie, bo nie widzę takiej opcji ?
Pozdrawiam
Mrowa.

0

Jako że mój problem jest dziwny, wymyśliłem inne rozwiązanie. Wiecie pewnie jak to jest, jak ktoś nie ma wystarczających umiejętności to kombinuje tym co ma.

Mianowicie:
Co myślicie o zastosowaniu grafiki+obsługi myszy ? Już wyjaśniam, przyciski to bitmapy(albo kilka guzików na jednej), które są wyświetlane. Wykrywamy czy użytkownik kliknął w zdjęcie przycisku/ czy kursor znajduje się na przycisku itp. poprzez sprawdzanie pozycji kursora.

Czy takie rozwiązanie jest bardzo złe, obciążyło by aplikację dużo bardziej niż zwykłe przyciski z WinAPI. I jak sprawdzać szybkość działania aplikacji, pod kątem optymalizacji, np. zmieniam coś i chcę sprawdzić jak to wpłynęło na szybkość mojego dzieła. Są do tego jakieś programy ?

Pozdrawiam
Mrowa.

0

Czy takie rozwiązanie jest bardzo złe, obciążyło by aplikację dużo bardziej niż zwykłe przyciski z WinAPI

W ten sposób robi się wszystkie niestandardowe kontrolki.

I jak sprawdzać szybkość działania aplikacji[...] Są do tego jakieś programy ?

Są, tylko optymalizacja rysowania buttona to lekka przesada :>

0

Okej, dzięki, to chyba zrobię to właśnie tym 2 sposobem.

A co do optymalizacji guzików to racja :D Ale ogólnie taki program by był fajny :) Pogoogluje sobie kiedyś :)

A co do problemu nr. 1 to dalej aktualne, bo to ciekawy problem, czemu guzik z MessageBox się odznacza, a taki co robi tylko operacje przypisania nie. Tak jakby był ciągle aktywny i robił problemy.

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