Moin,
wie kann ich trotz DirectX auf dasselbe Fenster zusätzlich mit der GDI zeichnen , ich baue nämlich ein Spiel und das wäre für die Minimap ganz genial , wenn ich diese als Image per DrawImage(...) auf das Device setzen könnte.
Ich Render in der Methode
protected ovveride onPaint(object sender,PaintEventArgs e)
{
Render(); //Render-Methode von DirectX
Draw(e); //Meine Methode für zeichen Operationen
this.Invalidate();
}
Nun ist es aber so , dass ich , wenn ich einfach e.Graphics.DrawImage(Image.FromFile(...),0,0);
aufrufe , das Image auf dem Fenster flackert wie ein Feuer in nem Kamin.
Wie kann ich das ganze Flackerfrei zeichnen?
Hallo Pria,
Stichwort double buffering.
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Ne , klappt nicht , dann flackert das DirectX-device ebenfalls mit.
So intelligent das zu probieren war ich ja auch schon.
Ich hab ne andere Lösung gefunden. Ich hab ein neues Form erstellt und als TopMost definiert , dannach habe ich es genau über meiner Rendering-Form angeordnet und als TransparenceKey die Farbe des Hintergrundes dieser Form definiert.Wenn ich nun auf diesem Form zeichne , was Flackerfrei funktioniert , da hier der DoubleBuffer wieder verwendet werden kann , wird das Image auf dem Transparenten Frame dargestellt und unter diesem wird auf meinem DX-Frame gerendert.
Klappt wunderbar und vor allem flüssig.
Ich gebe zu , dass es nicht die beste Lösung ist , aber durchaus eine funktionale.
Trotzdem danke an alle , die hier helfen wollten.
Du könntest versuchen eine Textur zu erstellen und anschließend davon über die Surface an ein Graphics Objekt zu kommen - dann kannst du auf dieses Zeichnen, und es selbst wiederrum in DX zeichnen.
Bedingung: Die Texture muss nen passendes Texture-Format haben.
Ich denke ich belibe doch bei meiner Lösung , da brauch ich dann nicht wieder in meinem Quellcode rumpfuschen. Trotzdem danke.
Mir ist da bei deinem Code etwas aufgefallen:
this.Invalidate();
in der onPaintmethode ist einfach nicht gut. Damit ruft sich die Paintmethode noch mal selbst auf.
Statt der Textur kann man auch auf den backbuffer zeichnen: Costum GUI - auf dem Gerätekontext pinsel
allerdings muss dann bei jedem Rendern auch der Gdi-teil neu gezeichnet werden.
Das ist schon so recht wirksam , dass garantiert mir eine permanente Aktualität des Gerenderten , da sich die Geschwindigkeit an die FPS-Rate des Rechners anpasst.
(Bei mir zwischen 260 und 560)
Also Invalidate an den falschen Stellen führt bei mir immer zu flackern. Grad vorhin wieder gehabt. In der onpaint methode wird es wohl dazu führen das diese direkt nochmal angeleiert wird, falls invalidate() , das element dieser on paint methode neu zeichnen lässt, wird es wohl ein endloser kreislauf und sich das ganze hochschaukeln bis zum anschlag und es eben dann flackert. Invalidate macht ja nur dann ein Sinn denke ich, wenn das Programm an der Stelle sonst kein Invalidate machen würde oder Invalidate eines bestimmten Bereiches oder Elements oder ohne Childs usw. Aber wenns nu nicht mehr flackert ist ja auch gut.