Graphics.DrawImage(..



  • Hallo,

    ich verwende momentan eine Bitmap um mir einige Messdaten anzeigen zu lassen.

    Kann ich "Graphics.DrawImage(.." dazu veranlassen, dass es mir lediglich
    das neu malt, was sich geändert hat ??

    Momentan habe ich eine Methode

    draw_last_element_dot(..)
    {
        /// über graphics in Bitmap malen
    
        Invalidate(); /// Alles neu malen
    }
    

    Im PaintEvent male ich dann die Bitmap nach einer Matrizentransformation...
    Wenn ich draw_last_element_dot(..) aufrufe, würde ich gerne lediglich einen neuen
    Punkt malen, ohne gleich die ganze Bitmap neuzeichnen zu müssen.

    Gruß



  • Und was hinter Dich daran lediglich einen Punkt zu zeichnen?



  • Also es gibt eben zwei sachen, welche sich von der Geschwindigkeit sehr unterscheiden beim zeichnen.

    Das eine ist, wenn ich einfach auf den Bildschirm male, und genau ein Datum dazu kommt.

    Das andere ist, wenn ich das Fenster verschiebe, zoome etc. und alles neu malen muss.

    Beim neu malen würde sich ein Bitmap anbieten, oder eben für jede Kurve ( ich zeichne funktionen ) ein GraphicsPath.
    Alles neu zeichnen für ein einzelnes Datum ist aber viel zu viel.

    Dann würde ich gerne die Matrizenmanipulationen von C# benutzen, da diese aller wahrscheinlichkeit nach auf die Grafikkarte ausgelagert werden könne.
    Hoffe zumindest dass das C# so macht.

    Ich würde sowohl MODELVIEW transformations benötigen (jene welche genau eine kurve transformieren), als auch
    welche die die ganze Welt transformieren.

    Dadurch dass das problem so generell ist, dass es permanent auftritt, erwarte ich nach meinem bisherigen Kenntnissen über C# eine existierende Lösung....
    wie sie DirectX oder openGL haben.
    Oder ich erwarte eben von den C#-Wrapperfunktionen eine Verbesserung, und keinen Rückschritt...

    Zum Beispiel eine Funktion mit welcherman nur das letzte Element eines GraphicsPath malt oder so.... Oder nur jenes, welche beim letzten malen nciht gezeichnet wurde....



  • getLastPoint 🙂 Made my day... EDIT: Doch nicht 😞



  • Auch wenn Du mich jetzt wieder schlägst... Genau unter dem Aspekt solcher komplexen Zeichensachen habe ich auf die WPF hingewiesen weil man dort diese Zeichenoperationen mit vollen Hardwareunterstützung bekommt. WPF basiert auf DirectX, Windows.Forms auf GDI.

    Schau Dir mal das Video

    http://channel9.msdn.com/Blogs/AdamKinney/WPF-35-SP1-Graphics-with-David-Teitlebaum

    an, speziell den Teil mit den Memory-Bitmaps (ca ab min 16:30) wo in Echtzeit Audio-Daten (Spektrumanalyse) dargestellt werden.



  • Hi loks 🙂

    danke für den Hinweis....
    kommt mir ziemlich vermurxt rein...
    Das hätte ich nie erwartet. Wenn die ihre Forms schnittstelle ordentlich definiert haben, müßten sie die auf DirectX umstellen können und zwar ohne Probleme.....

    Gruß



  • AlexanderKiebler schrieb:

    Das hätte ich nie erwartet. Wenn die ihre Forms schnittstelle ordentlich definiert haben, müßten sie die auf DirectX umstellen können und zwar ohne Probleme.....

    Gruß

    Windows.Forms ist nichts weiter als ein Wrapper um die Win-API die wiederum vor ca 15 Jahren definiert wurde, lange bevor es DirectX überhaupt gab. Da hängen soviele Altlasten drin das eine Umstellung schlicht unmöglich ist. Daher ist die WPF auch eine komplette Neuentwicklung from Scratch.



  • Hallo AlexanderKiebler,

    zu deiner Eingangsfrage:
    du kannst bei der Invalidate-Methode auch einen Bereich angeben, d.h.

    Rectangle rect = new Rectangle(x, y, w, h);
    Invalidate(rect);
    

    Nun zeichnest du im Paint-Event ganz normal alle Punkte - durch das Clipping wird jedoch nur der Clippingbereich (e.ClipRectangle) wirklich neu gezeichnet.


Log in to reply