Abfrage in einer While



  • hallo Forum,
    ich habe mir da ein programm gebastelt, wo alles mögliche gemixt ist, bin ja halt noch anfänger.

    Nun habe ich mir gedacht, wenn eine taste gedrückt ist, soll eine variable hochgezählt werden, habe dazu dann halt eine while schleife gemacht.

    Nun aber egal was ich mache, sobald die bedingung erfüllt ist, geht die cpu auf 100%, das liegt warscheinlich daran (wenn ich mich jetzt nicht teusche) das die schleife solange ausgeführt wird bis die bedingung erfüllt ist, und das programm sonst nix anderes macht, da aber außerhalb abgefragt wird ob die taste nun gedrückt ist oder nicht, leuft die schleife ja ewig durch.

    nun frage ich mich, wie ich es hin bekomme, das die schleife, also irgent etwas in der schleife abfragt, ob die taste gedrückt ist. Sowas wie ein check, soll halt einfach nur abfragen ob die taste gedrückt ist, habe gehört dazu giebt es einen befehl, aber den kenne ich leider nicht 😞

    Hier ist der code:

    #include <windows.h>
    #include "dwfds.h"
    #include "stdafx.h"
    
    LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
    { 
    
       static RECT   rect;
       static bool   ArrowKeys[4];
       static char     cBuffer[100];
       static int      iActLen;
    
       switch (message)
       {
    
       case WM_SIZE:
          {
             rect.right  = LOWORD(lParam);
             rect.bottom = HIWORD(lParam);
             return 0;
          }
    
         case WM_CHAR:
          {
             switch (wParam)
             {
    
              case '\r':
                iActLen = 0;
                InvalidateRect(hWnd, NULL, TRUE);
                break;
    
             case '\b':
                if (iActLen <= 0)
                   break;
    
                iActLen--;
                InvalidateRect(hWnd, NULL, TRUE);
                break;
    
                      case '\t':
             case '\n':
             case  27 :
                break;
    
     default:
                if (iActLen < sizeof(cBuffer))
                {
                   cBuffer[iActLen++] = wParam;
                   InvalidateRect(hWnd, NULL, FALSE);
                }
                break;
             }
             return 0;
          }
    
     case WM_KEYDOWN:
          {
    
    if (wParam == VK_ESCAPE)
             {
    
                 SendMessage(hWnd, WM_CLOSE, 0, 0);
             }
    
             switch (wParam)
             {
             case VK_LEFT:
    
               ArrowKeys[0] = true;
                break;
    
             case VK_UP:
                ArrowKeys[1] = true;
                break;
    
             case VK_RIGHT:
                ArrowKeys[2] = true;
                break;
    
             case VK_DOWN:
                ArrowKeys[3] = true;
                break;
    
             default:
                return 0;
             }
             InvalidateRect(hWnd, NULL, FALSE);
             return 0;
          }
    
          case WM_KEYUP:
          {
             switch (wParam)
             {
             case VK_LEFT:
                ArrowKeys[0] = false;
                break;
    
             case VK_UP:
                ArrowKeys[1] = false;
                break;
    
             case VK_RIGHT:
                ArrowKeys[2] = false;
                break;
    
             case VK_DOWN:
                ArrowKeys[3] = false;
                break;
    
             default:
                return 0;
             }
             InvalidateRect(hWnd, NULL, FALSE);
             return 0;
         }
       }
    
             int i;
           int b=0;
    
    HANDLE hbitmap = LoadImage(NULL,TEXT(""),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    HDC hdc = GetWindowDC(hWnd);
    HDC hdc_ram = CreateCompatibleDC(NULL);
    
    PAINTSTRUCT ps;
    
     SIZE         size;
    
           char szKeyStatus[40];
             int  iKeyLength;
    
    switch( message ) 
             { 
               case WM_PAINT:     
                 hdc = BeginPaint( hWnd, &ps );
    
             DrawText(hdc, cBuffer, iActLen, &rect,
                              DT_SINGLELINE | DT_VCENTER);
    
           for (int i = 0; i < 4; i++)
             {
                iKeyLength = wsprintf(szKeyStatus, "Pfeil-Taste %i: %i",
                                      i, ArrowKeys[i]);
    
              GetTextExtentPoint32(hdc, szKeyStatus, iKeyLength, &size);
    
                TextOut(hdc, rect.right / 2 - size.cx / 2, rect.bottom / 2 -
                        2 * size.cy + i * size.cy, szKeyStatus, iKeyLength);
    
    int a=ArrowKeys[1];
    
             char  szText [200]; 
     wsprintf (szText,"Hallo, dies ist der Text. %i",a);
     TextOut(hdc, 50, 50, szText, lstrlen (szText)); 
    
     while(ArrowKeys[1]==1)
     {
     }
    
          }
    
     hbitmap = LoadImage (NULL,TEXT("C:\\bild2.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
      hdc_ram = CreateCompatibleDC(NULL);
      SelectObject (hdc_ram, hbitmap);
      BitBlt       (hdc,50,50,100,100,hdc_ram,0,0,SRCCOPY);
      DeleteDC     (hdc_ram);
      DeleteObject (hbitmap);
    
                 EndPaint( hWnd, &ps );
    
               return 0;
    
               case WM_DESTROY:     
                 PostQuitMessage(0);     
               return 0;               
    
               return 0; 
             }
             return DefWindowProc (hWnd, message, wParam, lParam);
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       PSTR szCmdLine, int iCmdShow)
    {
       MSG          msg;
       HWND         hWnd;
       WNDCLASS     wc;
    
       char szAppName[] = "Tastaturabfragen";
    
       wc.cbClsExtra         = 0;
       wc.cbWndExtra         = 0;
       wc.hbrBackground      = (HBRUSH) GetStockObject(WHITE_BRUSH);
       wc.hCursor            = LoadCursor(NULL, IDC_ARROW);
       wc.hIcon              = LoadIcon(NULL, IDI_APPLICATION);
       wc.hInstance          = hInstance;
       wc.lpfnWndProc        = WndProc;
       wc.lpszClassName      = szAppName;
       wc.lpszMenuName       = NULL;
       wc.style              = CS_HREDRAW | CS_VREDRAW;
    
       RegisterClass(&wc);
    
      hWnd = CreateWindow(szAppName,
                TEXT("FullscreenWindow"),
                WS_POPUP,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                NULL,
                NULL,
                hInstance,
                NULL);
    
        // window darstellen und maximieren
        ShowWindow(hWnd, SW_MAXIMIZE);
    
       while (GetMessage(&msg, NULL, 0, 0))
       {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
       }
       return msg.wParam;
    }
    

    habe lieber mal den ganzen code geschickt um sicher zu gehen 🙂

    Und hier ist der bereich wo doe schleife ist:

    for (int i = 0; i < 4; i++)
             {
                iKeyLength = wsprintf(szKeyStatus, "Pfeil-Taste %i: %i",
                                      i, ArrowKeys[i]);
    
              GetTextExtentPoint32(hdc, szKeyStatus, iKeyLength, &size);
    
                TextOut(hdc, rect.right / 2 - size.cx / 2, rect.bottom / 2 -
                        2 * size.cy + i * size.cy, szKeyStatus, iKeyLength);
    
    int a=ArrowKeys[1];
    
             char  szText [200]; 
     wsprintf (szText,"Hallo, dies ist der Text. %i",a);
     TextOut(hdc, 50, 50, szText, lstrlen (szText)); 
    
     while(ArrowKeys[1]==1)
     {
     }
    
          }
    

    in dieser leeren while schleife soll etwas ausgeführt werden, also eine variable soll hochgezählt werden, solange beispielsweise die taste arrowkeys[1] gedrückt ist, also der wert dueser variable 1 ist.

    meine frage ist halt wie lautet der befehl um abzufragen ob die taste gedrückt ist, bzw wie kann man in einer schleife nochmal alle variablen durchgehen lassen?

    Falls ihr mir heflen könnt, könntet ihr mir auch denn befehl, bzw funktion genau erklären ???

    Danke schöööön!

    MfG
    Showball!!



  • Du kannst die Funktion GetAsyncKeyState bzw. GetKeyboardState verwenden.



  • wenn ich das nun in die schleife einfüge sagt der mir das GetKeyboardState neudefiniert wird, wenn ichs dann kompiliere, bekomme cih es auch irgentwie ihin ohne das die fehler medung kommt?

    MfG Showball!



  • Hast Du etwa die Deklaration eingefügt ?!?



  • wie mache ich die denn? wie kann man denn eine funktion dekladieren?



  • wieso nimmst du nicht einfach GetAsyncKeyState?
    dass müsste doch gehen.

    while (GetAsyncKeyState(VK_UP))
    {
        // Mach was...
    }
    


  • oh habe das in der schleife, net in der bedingung gemacht^^

    aber wie mace ich da jetzt eine bedingung in die schleife, muss ich jetzt unbedingt eine if davor setzen?

    Und was ich nicht verstehe, wie kann ich das dann machen das nur diese taste gedrückt ist, weil das ist ja in variablen abgespeichert und das überprüft ja nur ob tasten gedrückt sind, aber wie amche ich jetzt die bedingung, also der überprüft ja ob die obige taste gedrückt ist, und wenn ich eine bedingung mache muss die so ausehen:

    VK_UP = True

    oder vertuhe ich mih jetzt, und wie bekomme ich das danna cu wieder in eine variable?



  • Eine gängige Lösung ist auch, sich ein globales Feld für die Tasten anzulegen:

    bool keys[256];
    

    Jetzt kannst du in der WindowProcedure dieses Feld füllen:

    ...
    case WM_KEYDOWN:
    {
      keys[LOBYTE(wParam)] = true;
    }
    case WM_KEYUP:
    {
      keys[LOBYTE(wParam)] = false;
    }
    ...
    

    und den Tastenstatus in deiner Hauptschleife abfragen:

    while(!keys[VK_ESCAPE])
    {
      if(PeekMessage(&msg, hwnd, 0,0, PM_REMOVE)
      {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
    
      if(keys[VK_LEFT])
      { ... }
    
      if(keys[VK_RIGHT])
      { ... }
    }
    

    (Ich hab das jetzt nicht ausprobiert, das Prinzip sollte aber stimmen)

    Grüße,

    Martin



  • will ja das das wann in der while schleife ist eine variabkle hochgezählt wird, und das sind die pixlangaben im bild, aber wenn nun das bild außerhalb ist also nicht in der shcleife, ändert der das danna uch?



  • wenn ich das nun mache kommt folgender fehler:

    c:\dokumente und einstellungen\dustin.trance\eigene dateien\visual studio 2005\projects\dwfds\dwfds\dwfds.cpp(51) : warning C4244: '=': Konvertierung von 'WPARAM' in 'char', möglicher Datenverlust
    c:\dokumente und einstellungen\dustin.trance\eigene dateien\visual studio 2005\projects\dwfds\dwfds\dwfds.cpp(169) : error C2065: 'keys': nichtdeklarierter Bezeichner
    c:\dokumente und einstellungen\dustin.trance\eigene dateien\visual studio 2005\projects\dwfds\dwfds\dwfds.cpp(169) : fatal error C1903: Weiterverarbeitung nach vorherigem Fehler nicht möglich; Kompilierung wird abgebrochen.

    Ich muss wohl key definieren, aber was soll ich definieren?



  • Hat JimmydaMage doch schon geposted?



  • oh hab das ganz übersehen sry!

    Hmm wie bekomme ich das nunn hin, das die schleife nur alle 0.10 sekunden ausgeführt wird?

    geht das mit dem gaz normalem sleep?


Anmelden zum Antworten