UpdateWindow scheint keine Auswirkung zu haben



  • Liebe c-plusplus-Gemeinde,

    Ich bin was WinAPI betrifft noch relativ neu und versuche gerade eine Anwendung zu schreiben, die in regelmäßigen Abständen von einem Timer die Funktion UpdateWindow aufruft. Hier ein Ausschnitt aus meinem Code:

    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        HDC hDC;
        PAINTSTRUCT Ps;
        long xpos=10;
    
        switch(msg)
        {
            case WM_CREATE:
            SetTimer(hwnd, 36, 5000, NULL);
            break;
            case WM_TIMER:
            switch(wParam){
                case 36: xpos+=10;
                UpdateWindow(hwnd);
            }
            break;
            case WM_PAINT:
            hDC = BeginPaint(hwnd, &Ps);
    
            SetPixel(hDC, xpos, 10, RGB(255,0,0));
    
            EndPaint(hwnd, &Ps);
            break;
    

    Jede Sekunde sollte der Timer UpdateWindow aufrufen, wodurch WM_PAINT den roten Punkt immer weiter nach rechts rückt.
    Der Timer funktioniert, das hab ich mit einer MessageBox getestet, auch der WM_PAINT funktioniert, da der erste rote Punkt gezeichnet wird. Danach ändert sich aber nichts mehr, der Punkt bleibt wo er ist.
    Es scheitert also offenbar daran, dass das Fenster gar nicht geupdatet wird.
    Warum?

    Vielen Dank für eure Antworten!

    LG
    Michi



  • msdn schrieb:

    The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT message to the window if the window's update region is not empty

    Ruf einfach vor UpdateWindow die InvalidateRect() Funktion auf:
    http://msdn.microsoft.com/en-us/library/dd145002(v=VS.85).aspx



  • InvalidateRect hat leider auch nichts gebracht. Der rote Punkt bleibt weiterhin an der selben Stelle.



  • Mach

    long xpos=10;
    

    zu:

    static long xpos=10;
    

    Die Variable xpos wird sonst jedesmal beim Betreten der WndProc neu initialisiert.
    http://tutorial.schornboeck.net/static.htm



  • Das war's, vielen Dank!


Anmelden zum Antworten