Hallo,
ich habe mit Hilfe eines Graphicobjektes ein Koordinatensystem erzeugt und ausgegben. Das Funktioniert auch einwandfrei. Öffne ich aber ein neues Fenster oder schalte auf ein anderes Fenster und anschließend auf das Fenster mit dem Graphicobjekt zurück ist dieses vom Bildschirm verschwunden. Wie kann ich das Graphicobjekt an eine Picturebox binden, damit es sichtbar bleibt. Die Variante das Graphicobjekt ständig mit einem Timer neu aufzurufen und neu darzustellen gefällt mir nicht, wenn sich nichts geändert hat.
Könnt ihr mir eine Möglichkeit nennen, wie ich dies Problem lösen kann.
Wäre nett,
Mfg
Frank
Du musst im Paint Event zeichnen, da Dein Fenster ( also auch Deine PicBox ) wieder neu gezeichnet werden, sobald sie verdeckt waren.
Original von Fragender
Ein bisschen genauer bitte!
In dem Ton auf keinen Fall.
Schau in die SDK Doku, nach was Du suchen musst weißt Du ja jetzt.
So war das nicht gemeint,
ich wollte höflich fragen, ob du mir das ein wenig genauer erklären kannst.
Vielen Dank,
MfG
Frank
Hallo Fragender,
das mit dem Paint-Event ist gar nicht nötig. Meines Erachtens richt das nach folgendem:
Bitmap erzeugen (new), mit Graphics.FromImage ein zugehöriges Grahpics-Objekt erzeugen, damit in die Bitmap reinmalen wie gehabt und zum Schluß eine PixtureBox erzeugen (new) und die Bitmap der PictureBox.Image-Eigenschaft zuweisen.
Die PictureBox übernimmt dann alle Aktualisierungs aus den von die genannten Gründen. Nur wenn du später selber was neues in die Bitmap malst, ist ein Picture.Invalidate gefolgt von einem PictureBox.Update nötig.
HTH
herbivore
es will noch nicht richtig funktionieren.
Kannst Du mir eventuell einen kleinen Quellcode schicken bzw. das ganze noch ein bisschen genauer erklären?
Wenn ich es mache, kommt das Bild ganz kurz und verschwindet dann wieder. Sehr seltsam und nervig.
Danke für Deine/eure Mühe
Frank
Hallo Fragender,
Kannst Du mir eventuell einen kleinen Quellcode schicken bzw. das ganze noch ein bisschen genauer erklären?
Dann entscheide ich mich mal für den Quellcode 🙂
using System;
using System.IO;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
//*****************************************************************************
public class Canvas : Form
{
//--------------------------------------------------------------------------
private Bitmap bitmCanvas;
private Graphics graphCanvas;
private PictureBox picbCanvas;
const int iWidth = 600;
const int iHeight = 480;
//==========================================================================
public Canvas ()
{
Control ctrlCurr;
Text = "PictureBox";
Size = new Size (iWidth + Size.Width - ClientSize.Width,
iHeight + Size.Height - ClientSize.Height);
//-----------------------------------------------------------------------
bitmCanvas = new Bitmap (iWidth, iHeight, PixelFormat.Format24bppRgb);
//-----------------------------------------------------------------------
SolidBrush sb = new SolidBrush (Color.LightBlue);
graphCanvas = Graphics.FromImage (bitmCanvas);
graphCanvas.FillRectangle (sb, 0, 0, iWidth, iHeight);
//-----------------------------------------------------------------------
ctrlCurr = picbCanvas = new PictureBox ();
ctrlCurr.Location = new Point (0, 0);
ctrlCurr.Size = new Size (iWidth, iHeight);
((PictureBox)ctrlCurr).Image = bitmCanvas;
ctrlCurr.MouseDown += new MouseEventHandler (CanvasMouseDown);
Controls.Add (ctrlCurr);
}
//==========================================================================
protected void CanvasMouseDown (Object sender, MouseEventArgs me)
{
SolidBrush sb = new SolidBrush (Color.Red);
graphCanvas.FillRectangle (sb, me.X-1, me.Y-1, 3, 3);
picbCanvas.Invalidate (); // der Einfachheit wegen alles invalid setzen
picbCanvas.Update ();
}
}
//*****************************************************************************
abstract class App
{
public static void Main (string [] astrArg)
{
Application.Run (new Canvas ());
}
}
HTH
herbivore
Ich erzeuge eine neues Graphicobject mit
Graphics g = pictureBox1.CreateGraphics();
g.Clear(Color.LightGray);
Anschließend erzeuge ich Punkte mit Points...
und dann zeichne ich mit
g.DrawLines(Pen_Leistung_je_Loch,points);
Kurven in das Koordinatensystem...
Wie kann man es nun realisieren, dass diese Graphic beim Fensterwechsel im der Picturebox bleibt und nicht verloren geht?
Hallo Fragender,
mit dem Code, den ich oben gepostet habe. Also mit einer Bitmap zwischen PictureBox und Graphics.
herbivore
das mit dem Aktualisieren funktioniert noch nicht richtig!
Kannst Du mir da weiterhelfen...
Hallo Fragender,
also noch mal als Basisinformation: In dem Code oben funktioniert die Aktualisierung wie sie soll.
Wenn an die PictureBox eine Bitmap gehängt wird, übernimmt die PictureBox wie gesagt alle Aktualisierungen aufgrund Fensterreihenfolgewechseln, Fensterverschieben u.ä. automatisch.
Nicht aktualisiert wird, wenn du nachträglich (nach der Zuweisung an PictiureBox.Image) in die Bitmap malst. Dann ist anschließend
picbCanvas.Invalidate (); // der Einfachheit wegen alles invalid setzen
picbCanvas.Update ();
fällig.
HTH
herbivore
noch ein Problem:
Wie lösche ich den alten Inhalt der Picturebox??
Danke
Hallo Fragender,
ich verstehe die Frage nicht genau.
Meinst du das Setzen einer Hintergrundfarbe?
SolidBrush sb = new SolidBrush (Color.Irgendwas);
graphCanvas.FillRectangle (sb, 0, 0, iWidth, iHeight);
picbCanvas.Invalidate ();
picbCanvas.Update ();
Oder das gar kein Bild mehr angezeigt werden soll?
picbCanvas.Image = null;
herbivore