Device Context und Graphic Objekt? (Zeichenfläche in Zeichenfläche zeichnen)
-
Hallo ihr,
da die verwendung von VB.NET und C# funktionen /Biblotheken weitgehende identisch sind hab ich folgen Frage:
in der Paint funktion bekomm ich ja eine Referenz auf die Zeichenflache (Dim g as Graphic= ....)
und mächte ich eingene Zeichenflächen mit mehreren Graphic Elementen erstellen, und die dann komplett auf die ZEichenfläche der Paint funktion blasten.
jemand ne Idee?
-
Warum mehrere Graphics-Objekte?
-
ich hab mehre objekte, welche jeweils ein modul representieren. Jedes Modul hat seine eigen parameter, was sich auf die Visualisierung des Moduls auswirkt.
Das heist ich will die die einlene Graphic elemente des Moduls in eine aer container werfen, und dan nur noch in der Paint funktion sagen müssen zeichen Modul x, was alle Graphicelemente des moduls darstellt.
-
Also ein Graphics objekt für ein Control bekommst du am einfachsten mit Control.CreateGraphics(), falls du das meinst.
-
Warum zeichnen die Module nicht in ne Bitmap, das wäre einfacher
Ansonsten wüsste ich nur Graphics.GetDC(), .ReleaseDC() und das aus WinAPI-bekannte BitBlt() über pinvoke, quasi Frickel
-
Merk dir in deinem Modul doch einfach das Rechteck in dem es zeichnen soll / darf.
Dann gibst du deinem Modul noch eine paint Methode, die ein Graphics objekt als parameter übernimmt. Diese rufst du dann in der Paint methode des Controls auf.class Modul { Rectangle bounds; ... public void paint(Graphics g) { //zeichnen } }
in deinem Control rufst du dann die paint Methode der module auf
class Form1 : public Form { ... override void OnPaint(object sender, PaintEventArgs e) { modulX.paint(e.Graphics); } ... }
Mit der Graphics.Clip property kannst du übrigens verhindern, dass du aus deinem Modul "rausmalst".
-
ok das ist ne gute Idee, und klappt auch wunderbar! die paint funktion wird ja immer aufgerufen, wenn was mit dem fenter geschied, also wenn es übermalt wird, oder den fokus bekommst, verschoben wird etc.
nun was kann ich tun das er es nur neu malt, wenn die zeichen fläche durch eine andere fenster überdeckt wird, sodas es nich flattert wenn ich es bspw. verschiebe...
-
Bin mir jetzt nicht ganz sicher, aber irgendwo müsste in den PaintEventArgs (oder im Grapgics object) stehen, welcher Bereich neu gezeichnet wird. Dann einfach prüfen welches modul betroffen ist.
Vielleicht (wahrscheinlich) genügt es aber auch, wenn du die DoubleBuffered Eigenschaft von deinem Control / Form auf true setzt.
-
ich kann die DoubleBuffered Eingeschaft nicht finden! Gibts die überhaubt bei nem CustomControl?
-
Ja, die Eigenschaft ist allerdings protected, deshalb kannst du sie nur in der Klasse selbst setzen und nicht von außen, d.h. wenn du dein Control auf eine Form oder ein anderes Control im Designer ziehst ist die eigenschaft nicht sichtbar. Wenn du dein CustomControl selbst im Designer editierst sollte die Eigenschaft zu sehen sein - sonst einfach im Konstruktor setzen.