Problem WinAPI+GDI



  • Hi,

    also ich hab da ein problem bei folgendem code:

    #include <windows.h>
    #include <wingdi.h>
    #define T1 1
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static char szAppName[] = "Name" ;
         HWND        hwnd ;
         MSG         msg ;
         WNDCLASSEX  wndclass ;
    
         wndclass.cbSize        = sizeof (wndclass) ;
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;
         wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;
    
         RegisterClassEx (&wndclass) ;
    
         hwnd = CreateWindow (szAppName, "WinAPI", WS_OVERLAPPEDWINDOW,
    			  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    			  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 iMsg, WPARAM wParam, LPARAM lParam)
    {
         HDC         hdc ;
         PAINTSTRUCT ps ;
         HPEN	 hPen;
    
         int a = 10, b = 10, x = 0;
         switch (iMsg)
              {
               case WM_CREATE:
                    SetTimer(hwnd,T1,1000,NULL);
                    return 0;
    
               case WM_TIMER:
    	       if(wParam==T1 && x < 10)
                    {
                       MessageBox(0,"bvg","gfvb",0);
                       hdc = BeginPaint(hwnd, &ps);
    	          hPen = CreatePen (PS_SOLID, 0, RGB(255,0,0));
                       SelectObject(hdc, GetStockObject(BLACK_BRUSH));
                       SelectObject(hdc, hPen);
                       Rectangle(hdc,a,b,100,100);
                       a+20;
                       b+20;
                       x++;
                       EndPaint(hwnd, &ps);
                       DeleteObject(hPen);
                    }
    
    		        break;
    
               case WM_PAINT:
    
    		        return 0 ;
    
              case WM_DESTROY:
    		       PostQuitMessage (0) ;
    		       KillTimer(hwnd, T1);
    		       return 0 ;
    
             case WM_KEYDOWN:
    
                    break;
    
              }
    
         return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    }
    

    eigentlich soll das program jede sekunde ein Rechteck versetzt einzeichnen (insgesamt 10mal).

    Sieht evtl. jemand meinen Fehler und kann mir helfen? 😕

    Schonmal danke im voraus
    😃



  • Begin-/EndPaint gehört ausschließlich nach WM_PAINT - und sollte dort auch aufgerufen werden, wenn du WM_PAINT abfängst. Bei dem was du machen willst, rufst du einfach in WM_TIMER InvalidateRect auf.



  • In die WM_TIMER Nachricht darfst Du nur das verschieben der Koordinaten packen und dann einfach InvalidateRect aufrufen. Das Zeichnen dann ganz normal in WM_PAINT machen...



  • Cool, schonmal danke für die Hilfe 😃

    aber jetzt hab ich noch eion problem:

    int i = 0;
         int l = 10, r = 60;
         switch (iMsg)
              {
               case WM_CREATE:
                    SetTimer(hwnd,T1,1000,NULL);
                    return 0;
    
               case WM_TIMER:
    		        if(wParam==T1 && i < 10)
                    {
                    RECT myRECT;
                    myRECT.left = l;
                    myRECT.top = 475;
                    myRECT.right = r;
                    myRECT.bottom = 425;
                    InvalidateRect(hwnd, myRECT, false);
                    l += 50;
                    r += 50;
                    i++;
                    }
                    .....
    

    In der Zeile mit der Funktion InvalidateRect() mault mein compiler:

    cannot convert `RECT' to `const RECT*' for argument `2' to `BOOL InvalidateRect(HWND__*, const RECT*, BOOL)'
    

    Hat jemand eine Ahnung wie man RECT konstant machen kann?

    Danke 🙂



  • Entscheidend ist das "*" 😉
    InvalidateRect() möchte gerne einen Zeiger auf myRECT haben:

    RECT myRECT;
    // [..]
    InvalidateRect(hwnd, &myRECT, false);
    


  • Ich würde empfehlen anstelle von "myRECT" einfach "NULL" zu übergeben, da sonst das Zeichnen nicht ganz stimmt!



  • Erstmal vielen dank für die Hilfe, funktionieren aber beide leider nicht so richtig....

    Hat jemand eine Idee an was es sonst liegen kann?

    Danke!



  • Zeigt der Compiler denn immer noch den gleichen fehler an oder ist es jetzt ein anderer?



  • ich würde die variablen erst mal zu static machen!

    static int i = 0;
    statuc int l = 10, r = 60;
    


  • Zeigt der Compiler denn immer noch den gleichen fehler an oder ist es jetzt ein anderer?

    Ne, ich kann des programm schon kompilieren aber des zeichnet kein Rechteck 😕

    ich würde die variablen erst mal zu static machen!

    C/C++ Code:
    static int i = 0;
    statuc int l = 10, r = 60;

    Danke! 😃


Anmelden zum Antworten