InvalidateRect() am Desktop



  • Hallo,
    ich bin gerade dabei mit der GDI+ Objekte auf den Desktop zu zeichnen und versuche, diese mit InvalidateRect() wieder zu löschen.

    allerdings reagiert der Desktop auf diese Variante gar nicht:

    RECT rect;
       rect.left=110;
       rect.top=110;
       rect.right=220;
       rect.bottom=220;
       bool success=InvalidateRect(GetDesktopWindow(), &rect , TRUE);
    

    und bei diesem code reagiert er zwar, allerdings wird alles gelöscht:

    InvalidateRect(NUL, NULL, TRUE);
    

    Die Syntax scheint ja zu stimmen, das das programm fehlerfrei kompilert. Woran liegt es dann? Denn offensichtlich scheint der Desktop InvalidateRect() nicht komplett zu ignorieren da er auf die untere Variante ja reagiert.

    oder muss ich eine andere Funktion benutzen um einen Teil des Desktops neu zu zeichnen?

    danke schonmal,
    andi01.



  • Überprüfe mal den Wert, den GetDesktopWindow zurückliefert. Mit NUL funktioniert das, weil der Desktop normalerweise das Windowhandle NUL hat.



  • return value ist true. müsste also gehen.

    mfg,
    andi01.



  • Nein, denn TRUE != NUL. Wie gesagt: Der Deskto phat normalerweise das Handle NUL. Also bezieht sich GetDesktopWindow möglicherweise auf etwas anderes.



  • lol, du hast Recht 😮

    nur mal ne kleine verständnisfrage: es gibt doch nur einen desktop, oder? wie kann sich da getDesktopWindow() auf was anderes beziehen? 😕

    ok, jetzt reagiert der Desktop schonmal 🙂

    allerding wird so der gesamte desktop neu gezeichnet:

    RECT rect;
       rect.left=110;
       rect.top=110;
       rect.right=220;
       rect.bottom=220;
    bool success=InvalidateRect(NULL, &rect , TRUE);
    

    kann ich es noch irgendwie schaffen dass nur das angegebene Rechteck neugezeichnet wird?

    mfg,
    andi01.



  • Hallo.

    http://msdn.microsoft.com/en-us/library/dd145002(VS.85).aspx

    hWnd [in]
    A handle to the window whose update region has changed. If this parameter is NULL, the system invalidates and redraws all windows, and sends the WM_ERASEBKGND and WM_NCPAINT messages to the window procedure before the function returns.

    Du musst also schon das Desktophandle angeben und nicht einfach nur NULL.

    Lg Tobi



  • wie bekomme ich denn dann das richtige Handle (desktop-handle)? mit GetDesktopWindow() scheint es ja nicht zu klappen.

    gibt es eine funktion die mir das passende handle liefert?

    mfg,
    andi01.



  • Also eigentlich sollte das ja funktionieren, was willst du denn nun genau machen, evtl. gibts ja Alternativen.

    Lg Tobi



  • also momentan zeichne ich mit der gdi+ alle möglichen objekte(linien, kreise,...) auf den Desktop. Mein eigentliches Ziel war es diese einzeln wieder löschen zu können, und da es keine vorgefertigte Funktion wie DeleteLine() oder so gibt war die einzige Möglichkeit einen Teil des Desktops neu zu zeichnen.

    die einzige Methode die mir dazu einfällt den Desktop teilweise neu zu zeichnen ist InvalidateRect(), weil man da im 2. Parameter ein neu zu zeichnendes Rechteck angeben kann.

    Allerdings kommt es mir nicht auf die Methode InvalidateRect() an, wie ich das mit dem einzelnen Löschen dann hinkriege ist ja egal, hauptsache es klappt 🙂

    mfg,
    andi01.


  • Mod

    Und warum legst Du kein transparentes Fenster über den Desktop?



  • naja, da die Idee mit InvalidateRect() am Desktop irgendwie nicht richtig funktioniert wird mir sowieso nichts anderes übrig bleiben 🙂

    allerdings habe ich sowas noch nie gemacht... wie kriegt man so ein fenster transparent?

    mfg,
    andi01.



  • ws_ex_layered


Anmelden zum Antworten