LineTo() + WM_MOUSEMOVE



  • Hey!

    Ich suche einen Weg, um ohne WM_PAINT direkt eine Linie zuzeichnen.

    So soll das ablaufen:

    WM_LBUTTONDOWN: Anfangs-Position speichen
    WM_MOUSEMOVE: Linie von der Anfangs-Position zur aktuellen Maus-Position zeichen

    Also so, als ob man in Paint eine Linie zieht.

    Viele Grüße



  • und wieso probierst dus nicht einfach mal so du muss doch eigenlich nur in einer globalen Variable die Anfangsdaten speichern....
    und zeichnen tust du dann in WM_MOUSEMOVE
    oder du rufst immer be WM_MOUSEMOVE InvalidateRect auf (dass is mit WM_PAINT) ich glaub die Variante find ich schöner:D



  • Hey 🙂

    Also ich suche DEN Weg, dass zu machen.

    Wenn man z.B. nach GetDC(NULL) zeichnet, gehen die Linien auch erst wieder weg, wenn sie von den eigentlichen Elementen wieder übergezeichnet werden. So passiert das auch, wenn man direkt nach den HDC von BeginPaint() zeichnet.

    Die Linie in WM_PAINT zuzeichen könnte ich aus Performance-Gründen gerade noch hinnehmen, aber ich habe noch einen Thread am Laufen, der seinen aktuellen Grafikinhalt selbst verwaltet und so alle 250ms auch direkt nach den HDC von BeginPaint() zeichnet. Das Resultat ist dann eine überzeichnete Linie (solange, bis ich ein WM_MOUSEMOVE überzeichnet).

    Z.B. zieht mal den Arbeitsplatz übern Desktop. Er wird ständig transparent hinter der Maus gezeichnet und da wird ja nie ständig der ganze Desktop neugezeichnet. ^^ So schnell möchte ich das auch machen können. 🙂



  • also die performance vom windows explorer wirst d u mit lineto nie hinbekommen
    aber man kanns ja versuchen


  • Mod

    Das Zeichnen selbst ist doch schnell.
    Wenn ein Fenster über den Desktop oder andere Fenster gezogen wird, dann wird in diesem Bereich sofort ein WM_APINT ausgelöst und das Fenster neu gezeichnet.

    Innerhalb von WM_PAINT zu zeichnen ist also der normale und korrekte Weg.

    Ich verstehe nicht, was Dein anderer Thread damit zu tun hat.
    Wo siehst Du ein Performance Problem?
    Alle 250ms ein Fenster Update durchführen zu lasseen ist doch wirklich kein Hexenwerk.



  • Hmm, ja, dass ist nicht wirklich Hexenwerk aber ich suche einen besseren Weg (ohne neuzeichnen, nur weil ich 'ne kleine Linie zeichnen will).

    Wenn man z.B. in Firefox (Version 3.5) ein Bild zieht, dann wird es transparent und man kann es über andere Fenster ziehen. Das sieht dann so aus:

    http://f.imagehost.org/0045/orange_win.png
    (Mauszeiger wurde nicht mit gescreenshoted ^^)

    Das c-plusplus.net-Logo wird OHNE neuzeichnen über das Fenster gezeichnet. Wie macht Firefox das bloß? Genauso will ich auch gerne mein LineTo() zeichnen.


  • Mod

    Ja und? Das ist ein spezielles Feature dass man mit CreateDragImage erreicht.
    Was willst Du nun damit sagen/fragen?

    Wenn man eine Linie neu zeichnet muss dann muss man eben nur den Auschnitt des Bildes neu zeichnen der ungültig wird. Dieser Bereich ist im Allgemeinen eben ein Rechteck.

    Die OnPaint Routinemuss entsprechend optimiert werden. Aber darauf habeich ja schon hingewiesen.

    Es gibt kein "besseres" Verfahren als in OnPaint/WM_PAINT zu zeichnen... man kann es nur unterschiedlich intelligent machen...


Anmelden zum Antworten