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.