Aussetzer beim Bewegen eines Fadenkreuzes mit der Maus (Windows)



  • Hast du dich bereits damit befasst wie draw Funktionen und Loops etc. zum Zeichnen funktionieren?

    Du solltest die Zeichnung nicht über ein mousemove event starten, eher steuern.

    Grüße



  • Ich habe schon mal irgendwo gelesen, dass man eigentlich die OnPaint(..) oder OnDraw(..) Funktionen zur Ausgabe
    und die Maus- oder sonstige Events zum Steuern nehmen sollte.
    Bei mir gibts nur die OnDraw(..). Dort wird die ganze Grafik gezeichnet.
    Bisher war es mir schleierhaft, wie ich die Steuerung über die Events und die Ausgabe in OnDraw machen sollte.
    Momentan weiss ichs immer noch nicht.
    Gibt es da ein Beispiel?

    Grüsse



  • In den Maus- oder Tastaturereignissen stößt du einfach das Neuzeichnen des Steuerelements mittels Invalidate, Refresh oder Repaint (oder wie auch immer die Funktion bzw. Methode genau heißt) an.



  • statt offscreen bitmaps kann man vielleicht paths benutzen: https://msdn.microsoft.com/de-de/library/windows/desktop/dd162779(v=vs.85).aspx



  • Über GDI::Path hatte ich auch schon nachgedacht, hatte es aber dann noch nicht
    verstanden, wie ich es implementieren soll. Bei dem kleinen Strich, den ich da bewege,
    konnte ich mir auch keinen Vorteil errechnen. Aber vielleicht gibts ja
    sogar für diesen Fall dadurch einen Vorteil. Muss ich wohl auch noch drüber nachdenken.

    Momentan scheint mir fast die Sache mit dem "OnDraw()" am plausibelsten.
    Nur zum Ausprobieren muss ich noch etwas Zeit finden.

    Danke an alle!
    und Grüsse



  • Hallo zusammen,

    ich bin nun mal dem Vorschlag nachgegangen, das Zeichnen der Linie in die "OnDraw(..)"-Funktion zu verlagern
    und die Steuerung in den Maus-Events zu belassen.

    Also es wird nun in den Maus-Events nur noch das "InvalidateRect(..)" gemacht, und es wird die Maus-Position für das
    Zeichnen und das anschliessende "InvalidateRect(..)" berechnet.

    Leider hat sich am Ergebnis nichts geändert, ausser dass die Steuerung schwieriger wird, da ich sie nicht mehr so
    leicht mit den anderen Events koordinieren kann.

    Also doch noch die anderen beiden Vorschläge ausprobieren...



  • Nun habe ich die Version mit dem MemoryDC versucht.
    Aber leider funktioniert es bei mir nicht.
    Was mache ich falsch?

    funktionierender Code: (hat aber diese lästigen Aussetzer bei "OnMouseMove()")

    cDc.Attach(GetDC(m_hWnd));
    cPenNormal.CreatePen(PS_SOLID, GRAFIK_PEN_SKALA_STAERKE, RGB(255,100,50));
    cDc.SelectObject(&cPenNormal);
    
    cDc.MoveTo(ptMousePoint.x, sSkala.top);
    cDc.LineTo(ptMousePoint.x, sSkala.bottom);
    

    Das funktioniert nicht: (keine Ausgabe)

    cDc.Attach(GetDC(m_hWnd));
    cPenNormal.CreatePen(PS_SOLID, GRAFIK_PEN_SKALA_STAERKE, RGB(255,100,50));
    cDc.SelectObject(&cPenNormal);
    
    cDcMemory.CreateCompatibleDC(&cDc);
    
    cDcMemory.MoveTo(ptMousePoint.x, sSkala.top);
    cDcMemory.LineTo(ptMousePoint.x, sSkala.bottom);
    
    int iHeight = sSkala.bottom - sSkala.top;
    cDc.BitBlt(ptMousePoint.x, sSkala.top, 1, iHeight, &cDcMemory, ptMousePoint.x, sSkala.top, SRCCOPY);
    


  • ich hab sowas zwar lange nicht gemacht, aber ich glaube du musst eine bitmap in den memory-dc selecten.

    also erst -- https://msdn.microsoft.com/de-de/library/windows/desktop/dd183488(v=vs.85).aspx

    und dann in den memory dc mit -- https://msdn.microsoft.com/de-de/library/windows/desktop/dd162957(v=vs.85).aspx

    danach müsste das blitten gehen.



  • ... Dann muss ich aus meiner primitiven Linie erst ein Bitmap erzeugen, nur um dieses "LineTo()" nicht direkt
    in den Bildschirm zu schreiben, sondern es über eine aufwendige Bild-Konvertierung zuerst umzuwandeln
    und dann den Bilschirmspeicher zu schreiben?

    Das kommt mir von vornherein schon nicht so ganz zielführend für eine Optimierung der Bewegung dieser Linie vor.

    Danke für den Hinweis.



  • stell doch die frage nochmal im winapi unterforum. meine window-gdi-kenntnisse sind ziemlich veraltet.


Anmelden zum Antworten