An Cursorposition zeichnen (GDI | C)



  • Hallo,

    Was ich zu erreichen versuche, ist das Zeichnen an die Position, an der sich derzeit der Maus-Cursor auf dem Bildschirm befindet.
    Bisher habe ich es geschafft Ein kleines Rechteck an die Position des Zeigers zu zeichnen, was diesen auch 'verfolgt':

    hdc = GetDC(NULL);
         SelectObject(hdc, mybrush);
         Rectangle(hdc, absX, absY, absX+10, absY+10); //absX, absY sind X bzw Y Koordinaten
         ReleaseDC(hdc);
    

    Das ganze befindet sich im WM_MOUSEMOVE Teil der Windows Procedure.
    Problematisch sind hier zwei Dinge (wobei 1. 2. verursacht):

    1. Alle zuvor gezeichneten Rechtecke bleiben erhalten, sodass eine 'Schlange' von
    Rechtecken entsteht.
    2. Das ganze ist extrem langsam und hängt der tatsächlichen Maus-Bewegung hinterher (hoher Zeichenaufwand!)

    Problem 1 hab ich teilweise gelöst, Indem ich folgendes getan habe:

    hdc = GetDC(NULL);
         SelectObject(hdc, mybrush);
         Rectangle(hdc, absX, absY, absX+10, absY+10); 
         InvalidateRect(NULL, rc, TRUE); // rc ist die position des rechtecks, dass  vorhin gezeichnet wurde.
         ReleaseDC(hdc);
    

    Das führt zwar dazu, das nur noch ein Rechteck gezeichnet wird, aber immer gilt Problem 2. Ausserdem verschwindet das rechteck natürlich, wenn ich die Maus nicht bewege.

    Wie kann ich also alles zuvor von in hdc gezeichnete bei jeder neuen Mausbewegung löschen?

    Vielen Dank im Voraus!



  • Du könntest ja ein transparentes Fenster (layered windows) über das Desktop legen, in dem du dann Zeichnest.( am Besten GDI+ verwenden )
    In der Fensterprozedur müsste man halt noch entsprechend auf WM_NCHITTEST reagieren. (oder WS_EX_TRANSPARENT verwenden - da müsste man sich dann aber etwas als WM_MOUSEMOVE-Ersatzt überlegen...)



  • Vielen Dank für den Tipp mit Layered Windows!
    Sobald wie möglich werde ich versuchen damit mein Ziel zu erreichen.
    http://msdn.microsoft.com/en-us/library/ms997507.aspx

    Trotzdem verstehe ich immer noch nicht ganz, warum die gezeichneten Rechtecke bei meinem ersten Versuch noch erhalten bleiben, bzw. wieso es keine (einfachere) Möglichkeit gibt.


Anmelden zum Antworten