fehler im WinAPI code? hmm komisch komisch...



  • Hi,
    ich habe leider ein Problem in meinem Programm. Und zwar tritt nach genau 25 sekunden ein bug auf^^... Naja hab mal nen Timer laufen lassen um rauszufinden ob das immer zur selben Zeit ist.
    Also der Fehler ist das mein Fenster auf mysteriöse Art und Weise maximiert wird.... -.- Dabei verlieren die Objekte ihre Farbe und das Programm laagt wie sau..

    naja hier mal der Quellcode falls ihr da was drin findet..bitte helfen ..

    #define STRICT
    #include <math.h>
    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    #define ID_TIMER_REFRESH_UNTEN 1
    #define ID_TIMER_REFRESH_BALL 2
    #define OBEN ballY   -= speed
    #define UNTEN ballY  += speed
    #define LINKS ballX  -= speed
    #define RECHTS ballX += speed
    
    int iBreiteLinksUnten = 55,   iBreiteRechtsUnten  = 45;
    int iBreiteLinksBall  = 10,   iBreiteRechtsBall   = 10;
    int ballX   = 400,   ballY    = 300;
    int paddleX = 400,   paddleY  = 570;
    int merker  = 0,     i        = 0;
    int speed   = 3;
    
    const char szAppName[]    = "BreakOut";
    
    int WINAPI WinMain(  HINSTANCE hInstance, HINSTANCE hPrevInstance,
    
    {
       HWND       hWnd;
       MSG        msg;
       WNDCLASS   wc;
    
       wc.style               = CS_HREDRAW | CS_VREDRAW;
       wc.lpfnWndProc         = WndProc;
       wc.cbClsExtra          = 0;
       wc.cbWndExtra          = 0;
       wc.hInstance           = hInstance;
       wc.hCursor             = LoadCursor(NULL, IDC_ARROW);
       wc.hIcon               = LoadIcon(NULL, IDI_APPLICATION);
       wc.hbrBackground       = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
       wc.lpszClassName       = szAppName;
       wc.lpszMenuName        = NULL;
    
       RegisterClass(&wc);
    
       hWnd = CreateWindow(   szAppName,
                              szAppName,
                              WS_OVERLAPPED | WS_SYSMENU,
                              100,
                              100,
                              800,
                              600,
                              NULL,
                              NULL,
                              hInstance,
                              NULL);
    
       ShowWindow(hWnd, iCmdShow);
       UpdateWindow(hWnd);
    
       while (GetMessage(&msg, NULL, 0, 0))
       {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
       }
       return msg.wParam;
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
       static RECT rect;
    
       switch (message)
       {
          case WM_CREATE:
          {
             SetTimer(hWnd,ID_TIMER_REFRESH_UNTEN,1,NULL);
             SetTimer(hWnd,ID_TIMER_REFRESH_BALL,1,NULL);
             return 0;
          }
    
          case WM_SIZE:
          {
             rect.right = LOWORD(lParam);
             rect.bottom = HIWORD(lParam);
             return 0;
          }
    
          case WM_PAINT:
          {
             PAINTSTRUCT ps;
             HDC   hDC;
    
             hDC = BeginPaint(hWnd, &ps);
             {
                HBRUSH hOldBrush = (HBRUSH)SelectObject(hDC,
                                  CreateSolidBrush(RGB(0,0,0)));
    
                RoundRect(hDC, paddleX - iBreiteLinksUnten, paddleY  - 10,
                               paddleX + iBreiteRechtsUnten, paddleY + 10, 10, 10);
    
                RoundRect(hDC, ballX - iBreiteLinksBall, ballY -10,
                          ballX + iBreiteRechtsBall, ballY +10, 1000, 1000);
    
                DeleteObject(SelectObject(hDC,hOldBrush));
                return 0;
    
             }
             EndPaint(hWnd, &ps);
          return 0;
          }
    
          case WM_TIMER:
          {
             switch(wParam)
             {
                case ID_TIMER_REFRESH_UNTEN:
                {
                   RECT untenrect;
    
                   untenrect.right   = rect.right;
                   untenrect.bottom  = rect.bottom + 50;
                   untenrect.left    = rect.left;
                   untenrect.top     = rect.top +450;
    
                   InvalidateRect(hWnd, &untenrect, TRUE);
                   break;
                }
    
               case ID_TIMER_REFRESH_BALL:
                {
                   RECT ballRect;
    
                   ballRect.right    =  ballX + 15;
                   ballRect.bottom   =  ballY - 15;
                   ballRect.left     =  ballX - 15;
                   ballRect.top      =  ballY + 15;
    
                   if(i==0) //START
                   {
                      UNTEN;
    
                      if(ballY>=550)
                      {
                         i=1;
                         merker=0;
                      }
    
                   }
                   if(i==1) //UNTEN
                   {
                      if(merker==0)   //ball vom start
                      {
                         RECHTS;OBEN;
                      }
                      if(merker==2)   //ball von links
                      {
                        RECHTS;OBEN;
                      }
                      if(merker==3)   //ball von rechts
                      {
                         LINKS;OBEN;
                      }
                      if(merker==4)   //ball von oben
                      {
                         RECHTS;OBEN;
                      }
    
                         if(ballX<=10)
                         {
                            i=2;
                            merker=1;
                         }
                         if(ballX>=780)
                         {
                            i=3;
                            merker=1;
                         }
                         if(ballY<=10)
                         {
                            i=4;
                            merker=1;
                         }
                   }
                   if(i==2) //LINKS
                   {
    
                      if(merker==1)   //ball von unten
                      {
                         OBEN;RECHTS;
                      }
                      if(merker==3)   //ball von rechts
                      {
                         UNTEN;LINKS;
                      }
                      if(merker==4)   //ball von oben
                      {
                        UNTEN;RECHTS;
                      }
    
                         if(ballY>=550)
                         {
                            i=1;
                            merker=2;
                         }
                         if(ballX>=780)
                         {
                            i=3;
                            merker=2;
                         }
                         if(ballY<=10)
                         {
                            i=4;
                            merker=2;
                         }
                   }
                   if(i==3) //RECHTS
                   {
    
                      if(merker==1)   //ball von unten
                      {
                         OBEN;LINKS;
                      }
                      if(merker==2)   //ball von links
                      {
                         UNTEN;RECHTS;
                      }
                      if(merker==4)   //ball von oben
                      {
                         LINKS;UNTEN;
                      }
    
                         if(ballY>=550)
                         {
                            i=1;
                            merker=3;
                         }
                         if(ballX<=10)
                         {
                            i=2;
                            merker=3;
                         }
                         if(ballY<=10)
                         {
                            i=4;
                            merker=3;
                         }
                   }
                   if(i==4) //OBEN
                   {
    
                      if(merker==1)   //ball von unten
                      {
                         RECHTS;UNTEN;
                      }
                      if(merker==2)   //ball von links
                      {
                         UNTEN;RECHTS;
                      }
                      if(merker==3)   //ball von rechts
                      {
                         LINKS;UNTEN;
                      }
    
                         if(ballY>=550)
                         {
                            i=1;
                            merker=4;
                         }
                         if(ballX<=10)
                         {
                            i=2;
                            merker=4;
                         }
                         if(ballX>=780)
                         {
                            i=3;
                            merker=4;
                         }
                   }
    
                   InvalidateRect(hWnd,&ballRect,TRUE);
                   break;
                }
             }
          }
    
          case WM_KEYDOWN:
          {
             switch(wParam)
             {
                case VK_ESCAPE:
                {
                   SendMessage(hWnd,WM_CLOSE,0,0);
                   return 0;
                }
                case VK_LEFT:
                {
                   if(iBreiteLinksUnten<=380)
                   {
                      iBreiteRechtsUnten -= 20;
                      iBreiteLinksUnten += 20;
                   }
                   return 0;
                }
                case VK_RIGHT:
                {
                   if(iBreiteRechtsUnten<=380)
                   {
                      iBreiteRechtsUnten += 20;
                      iBreiteLinksUnten -= 20;
                   }
                   return 0;
                }
                default:
                return 0;
             }
          }
    
          case WM_DESTROY:
          {
             KillTimer(hWnd,ID_TIMER_REFRESH_UNTEN);
             KillTimer(hWnd,ID_TIMER_REFRESH_BALL);
             PostQuitMessage(0);
             return 0;
          }
       }
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

    Ich hoffe der ist nicht zu lang^^. Naja ist auch leider ohne Kommentare...

    mfg



  • return 0;
    
             }
             EndPaint(hWnd, &ps);
    

    Resource leak: EndPaint wird niemals aufgerufen.



  • cool, danke!
    aber was ich nicht versteh ist, warum das immer nach 25 secunden passiert..?



  • Weil das Leck so lange braucht, bis es Wirkung zeigt?



  • Wenn du dir einen Mega PC anschaffst schaffste evt. aus den 25 sec 3-4 minuten rauszuholen 😃



  • blub32 schrieb:

    Wenn du dir einen Mega PC anschaffst schaffste evt. aus den 25 sec 3-4 minuten rauszuholen 😃

    Nein, schafft er nicht, da die Anzahl der maximal verfügbaren GDI-Handles pro Prozess begrenzt ist. Der Timer lässt die Liste auch auf einem Mega-PC genau so schnell voll laufen (16 KHandles insgesamt, für einen einzigen Prozess daraus nicht mehr als 12 KHandles).



  • aso danke, gut zu wissen.


Anmelden zum Antworten